2013-06-20 18 views
6

devo fare questo per la scuola:Come posso fare un arco componente più celle in un GridBagLayout

GUI

Questo è il codice che ho finora:

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

(Ho ancora bisogno di occuparmi di padding e inset. Ho ottenuto che funzionino in un programma molto più semplice quindi penso di avere una mano su quella roba)

Ho provato il tutorial di GridBagLayout su Oracle e non sono sicuro di cosa sto facendo male. Qualcuno può aiutarmi a farlo sembrare più come dovrebbe? In particolare per rendere i campi di testo e l'area di testo si estendono su 2 celle.

+0

'Specificamente per fare in modo che i campi di testo e l'area di testo si estendano su 2 celle' - Perché quindi devono estendersi su due celle? Nella tua foto hai 2 colonne e 5 righe. L'unica cosa che devi cambiare è rendere il pulsante giusto giustificato. Per questo credo che avresti bisogno di giocare con l'ancora. Guarda di nuovo il tutorial. – camickr

+0

Ho 3 colonne. L'ultimo pulsante è nella colonna 3. –

+0

[Questa è la griglia che sto cercando di fare] (http://i.imgur.com/RXuoawF.png) –

risposta

8

Poche cose ho notato del tuo codice.

  • Non utilizzare setSize() di JFrame. Ciò causerà un comportamento anomalo. Invece, lasciare che la dimensione del frame stesso in base alla dimensione dei suoi componenti . Se si desidera che la cornice sia più grande, non regolare la dimensione della cornice ma i componenti al suo interno. È possibile impostare setpreferredSize o sovrascrivere il getpreferredsize del componente se si desidera veramente modificare la dimensione poiché GridBagLayout è uno di quei gestori di layout che rispetta lo standard preferito del componente. Utilizzare pack() per rimuovere lo spazio non necessario.

  • Non estendere un JFrame, rendere la classe UI un pannello principale e aggiungere tutti i componenti lì. fornire un getter per quel pannello (ad esempio getUI()) per l'estrazione dell'interfaccia utente di quella classe.

  • Ripristinare sempre l'oggetto GridBagConstraints ogni volta che è andando ad essere applicato a un altro componente. In questo modo è leggibile più .

  • Utilizzare i margini per inserire il cuscinetto attorno al componente.

  • Non riutilizzare lo stesso riferimento a componenti diversi;

  • Usa Initial Thread

  • Questo non è standard, ma io lo trovo molto utile quando si lavora con GridBagLayout, nel fissare i limiti di GBC, farlo in ordine alfabetico.

Per risolvere il problema, qui è il codice modificato con le cose che ho indicato su applicato.

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 è il parametro che consente a un componente di estendersi su più di una colonna. Ad esempio, se si dispone di 3 colonne e 4 righe e si desidera che un'etichetta occupi la riga superiore completa, è necessario assegnare la prima cella per l'etichetta. e impostare gbc.gridwidth = 3;