2013-06-20 31 views
6

muszę zrobić to dla szkoły:Jak mogę dokonać rozpiętości komponentach wiele komórek w GridBagLayout

GUI

Jest to kod mam tak daleko:

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

public class AddressBookGui1 extends JFrame { 
public AddressBookGui1(){ 

    GridBagLayout gbl = new GridBagLayout(); 
    GridBagConstraints gbc = new GridBagConstraints(); 
    setLayout(gbl); 

    JLabel label; 
    JButton button; 
    JTextField textField; 
    JTextArea textArea = new JTextArea(10, 20); 

    gbc.weightx = 1; 
    label = new JLabel("text"); 
    gbc.fill = GridBagConstraints.HORIZONTAL; 
    gbc.gridx = 0; 
    gbc.gridy = 0; 
    add(label ,gbc); 

    textField = new JTextField(); 
    gbc.weightx = 1; 
    gbc.fill = GridBagConstraints.HORIZONTAL; 
    gbc.gridx = 1; 
    gbc.gridy = 0; 
    add(textField ,gbc); 

    label = new JLabel("text"); 
    gbc.weightx = 1; 
    gbc.fill = GridBagConstraints.HORIZONTAL; 
    gbc.gridx = 0; 
    gbc.gridy = 1; 
    gbc.gridwidth = 1; 
    add(label ,gbc); 

    textField = new JTextField(); 
    gbc.weightx = 1; 
    gbc.fill = GridBagConstraints.HORIZONTAL; 
    gbc.gridx = 1; 
    gbc.gridy = 1; 
    gbc.gridwidth = 2; 
    add(textField, gbc); 

    label = new JLabel("text"); 
    gbc.weightx = 1; 
    gbc.fill = GridBagConstraints.HORIZONTAL; 
    gbc.gridx = 0; 
    gbc.gridy = 2; 
    gbc.gridwidth = 1; 
    add(label ,gbc); 

    textField = new JTextField(); 
    gbc.weightx = 1; 
    gbc.fill = GridBagConstraints.HORIZONTAL; 
    gbc.gridx = 1; 
    gbc.gridy = 2; 
    gbc.gridwidth = 2; 
    add(textField, gbc); 

    label = new JLabel("text"); 
    gbc.weightx = 1; 
    gbc.anchor = GridBagConstraints.FIRST_LINE_START; 
    gbc.fill = GridBagConstraints.HORIZONTAL; 
    gbc.gridx = 0; 
    gbc.gridy = 3; 
    gbc.gridwidth = 1; 
    add(label ,gbc); 



    gbc.weightx = 1; 
    gbc.fill = GridBagConstraints.HORIZONTAL; 
    gbc.anchor = GridBagConstraints.CENTER; 
    gbc.gridwidth = 2; 
    gbc.gridx = 1; 
    gbc.gridy = 3; 

    add(textArea, gbc); 

    gbc.weightx = 1; 
    button = new JButton("text"); 
    gbc.fill = GridBagConstraints.HORIZONTAL; 
    gbc.gridwidth = 1; 
    gbc.gridx = 0; 
    gbc.gridy = 4; 
    add(button ,gbc); 

    gbc.weightx = 1; 
    button = new JButton("text"); 
    gbc.fill = GridBagConstraints.HORIZONTAL; 
    gbc.gridx = 3; 
    gbc.gridy = 4; 
    add(button ,gbc); 



} 
public static void main(String[] args){ 
    AddressBookGui1 frame = new AddressBookGui1(); 
    frame.setTitle("Address Book"); 
    frame.setSize(400, 300); 
    frame.setLocationRelativeTo(null); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 
} 

} 

This is the result

(Nadal muszę radzić sobie z wyściółką i wypustkami.) Zdobyłem je do pracy w znacznie prostszym programie, więc myślę, że mam do czynienia z tymi rzeczami.

