2010-03-29 13 views
23

Umieściłem moje guziki w JPane z GridLayout. Następnie umieszczam JPanel w innym JPanelu z BoxLayout.Y_AXIS. Chcę, żeby przyciski w GridLayout były kwadratowe. Używam tmp.setSize (30,30) i to nie działa. Próbuję też użyć new GridLayout(X, Y, 4, 4), ale nie mogę zrozumieć, czym są X i Y. A więc, jaki jest właściwy sposób na zrobienie tego?Jak ustawić rozmiar przycisku?

DODANO:

ja wciąż nie może rozwiązać ten problem. Oto kod, co staram się robić:

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); 
    } 
} 

Problemem jest to, że Java próbuje uczynić szerokość firstPanel i secondPanel równy! Co więcej, Java próbuje wypełnić całą wysokość okna. Jak mogę usunąć to zachowanie?

Odpowiedz

28

Poniższy fragment kodu spełnia to, o co prosisz. Wystarczy upewnić się, że można przypisać wystarczająco dużo miejsca, aby tekst na przycisku staje się widoczna

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 i Y (dwa pierwsze parametry konstruktora GridLayout) określa liczbę wierszy i kolumn w siatce (odpowiednio) . Możesz zostawić jedną z nich jako 0, jeśli chcesz, aby ta wartość była nieograniczona.

Edit

Mam zmodyfikowany dostarczonego kodu i wierzę, że teraz jest zgodny z tym co jest pożądane:

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); 

Zasadniczo mam teraz ustawić preferowany rozmiar paneli i minimalny rozmiar dla ramy.

+0

Próbowałem tego kodu. To działa. Ale jeśli spróbuję wdrożyć ten sam pomysł w moim programie, to nie działa. Myślę, że to dlatego, że dołączam mój JPanel (z GridLayout) do innego JPanela (z BoxLayout.Y_AXIS). – Roman

+0

@Roman Jeśli potrzebujesz bardziej szczegółowej pomocy, musisz opublikować przykładowy kod! – Kris

+0

zgodnie z życzeniem, wysłałem kod. – Roman

5

Spróbuj z setPreferredSize zamiast z setSize.

UPDATE:GridLayout zajmują całą przestrzeń w pojemniku, a BoxLayout szwy, aby zająć całą szerokość w kontenerze, więc dodałam trochę kleju paneli, które są niewidoczne i tylko zajmują miejsce, gdy użytkownik naciąga okno. Właśnie zrobiłem to w poziomie, a nie w pionie, ale możesz to zaimplementować w ten sam sposób, jeśli chcesz.

Po wykonaniu wszystkie komórki w tym samym rozmiarze, nie ma znaczenia, czy mają określony rozmiar. Musisz podać rozmiar dla swojego kontenera, tak jak ja to zrobiłem.

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

Kompilator pisze, że nie może znaleźć metody o nazwie 'setPreferredSize'. – Roman

2

GridLayout często nie jest najlepszym wyborem dla przycisków, chociaż może być odpowiedni do zastosowania. Dobrym odniesieniem jest tutorial on using Layout Managers. Jeśli spojrzysz na przykład GridLayout, zobaczysz, że przyciski wyglądają trochę głupio - za duże.

Lepszym pomysłem może być skorzystanie z FlowLayout dla twoich przycisków lub jeśli wiesz dokładnie, czego chcesz, być może GroupLayout. (Sun/Oracle recommend, że układ GroupLayout lub GridBag jest lepszy niż GridLayout podczas ręcznego kodowania.)

Powiązane problemy