2016-07-19 20 views
0

Ich habe eine Anforderung, nach der die UI wie unten abgebildet angezeigt werden sollte.Java Swing UI Ausrichtungsproblem

enter image description here

Ich habe versucht, das gleiche zu erreichen, indem Sie das unten Stück Code.

package com.samples; 

import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.FlowLayout; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Insets; 

import javax.swing.JButton; 
import javax.swing.JCheckBox; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.border.CompoundBorder; 
import javax.swing.border.EmptyBorder; 
import javax.swing.border.TitledBorder; 


public class MyFrame extends JFrame { 

    public MyFrame() { 
    } 

    public static void main(String[] args) { 
     Runnable runner = new Runnable() { 
      public void run() { 
       JFrame frame = new JFrame("My Sample Frame"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setSize(1000, 800); 
       frame.setVisible(true); 

       JPanel jpOPanel = new JPanel(); 
       jpOPanel.setBorder(new CompoundBorder(new TitledBorder("Outer Panel"), 
                 new EmptyBorder(0, 2, 2, 2))); 
       GridBagLayout gbl = new GridBagLayout(); 
       GridBagConstraints gbc = new GridBagConstraints(); 
       jpOPanel.setLayout(gbl); 

       JPanel jpSearch = new JPanel(new FlowLayout(FlowLayout.RIGHT)); 
       JButton jbSearch = new JButton("Search"); 
       jpSearch.add(jbSearch); 
       gbc.weightx = 0.0D; 
       gbc.weighty = 0.0D; 
       gbc.insets = new Insets(0, 0, 5, 0); 
       gbc.fill = 1; 
       gbc.gridwidth = 0; 
       gbc.gridx = 0; 
       gbc.gridy = 0; 
       gbl.setConstraints(jpSearch, gbc); 
       jpOPanel.add(jpSearch); 

       JLabel jLabel1 = new JLabel("Input 1:"); 
       gbc.weightx = 0.0D; 
       gbc.insets = new Insets(0, 0, 5, 5); 
       gbc.gridwidth = -1; 
       gbc.gridx = 0; 
       gbc.gridy = 1; 
       gbl.setConstraints(jLabel1, gbc); 
       jpOPanel.add(jLabel1); 

       JComboBox jComboBox1 = new JComboBox(); 
       gbc.weightx = 1.0D; 
       gbc.insets = new Insets(0, 0, 5, 0); 
       gbc.gridwidth = 0; 
       gbc.gridx = 1; 
       gbc.gridy = 1; 
       gbl.setConstraints(jComboBox1, gbc); 
       jComboBox1.setVisible(true); 
       jpOPanel.add(jComboBox1); 

       JLabel jLabel2 = new JLabel("Input 2:"); 
       gbc.weightx = 0.0D; 
       gbc.weighty = 0.0D; 
       gbc.insets = new Insets(0, 0, 5, 5); 
       gbc.fill = 2; 
       gbc.gridwidth = -1; 
       gbc.gridx = 0; 
       gbc.gridy = 2; 
       gbl.setConstraints(jLabel2, gbc); 
       jpOPanel.add(jLabel2); 

       JComboBox jComboBox2 = new JComboBox(); 
       gbc.weightx = 1.0D; 
       gbc.insets = new Insets(0, 0, 5, 0); 
       gbc.gridwidth = 0; 
       gbc.gridx = 1; 
       gbc.gridy = 2; 
       gbl.setConstraints(jComboBox2, gbc); 
       jComboBox2.setVisible(true); 
       jpOPanel.add(jComboBox2); 

       JLabel jLabel3 = new JLabel("Input 3:"); 
       gbc.weightx = 0.0D; 
       gbc.insets = new Insets(0, 0, 5, 5); 
       gbc.gridwidth = -1; 
       gbc.gridx = 0; 
       gbc.gridy = 3; 
       gbl.setConstraints(jLabel3, gbc); 
       jpOPanel.add(jLabel3); 

       JComboBox jComboBox3 = new JComboBox(); 
       gbc.weightx = 1.0D; 
       gbc.insets = new Insets(0, 0, 5, 0); 
       gbc.gridwidth = 0; 
       gbc.gridx = 1; 
       gbc.gridy = 3; 
       gbl.setConstraints(jComboBox3, gbc); 
       jpOPanel.setVisible(true); 
       jpOPanel.add(jComboBox3); 

       JPanel jpPanel1 = new JPanel(); 
       jpPanel1.setBorder(new CompoundBorder(new TitledBorder(""), new EmptyBorder(0, 0, 0, 0))); 
       GridBagConstraints gbc3 = new GridBagConstraints(); 
       gbc.gridwidth = 1; 
       gbc.gridx = 0; 
       gbc.gridy = 9; 
       gbl.setConstraints(jpPanel1, gbc); 

       JLabel jLabel4 = new JLabel("Input 4:"); 
       gbc3.insets = new Insets(0, 0, 0, 0); 
       gbc3.gridx = 0; 
       gbc3.gridy = 0; 
       gbc3.gridwidth = -1; 
       jpPanel1.add(jLabel4, gbc3); 

       JTextField jTextField1 = new JTextField(); 
       jTextField1.setEditable(false); 
       jTextField1.setPreferredSize(new Dimension(100, 20)); 
       jTextField1.setMinimumSize(new Dimension(100, 20)); 
       jTextField1.setMaximumSize(new Dimension(100, 20)); 
       gbc3.insets = new Insets(0, 0, 0, 0); 
       gbc3.gridx = 1; 
       gbc3.gridy = 0; 
       gbc3.gridwidth = 0; 
       jpPanel1.add(jTextField1, gbc3); 

       JLabel jLabel5 = new JLabel("Input 5:"); 
       gbc3.insets = new Insets(0, 0, 0, 0); 
       gbc3.gridx = 2; 
       gbc3.gridy = 0; 
       gbc3.gridwidth = -1; 
       jpPanel1.add(jLabel5, gbc3); 

       JTextField jTextField2 = new JTextField(); 
       jTextField2.setEditable(false); 
       jTextField2.setPreferredSize(new Dimension(100, 20)); 
       jTextField2.setMinimumSize(new Dimension(100, 20)); 
       jTextField2.setMaximumSize(new Dimension(100, 20)); 
       gbc3.insets = new Insets(0, 0, 0, 0); 
       gbc3.gridx = 3; 
       gbc3.gridy = 0; 
       gbc3.gridwidth = 0; 
       jpPanel1.add(jTextField2, gbc3); 
       jpOPanel.add(jpPanel1); 

       JLabel jLabel6 = new JLabel("Input 6:"); 
       gbc.weightx = 0.0D; 
       gbc.insets = new Insets(0, 0, 5, 5); 
       gbc.gridwidth = -1; 
       gbc.gridx = 0; 
       gbc.gridy = 15; 
       gbl.setConstraints(jLabel6, gbc); 
       jpOPanel.add(jLabel6); 

       JComboBox jComboBox4 = new JComboBox(); 
       gbc.weightx = 1.0D; 
       gbc.insets = new Insets(0, 0, 5, 0); 
       gbc.gridwidth = 0; 
       gbc.gridx = 1; 
       gbc.gridy = 15; 
       gbl.setConstraints(jComboBox4, gbc); 
       jpOPanel.add(jComboBox4); 

       JLabel jLabel7 = new JLabel("Input 7:"); 
       gbc.weightx = 0.0D; 
       gbc.insets = new Insets(0, 0, 5, 5); 
       gbc.gridwidth = -1; 
       gbc.gridx = 0; 
       gbc.gridy = 16; 
       gbl.setConstraints(jLabel7, gbc); 
       jpOPanel.add(jLabel7); 

       JTextField jTextField3 = new JTextField(); 
       jTextField3.setEditable(false); 
       gbc.weightx = 1.0D; 
       gbc.insets = new Insets(0, 0, 5, 0); 
       gbc.gridwidth = 0; 
       gbc.gridx = 1; 
       gbc.gridy = 16; 
       gbl.setConstraints(jTextField3, gbc); 
       jpOPanel.add(jTextField3); 

       JPanel jpPanel3 = new JPanel(); 
       jpPanel3.setBorder(new CompoundBorder(new TitledBorder(""), new EmptyBorder(0, 0, 0, 0))); 
       GridBagConstraints gbc2 = new GridBagConstraints(); 
       gbc.gridwidth = 2; 
       gbc.gridx = 0; 
       gbc.gridy = 24; 
       gbl.setConstraints(jpPanel3, gbc); 

       JCheckBox jCheckBox1 = new JCheckBox("Check Me"); 
       jCheckBox1.setPreferredSize(new Dimension(140, 20)); 
       jCheckBox1.setMinimumSize(new Dimension(140, 20)); 
       jCheckBox1.setMaximumSize(new Dimension(140, 20)); 
       gbc2.ipady = 0; 
       gbc2.weightx = 0.5D; 
       gbc2.weighty = 0.0D; 
       gbc2.gridwidth = 1; 
       gbc2.anchor = GridBagConstraints.LINE_START; 
       gbc2.insets = new Insets(0, 0, 0, 0); 
       gbc2.gridx = 0; 
       gbc2.gridy = 0; 
       jpPanel3.add(jCheckBox1, gbc2); 

       JLabel jLabel8 = new JLabel("Input 8: "); 
       jLabel8.setPreferredSize(new Dimension(140, 20)); 
       jLabel8.setMinimumSize(new Dimension(140, 20)); 
       jLabel8.setMaximumSize(new Dimension(140, 20)); 
       gbc2.ipady = 0; 
       gbc2.weightx = 0.5D; 
       gbc2.weighty = 0.0D; 
       gbc2.anchor = GridBagConstraints.LINE_START; 
       gbc2.insets = new Insets(0, 0, 0, 0); 
       gbc2.gridx = 0; 
       gbc2.gridy = 6; 
       jpPanel3.add(jLabel8, gbc2); 

       JComboBox jComboBox5 = new JComboBox(); 
       jComboBox5.setEnabled(false); 
       jComboBox5.setPreferredSize(new Dimension(230, 20)); 
       jComboBox5.setMinimumSize(new Dimension(230, 20)); 
       jComboBox5.setMaximumSize(new Dimension(230, 20)); 
       gbc2.gridx = 3; 
       gbc2.gridy = 6; 
       jpPanel3.add(jComboBox5, gbc2); 
       jpOPanel.add(jpPanel3); 

       frame.add(jpOPanel); 

      } 
     }; 
     EventQueue.invokeLater(runner); 
    } 
} 

Die Komponenten werden jedoch wie in der Abbildung unten angezeigt. Bitte helfen Sie, wie Sie diese beheben können.

enter image description here

+2

jemals Swing-Builder in Netbeans versucht? –

+0

Nein @DanyalSandeelo. Ich benutze Jdeveloper 11.1.2.2.0 – pankti

+0

'gbc.gridwidth = 2;' ist, was Sie wollen, würde ich vorschlagen, Sie beginnen Refactoring sowie es ist ein bisschen Wand von codie. – BevynQ

Antwort

4

Hinweis: Bitte versuchen Sie, Ihre Code-Snippets zu verkleinern, damit sie für andere leichter lesbar sind.

Wenn Sie GridBagLayout verwenden, müssen Sie in der Regel Felder mit einem Gewicht von 1 verwenden, um die Leerstellen auszufüllen. Stellen Sie zunächst gbc.fill = GridBagConstraints.BOTH; ein.

Fügen Sie dann leere Felder hinzu und verwenden Sie Gewichte, um den Platz auszufüllen, wie in der Abbildung unten zu sehen ist. Die Tafeln oben und unten sollen den ganzen Platz einnehmen, den sie bekommen, also weighty = 1; und überspannen auch zwei Spalten, also gridwidth = 2. Die Paneele in der Mitte nehmen die verbleibende Höhe ein. Das Panel auf der rechten Seite sollte dann die verbleibende Breite einnehmen, also weightx = 1. So nimmt Ihr Panel immer nur den verbleibenden Platz ein.

How to use the layouting

+0

Danke eine Tonne. Ich denke, es gibt ein bisschen Verwirrung. Tatsächlich werden diese zusätzlichen Räume ausgehen, wenn diese Komponenten gut ausgerichtet sind. Ich möchte, dass diese Komponenten wie erwartet herauskommen. Der zusätzliche Platz (den Sie blau markiert haben) kommt nur wegen der Rahmengröße. Bitte helfen Sie mir, wie Sie diese Komponenten ohne die zusätzlichen Abstände zwischen dem Etikett und der entsprechenden Komponente ausrichten können. – pankti

+1

Ah okay. Ihre Frage ist nicht klar.Verwenden Sie in diesem Fall ein 'weightx' von 0 für Ihre Labels (Input 1, 2, 3, 6, 7) und ein' weightx' von 1 für die jeweiligen Kombinationsfelder. Dann verwenden Sie 'gridwidth = 2' für das Panel, das Ihre Eingaben 4 und 5 etc. umschließt. – maxdev

+0

Vielen Dank. Ich tat wie vorgeschlagen. Alles sieht wie erwartet aus, bis auf das letzte Panel sind noch alle Komponenten in einer Zeile ausgerichtet. Ich möchte, dass es in 2 Zeilen erscheint, wie in meiner erwarteten UI gezeigt Bild – pankti

2

Sie könnten versuchen, ein Box.createHorizontalGlue() hinzufügen, am äußersten linken Teil, aber Sie müssen sicherstellen, dass es den größten gridbagconstraints.weightx;

Zum Beispiel hat:

gbc.weightx = 1;//needs to be more than 0 so it works. 
gbc.gridx = 4;//needs to be the largest gridx in the panel + 1 
jpPanel3.add(Box.createHorizontalGlue(), gbc2); 
+0

Danke. Ich benutzte dies und das Panel erscheint zusammen mit den rechten Seitenkomponenten, wobei die linke Spalte leer bleibt. Aber die inneren Komponenten sind alle in einer Linie und nicht untereinander. – pankti