Próbowałem już samouczka GridBagLayout Oracle i nie jestem pewien, co robię źle. Czy ktoś może mi pomóc, aby wyglądał bardziej jak powinien? W szczególności, aby pola tekstowe i obszar tekstowy obejmowały 2 komórki.

+0

'W szczególności, aby pola tekstowe i obszar tekstowy obejmowały 2 komórki' - Dlaczego więc trzeba rozdzielić dwie komórki? Na twoim zdjęciu masz 2 kolumny i 5 rzędów. Jedyną rzeczą, którą musisz zmienić, jest usprawnienie przycisku. Do tego chyba trzeba grać z kotwicą. Sprawdź samouczek ponownie. – camickr

+0

Mam 3 kolumny. Ostatni przycisk znajduje się w kolumnie 3. –

+0

[To jest plan, którego szukam] (http://i.imgur.com/RXuoawF.png) –

Odpowiedz

8

Niewiele rzeczy zauważyłem o twoim kodzie.

  • Nie używaj setSize() z JFrame. Spowoduje to nienormalne zachowanie. Zamiast tego, pozwól rozmiar ramy się zgodnie z rozmiarem jego składników . Jeśli chcesz, aby ramka była większa, dopasuj rozmiar nie do rozmiaru ramki, ale do znajdujących się w niej elementów. Możesz albo setpreferredSize lub nadpisać getpreferredsize komponentu, jeśli naprawdę chcesz dostosować rozmiar, ponieważ GridBagLayout jest jednym z tych menedżerów layoutów, które respektują preferowaną wielkość komponentu . Użyj pack(), aby usunąć niepotrzebną przestrzeń .

  • Nie rozszerzaj ramki JFrame, ustaw w klasie UI panel główny i dodaj wszystkie komponenty. dostarczyć moduł pobierający dla tego panelu (na przykład getUI()) do wyodrębniania interfejsu użytkownika tej klasy.

  • Zawsze należy ponownie instalować obiekt GridBagConstraints, gdy jest on , a następnie zostanie zastosowany do innego komponentu. W ten sposób można odczytać więcej niż.

  • Użyj wkładek, aby umieścić wyściółkę wokół komponentu.

  • Nie należy ponownie używać tego samego odniesienia do różnych składników;

  • Zastosowanie Initial Thread

  • To nie jest standard, ale uważam, że to bardzo pomocne podczas pracy z GridBagLayout, w ustalaniu ograniczeń GBC, aby go w kolejności alfabetycznej.

Aby rozwiązać problem, oto zmodyfikowany kod z rzeczami, które wskazałem na temat zastosowania.

public class AddressBook { 

    private JPanel pnlMain; 

    public AddressBook() { 
     pnlMain = new JPanel(); 
     pnlMain.setLayout(new GridBagLayout()); 
     GridBagConstraints gbc = new GridBagConstraints(); 

     JLabel lblName = new JLabel("Name"); 
     gbc.fill = GridBagConstraints.HORIZONTAL; 
     gbc.gridx = 0; 
     gbc.gridy = 0; 
     gbc.insets = new Insets(0, 10, 0, 0); 
     gbc.weightx = 1; 
     pnlMain.add(lblName, gbc); 

     JTextField txtName = new JTextField(); 
     gbc = new GridBagConstraints(); 
     gbc.fill = GridBagConstraints.HORIZONTAL; 
     gbc.gridwidth = 3; 
     gbc.gridx = 1; 
     gbc.gridy = 0; 
     gbc.insets = new Insets(5, 0, 0, 10); 
     gbc.weightx = 1; 
     pnlMain.add(txtName, gbc); 

     JLabel lblPhone = new JLabel("Phone"); 
     gbc = new GridBagConstraints(); 
     gbc.fill = GridBagConstraints.HORIZONTAL; 
     gbc.gridwidth = 1; 
     gbc.gridx = 0; 
     gbc.gridy = 1; 
     gbc.insets = new Insets(0, 10, 0, 0); 
     gbc.weightx = 1; 
     pnlMain.add(lblPhone, gbc); 

     JTextField txtPhone = new JTextField(); 
     gbc = new GridBagConstraints(); 
     gbc.fill = GridBagConstraints.HORIZONTAL; 
     gbc.gridwidth = 3; 
     gbc.gridx = 1; 
     gbc.gridy = 1; 
     gbc.insets = new Insets(5, 0, 0, 10); 
     gbc.weightx = 1; 
     pnlMain.add(txtPhone, gbc); 

     JLabel lblEmail = new JLabel("Email"); 
     gbc = new GridBagConstraints(); 
     gbc.fill = GridBagConstraints.HORIZONTAL; 
     gbc.gridwidth = 1; 
     gbc.gridx = 0; 
     gbc.gridy = 2; 
     gbc.insets = new Insets(0, 10, 0, 0); 
     gbc.weightx = 1; 
     pnlMain.add(lblEmail, gbc); 

     JTextField txtEmail = new JTextField(); 
     gbc = new GridBagConstraints(); 
     gbc.fill = GridBagConstraints.HORIZONTAL; 
     gbc.gridwidth = 3; 
     gbc.gridx = 1; 
     gbc.gridy = 2; 
     gbc.weightx = 1; 
     gbc.insets = new Insets(5, 0, 0, 10); 
     pnlMain.add(txtEmail, gbc); 

     JLabel lblAddress = new JLabel("Address"); 
     gbc = new GridBagConstraints(); 
     gbc.fill = GridBagConstraints.HORIZONTAL; 
     gbc.gridwidth = 1; 
     gbc.gridx = 0; 
     gbc.gridy = 3; 
     gbc.insets = new Insets(0, 10, 0, 0); 
     gbc.weightx = 1; 
     pnlMain.add(lblAddress, gbc); 

     JTextArea txtAreaAddress = new JTextArea(10, 20); 
     JScrollPane pane = new JScrollPane(txtAreaAddress); 
     gbc = new GridBagConstraints(); 
     gbc.anchor = GridBagConstraints.NORTH; 
     gbc.fill = GridBagConstraints.BOTH; 
     gbc.gridwidth = 3; 
     gbc.gridx = 1; 
     gbc.gridy = 3; 
     gbc.insets = new Insets(5, 0, 0, 10); 
     gbc.weightx = 1; 
     pnlMain.add(pane, gbc); 

     JButton btnSave = new JButton("Save"); 
     gbc = new GridBagConstraints(); 
     gbc.anchor = GridBagConstraints.WEST; 
     gbc.fill = GridBagConstraints.NONE; 
     gbc.gridwidth = 1; 
     gbc.gridx = 0; 
     gbc.gridy = 4; 
     gbc.insets = new Insets(10, 10, 10, 0); 
     gbc.weightx = 1; 
     pnlMain.add(btnSave, gbc); 

     JButton btnCancel = new JButton("Cancel"); 
     gbc = new GridBagConstraints(); 
     gbc.anchor = GridBagConstraints.EAST; 
     gbc.gridwidth = 1; 
     gbc.gridx = 3; 
     gbc.gridy = 4; 
     gbc.insets = new Insets(10, 0, 10, 10); 
     gbc.weightx = 1; 
     pnlMain.add(btnCancel, gbc); 

    } 

    public JPanel getUI(){ 
     return pnlMain; 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       JFrame frame = new JFrame("Address Book"); 
       frame.getContentPane().add(new AddressBook().getUI()); 
       frame.setLocationRelativeTo(null); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.pack(); 
       frame.setVisible(true); 
      } 
     }); 
    } 

} 
3

gbc.gridwidth jest parametrem, który pozwala komponentowi objąć więcej niż jedną kolumnę. Na przykład, jeśli masz 3 kolumny i 4 wiersze i chcesz, aby etykieta zajmowała cały górny wiersz, musisz przypisać pierwszą komórkę dla etykiety. i ustaw gbc.gridwidth = 3;