2011-07-30 10 views
5

Nie mogę uruchomić BorderLayout. Chcę, aby przycisk cancel był umieszczony na dole, ale to nie działa. Kod:BorderLayout nie działa

import java.awt.BorderLayout; 

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.ButtonModel; 
import javax.swing.ButtonGroup; 
import javax.swing.JButton; 
import javax.swing.JDialog; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JRadioButton; 

class Test { 
    public static JFrame owner; 
    public static void main(String[] args) { 
     final JDialog frame = new JDialog(owner, "Test"); 
     frame.setLayout(new BorderLayout()); 
     frame.setSize(500, 300); 
     final JPanel panel = new JPanel(); 
     final ButtonGroup group = new ButtonGroup(); 
     String[] options = {"1", "2", "3"}; 
     for (String text : options) { 
      JRadioButton option = new JRadioButton(text); 
      option.setActionCommand(text); 
      group.add(option); 
      panel.add(option); 
     } 
     JButton okButton = new JButton("OK"); 
     okButton.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       ButtonModel selectedModel = group.getSelection(); 
       if (selectedModel != null) { 
        System.err.println(selectedModel.getActionCommand()); 
       } 
      } 
     }); 
     panel.add(okButton); 
     JButton cancelButton = new JButton("Cancel"); 
     cancelButton.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       frame.setVisible(false); 
       frame.dispose(); 
      } 
     }); 
     panel.add(cancelButton, BorderLayout.SOUTH); 
     frame.add(panel); 
     frame.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 
     frame.setVisible(true); 
    } 
} 

Odpowiedz

6

Można spróbować zmienić

panel.add(cancelButton, BorderLayout.SOUTH); 

do

frame.add(cancelButton, BorderLayout.SOUTH); 

Wynik:

enter image description here

+0

@Tyilo: To jest poprawna odpowiedź, 1+. Jeśli to nie spełnia twoich wymagań, powinieneś opublikować obraz tego, jak chcesz wyglądać GUI, tak jak zrobił to użytkownik 802421. –

+0

Uwielbiam zrzut ekranu! Aby uzyskać wskazówki na temat ulepszenia, zobacz [Jak utworzyć zrzut ekranu, aby zilustrować post?] (Http://meta.stackexchange.com/questions/99734/how-do-i-create-a-screenshot -to-illustrate-a-post). –

8

dodać CancelButton do panelu przy użyciu stałej BorderLayout.SOUTH:

panel.add(cancelButton, BorderLayout.SOUTH); 

Ale gdzie ustawić układ panelu, aby być BorderLayout? Ponieważ nigdy nie ustawisz układu tego kontenera, użyje on domyślnego układu dla JPanel, który jest FlowLayout.

Rozwiązanie: ustaw układ panelu JPanel na BorderLayout, aby uzyskać zachowanie BorderLayout.

Po rozwiązać ten problem, musisz inny problem choć:

for (String text : options) { 
    JRadioButton option = new JRadioButton(text); 
    option.setActionCommand(text); 
    group.add(option); 
    panel.add(option); 
    } 

Ty dodanie JRadioButton do tych samych JPanel panelowych bez względu na układ. Podejrzewam, że chcesz dodać JRadioButtons do własnego JPanela, prawdopodobnie takiego, który używa GridLayout(1, 0) lub GridLayout(0, 1), w zależności od pożądanej orientacji, a następnie, że chcesz dodać ten JPanel do panelu, być może w pozycji BorderLayout.CENTER.

Masz również podobny problem z okButton, dodając go do panelu bez względu na układ.

+0

przegłosowałeś ciebie, nie chciałeś niczego ukraść;) – Jack

+0

@jack: Dzięki, ale nie "kradniesz" niczego. i ditto w sprawie oddania głosu. ;) –

3

Jak Poduszkowiec Pełna węgorzy mówi JPanel domyślne zachowanie jest FlowLayout, która jest najprostsza, a to opisane here. Można łatwo zmienić to do kierownika trzeba określając go wewnątrz konstruktora:

panel = new JPanel(new BorderLayout()) 
+0

-1, ponieważ poduszkowiec już wspomniał o FlowLayout jest domyślny, dlatego nie ma potrzeby duplikowania odpowiedzi. Jeśli chcesz podkreślić ten punkt, możesz w swoim odpowiedzi napisać komentarz. – camickr

+0

Właściwie to nie oświadczył, dodał go jako edycję. Czy powinienem być prekogniskiem? :) – Jack

+0

Co? Zaczynasz anwer z "As Hovercraft says ...", więc komentarz był oczywiście tam, Jeśli potrzebujesz więcej potwierdzenia, kliknij na link obok etykiety "edytowane" i przewiń na dół, gdzie znajdziesz oryginalny wpis, który NIE został zmieniony w odniesieniu do komentarza FlowLayout – camickr