2010-03-29 17 views
23

Ho messo i miei bottoni in un JPane con GridLayout. Quindi ho inserito JPanel in un altro JPanel con BoxLayout.Y_AXIS. Voglio che i pulsanti di GridLayout siano quadrati. Io uso tmp.setSize (30,30) e non funziona. Cerco anche di usare new GridLayout(X, Y, 4, 4) ma non riesco a capire cosa siano X e Y. Quindi, qual è il modo corretto di fare questa roba?Come posso impostare la dimensione di un pulsante?

aggiunto:

io ancora non riesco a risolvere il problema. Ecco il codice di quello che sto cercando di fare:

import javax.swing.*; 
import java.awt.*; 

public class PanelModel { 
    public static void main(String[] args) { 
     JFrame frame = new JFrame("Colored Trails"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel mainPanel = new JPanel(); 
     mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); 

     JPanel firstPanel = new JPanel(); 
     firstPanel.setLayout(new GridLayout(4, 4)); 
     JButton btn; 
     for (int i=1; i<=4; i++) { 
      for (int j=1; j<=4; j++) { 
       btn = new JButton(); 
       btn.setPreferredSize(new Dimension(100, 100)); 
       firstPanel.add(btn); 
      } 
     } 

     JPanel secondPanel = new JPanel(); 
     secondPanel.setLayout(new GridLayout(5, 13)); 
     for (int i=1; i<=5; i++) { 
      for (int j=1; j<=13; j++) { 
       btn = new JButton(); 
       btn.setPreferredSize(new Dimension(40, 40)); 
       secondPanel.add(btn); 
      } 
     } 

     mainPanel.add(firstPanel); 
     mainPanel.add(secondPanel); 
     frame.add(mainPanel); 

     frame.setSize(400,600); 
     frame.setVisible(true); 
    } 
} 

Il problema è che Java cerca di rendere la larghezza della firstPanel e secondPanel uguali! Inoltre, Java tenta di riempire tutta l'altezza della finestra. Come posso rimuovere questo comportamento?

risposta

28

Il seguente bit di codice fa quello che chiedi. Basta fare in modo di assegnare uno spazio sufficiente in modo che il testo sul pulsante diventa visibile

JFrame frame = new JFrame("test"); 
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
JPanel panel = new JPanel(new GridLayout(4,4,4,4)); 

for(int i=0 ; i<16 ; i++){ 
    JButton btn = new JButton(String.valueOf(i)); 
    btn.setPreferredSize(new Dimension(40, 40)); 
    panel.add(btn); 
} 
frame.setContentPane(panel); 
frame.pack(); 
frame.setVisible(true); 

X e Y (due primi parametri del costruttore GridLayout) specificare il numero di righe e colonne nella griglia (rispettivamente) . Puoi lasciare uno di questi come 0 se vuoi che quel valore sia illimitato.

Modifica

Ho modificato il codice fornito e ritengo ora conforme a quanto desiderato:

JFrame frame = new JFrame("Colored Trails"); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

JPanel mainPanel = new JPanel(); 
mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); 

JPanel firstPanel = new JPanel(); 
firstPanel.setLayout(new GridLayout(4, 4)); 
firstPanel.setMaximumSize(new Dimension(400, 400)); 
JButton btn; 
for (int i=1; i<=4; i++) { 
    for (int j=1; j<=4; j++) { 
     btn = new JButton(); 
     btn.setPreferredSize(new Dimension(100, 100)); 
     firstPanel.add(btn); 
    } 
} 

JPanel secondPanel = new JPanel(); 
secondPanel.setLayout(new GridLayout(5, 13)); 
secondPanel.setMaximumSize(new Dimension(520, 200)); 
for (int i=1; i<=5; i++) { 
    for (int j=1; j<=13; j++) { 
     btn = new JButton(); 
     btn.setPreferredSize(new Dimension(40, 40)); 
     secondPanel.add(btn); 
    } 
} 

