2016-06-17 23 views
1

Ok, ich bin ziemlich neu in Java schwingt und versucht, die Tricks zu lernen, aber kämpft mit der Ausrichtung von 2 JPanels im Rahmen. Wenn Sie sich den folgenden Screenshot ansehen, stimmt der Spaltenname JPanel und die JPanel-Ausrichtung nicht richtig aufeinander ab.Wie werden 2 JPanels vertikal zueinander ausgerichtet?

Unten ist mein Code.

JPanel columns = new JPanel(new GridBagLayout()); 
    GridBagConstraints gbc = new GridBagConstraints(); 
    gbc.weighty = 1.0; 
    gbc.weightx = 1.0; 
    gbc.fill = GridBagConstraints.VERTICAL; 
    gbc.insets = new Insets(5, 5, 5, 5); 
    gbc.anchor = GridBagConstraints.VERTICAL; 


    text = "<html><b>Action</b></html>";   
    JLabel label_action = new JLabel(text); 
    columns.add(label_action, gbc); 
    columns.setLayout(new GridBagLayout()); 


    JPanel values= new JPanel(new GridBagLayout()); 
    values.setBorder(BorderFactory.createRaisedBevelBorder()); 

    gbc.weighty = 1.0; 
    gbc.weightx = 1.0; 
    gbc.fill = GridBagConstraints.VERTICAL; 
    gbc.insets = new Insets(5, 5, 5, 5); 
    gbc.anchor = GridBagConstraints.VERTICAL; 

    DefaultComboBoxModel<String> model = new DefaultComboBoxModel<String>(); 

    model.addElement("click"); 
    model.addElement("Input Keys"); 

    final JComboBox<String> comboBox1 = new JComboBox<String>(model); 
    AutoCompleteDecorator.decorate(comboBox1); 
    comboBox1.setPreferredSize(new Dimension(200, 22)); 
    values.add(comboBox1, gbc); 
    values.setLayout(new GridBagLayout()); 

enter image description here

+1

Entfernen Sie alle Anrufe an 'setLayout'. Sie haben jedes JPanel bereits mit einem Layout (speziell einem GridBagLayout) erstellt. Wenn Sie ein neues Layout festlegen, werden alle zuvor angegebenen Einschränkungen verworfen. – VGR

+0

Das Entfernen von setLayout aus beiden JPanel führt zu einem Kompilierungsfehler. Ausnahme im Thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: ungültiger Ankerwert – Naseem

+1

Sie müssen ein einzelnes JPanel mit Ihren Titeln in der Zeile Null des Rasters verwenden. – FredK

Antwort

2

nicht einmal die Mühe mit GridBagLayout zu arbeiten. Es ist ein schlecht gestalteter Layout-Manager, der die heutigen Anforderungen nicht erfüllt. Ich empfehle entweder MigLayout oder GroupLayout.

Sehen Sie, wie einfach Ihr Layout mit MigLayout zu erstellen:

package com.zetcode; 

import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 
import net.miginfocom.swing.MigLayout; 


public class MigLayoutAlignmentEx extends JFrame { 

    public MigLayoutAlignmentEx() { 

     initUI(); 
    } 

    private void initUI() { 

     setLayout(new MigLayout()); 

     JLabel lbl1 = new JLabel("Action"); 
     JLabel lbl2 = new JLabel("Choose Selector"); 
     JLabel lbl3 = new JLabel("Element Properties"); 
     JLabel lbl4 = new JLabel("Values"); 
     JLabel lbl5 = new JLabel("Element Name"); 
     JLabel lbl6 = new JLabel("Comments"); 

     JComboBox combo1 = new JComboBox(); 
     JComboBox combo2 = new JComboBox(); 

     JTextField field1 = new JTextField(15); 
     JTextField field2 = new JTextField(15); 
     JTextField field3 = new JTextField(15); 
     JTextField field4 = new JTextField(15); 

     add(lbl1); 
     add(lbl2); 
     add(lbl3); 
     add(lbl4); 
     add(lbl5); 
     add(lbl6, "wrap"); 

     add(combo1, "w 150lp"); 
     add(combo2, "w 150lp"); 
     add(field1); 
     add(field2); 
     add(field3); 
     add(field4, "wrap"); 

     pack(); 

     setTitle("MigLayout example"); 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   
    } 


    public static void main(String[] args) { 

     SwingUtilities.invokeLater(() -> { 
      MigLayoutAlignmentEx ex = new MigLayoutAlignmentEx(); 
      ex.setVisible(true); 
     });   
    } 
} 

Ihre UI ist super einfach zu erstellen; Sie legen die Komponenten einfach in die Zellen. Anders als in MigLayout, wo das Gitter vorab erstellt wird, müssen Sie jedoch in GridBagLayout jede Zelle manuell erstellen, was schwierig und fehleranfällig ist.

enter image description here

+0

Wow! Du scheinst * mit 'MigLayout' besessen zu sein. Hast du diesen Layoutmanager programmiert? –

+0

'MigLayout' wurde von Mikael Grev erstellt. Es ist einfach zu bedienen und sehr flexibel. Einer der wenigen Manager, die die Anforderungen moderner UI erfüllen können. –

Verwandte Themen