mainPanel.add(firstPanel); 
mainPanel.add(secondPanel); 
frame.setContentPane(mainPanel); 

frame.setSize(520,600); 
frame.setMinimumSize(new Dimension(520,600)); 
frame.setVisible(true); 

Fondamentalmente ora a impostare la dimensione preferita dei pannelli e la dimensione minima per il telaio.

+0

Ho provato questo codice. Funziona. Ma se provo a implementare la stessa idea nel mio programma, non funziona. Penso che la ragione è che includo il mio JPanel (con GridLayout) in un altro JPanel (con BoxLayout.Y_AXIS). – Roman

+0

@Roman Se vuoi aiuto più specifico devi inserire un codice di esempio! – Kris

+0

come richiesto, ho pubblicato il codice. – Roman

5

Provare con setPreferredSize anziché setSize.

UPDATE:GridLayout occupare tutto lo spazio nel suo contenitore, e BoxLayout cuciture a prendere tutta la larghezza nel suo contenitore, così ho aggiunto po 'di colla-pannelli che sono invisibili e solo occupano spazio quando l'utente si estende il finestra. L'ho appena fatto orizzontalmente, e non verticalmente, ma potresti implementarlo nello stesso modo se lo vuoi.

Poiché GridLayout rende tutte le celle della stessa dimensione, non importa se hanno una dimensione specificata. Devi invece specificare una dimensione per il suo contenitore, come ho fatto io.

import javax.swing.*; 
import java.awt.*; 

public class PanelModel { 
    public static void main(String[] args) { 
     JFrame frame = new JFrame("Colored Trails"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel mainPanel = new JPanel(); 
     mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); 

     JPanel firstPanel = new JPanel(new GridLayout(4, 4)); 
     firstPanel.setPreferredSize(new Dimension(4*100, 4*100)); 
     for (int i=1; i<=4; i++) { 
      for (int j=1; j<=4; j++) { 
       firstPanel.add(new JButton()); 
      } 
     } 

     JPanel firstGluePanel = new JPanel(new BorderLayout()); 
     firstGluePanel.add(firstPanel, BorderLayout.WEST); 
     firstGluePanel.add(Box.createHorizontalGlue(), BorderLayout.CENTER); 
     firstGluePanel.add(Box.createVerticalGlue(), BorderLayout.SOUTH); 

     JPanel secondPanel = new JPanel(new GridLayout(13, 5)); 
     secondPanel.setPreferredSize(new Dimension(5*40, 13*40)); 
     for (int i=1; i<=5; i++) { 
      for (int j=1; j<=13; j++) { 
       secondPanel.add(new JButton()); 
      } 
     } 

     JPanel secondGluePanel = new JPanel(new BorderLayout()); 
     secondGluePanel.add(secondPanel, BorderLayout.WEST); 
     secondGluePanel.add(Box.createHorizontalGlue(), BorderLayout.CENTER); 
     secondGluePanel.add(Box.createVerticalGlue(), BorderLayout.SOUTH); 

     mainPanel.add(firstGluePanel); 
     mainPanel.add(secondGluePanel); 
     frame.getContentPane().add(mainPanel); 

     //frame.setSize(400,600); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 
+0

Il compilatore scrive che non è possibile trovare il metodo chiamato "setPreferredSize". – Roman

2

GridLayout spesso non è la scelta migliore per i pulsanti, anche se potrebbe essere per l'applicazione. Un buon riferimento è lo tutorial on using Layout Managers. Se guardi l'esempio di GridLayout, vedrai i pulsanti sembrare un po 'sciocchi, troppo grandi.

Un'idea migliore potrebbe essere quella di utilizzare un FlowLayout per i pulsanti, o se si sa esattamente cosa si desidera, forse un GroupLayout. (Sun/Oracle recommend il layout di GroupLayout o GridBag è migliore di GridLayout quando si digita manualmente.)

Problemi correlati