Java 在两个JPanel上设置组件

Java 在两个JPanel上设置组件,java,swing,jpanel,Java,Swing,Jpanel,我在理解Java布局方面有点问题。我使用GridBagLayoutto在两个单独的JPanel上定位组件,然后向JFramel添加面板,如下所示: upperContainer.setLayout(new GridBagLayout()); lowerContainer.setLayout(new GridBagLayout()); getContentPane().add(upperContainer, BorderLayout.NORTH); g

我在理解Java布局方面有点问题。我使用GridBagLayoutto在两个单独的JPanel上定位组件,然后向JFramel添加面板,如下所示:

    upperContainer.setLayout(new GridBagLayout());
    lowerContainer.setLayout(new GridBagLayout());
    getContentPane().add(upperContainer, BorderLayout.NORTH);       
    getContentPane().add(lowerContainer, BorderLayout.CENTER);
现在,这个程序正做着我所期望的,但不是我想要的。它将ùpperContainer及其所有组件置于较低的容器上方,但这两个面板的组件之间存在巨大的间隙。请参见下面的屏幕截图。我用箭头标出了缺口。我希望我的组件在较低的容器上放置得更高,这样看起来更好。 以下是仅适用于较低容器的代码: 编辑:我在两个面板上都使用了.CreateEdtchedBorderFunction,以便更好地看到面板的边框

    import java.awt.*;
    import javax.swing.*;
    import javax.swing.border.Border;
    import javax.swing.border.EtchedBorder;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;

    public class ConvertAllSystem extends JFrame{

    private JLabel labelDistance, labelWeight; 
    private JTextArea distanceOutput, weightOutput;
    private JTextField distanceInput, weightInput;
    private JButton convert, convert1; 
    private JComboBox fromListDistance, toListDistance, fromListWeight, toListWeight; 

    private String[] convertFromDistance = {"From (distance)...", "Mile", "Knot", "Kilometer", "Centimeter", "Meter", "Inch", "Yard"}; 
    private String[] convertToDistance = {"To (distance)...", "Mile", "Knot", "Kilometer", "Centimeter", "Meter", "Inch", "Yard"}; 
    private String[] convertFromWeight = {"From (weight)...", "Pound", "Kilogram", "Celcius", "Fahrenheit", "Gallon", "Liter"}; 
    private String[] convertToWeight = {"To (weight)...", "Pound", "Kilogram", "Celcius", "Fahrenheit", "Gallon", "Liter"}; 

    private Font font;
    JSeparator lineBetween;

    //Initialize all GUI components 
    private void createAllComponents() {

    JPanel upperContainer = new JPanel();
    JPanel lowerContainer = new JPanel();
    upperContainer.setLayout(new GridBagLayout());
    lowerContainer.setLayout(new GridBagLayout());
    getContentPane().add(upperContainer, BorderLayout.NORTH);       
    getContentPane().add(lowerContainer, BorderLayout.CENTER);
    Border outputCenter;    

     GridBagConstraints c = new GridBagConstraints();

    font = new Font("Times New Roman", Font.PLAIN, 20); 
    labelDistance = new JLabel("Convert distance unit");
    labelDistance.setFont(font);
    labelWeight = new JLabel("Convert weight unit");
    labelWeight.setFont(font);      

    c.gridx = 0;
    c.gridy = 0;
    c.gridwidth = GridBagConstraints.REMAINDER;
    c.anchor = GridBagConstraints.PAGE_START;
    c.insets = new Insets(10,0,10,0);
    upperContainer.add(labelDistance, c);

    fromListDistance = new JComboBox<String>(convertFromDistance);
    c.gridy = 1;
    c.weightx = 0.5;
    c.gridwidth = 1;
    c.ipady = 5;
    c.ipadx = 30;
    c.insets = new Insets(0,20,0,5);
    c.anchor = GridBagConstraints.LINE_START;
    upperContainer.add(fromListDistance, c);

    toListDistance = new JComboBox<String>(convertToDistance);
    c.gridx = 1;
    c.weightx = 1.0;
    c.insets = new Insets(0,0,0,0);
    upperContainer.add(toListDistance, c);

    distanceInput = new JTextField("Enter value here...");
    distanceInput.setPreferredSize(new Dimension(150,30));;
    distanceInput.setEditable(true);
    distanceInput.addMouseListener(new MouseAdapter(){
        public void mouseClicked(MouseEvent e){
            distanceInput.setText("");}});
    c.gridx = 2;
    c.ipady = 1;
    c.ipadx = 5;
    c.weightx = 5.0;
    upperContainer.add(distanceInput, c);

    convert = new JButton("Convert");
    c.gridx = 3;
    c.gridy = 1;
    c.weightx = 0.5;
    c.ipady = 20;
    c.ipadx = 50;
    c.gridwidth = GridBagConstraints.REMAINDER;
    upperContainer.add(convert, c);

    distanceOutput = new JTextArea(5,30);
    distanceOutput.setEditable(false);
    distanceOutput.setText("                                            Output");
    distanceOutput.setFont(new Font("Serif", Font.BOLD, 15));
    outputCenter = BorderFactory.createEtchedBorder(EtchedBorder.RAISED);
    distanceOutput.setBorder(outputCenter);
    c.gridx = 0;
    c.gridy = 2;
    c.weightx = 0.5;
    c.ipady = 1;
    c.ipadx = 5;
    c.gridwidth = GridBagConstraints.REMAINDER;
    c.insets = new Insets(30,0,0,0);
    c.anchor = GridBagConstraints.CENTER;
    upperContainer.add(distanceOutput, c);

    c.gridx = 0;
    c.gridy = 0;
    c.weightx =0.5;
    c.gridwidth = GridBagConstraints.REMAINDER;
    c.anchor = GridBagConstraints.PAGE_START;
    c.insets = new Insets(0,0,0,0);
    lowerContainer.add(labelWeight, c);

    fromListWeight = new JComboBox<String>(convertFromWeight);
    c.gridy = 1;
    c.weightx = 1.5;
    c.gridwidth = 1;
    c.ipady = 5;
    c.ipadx = 30;
    c.insets = new Insets(0,20,0,5);
    c.anchor = GridBagConstraints.LINE_START;
    lowerContainer.add(fromListWeight, c);

    toListWeight = new JComboBox<String>(convertToWeight);
    c.gridx = 1;
    c.weightx = 1.0;
    c.insets = new Insets(0,0,0,0);
    c.gridwidth = 1;
    lowerContainer.add(toListWeight, c);

    weightInput = new JTextField("Enter value here...");
    weightInput.setPreferredSize(new Dimension(150,30));;
    weightInput.setEditable(true);
    weightInput.addMouseListener(new MouseAdapter(){
        public void mouseClicked(MouseEvent e){
            weightInput.setText("");}});
    c.gridx = 2;
    c.ipady = 2;
    c.ipadx = 10;
    c.weightx = 5.0;
    lowerContainer.add(weightInput, c);

    convert1 = new JButton("Convert");
    c.gridx = 3;
    c.gridy = 1;
    c.weightx = 0.5;
    c.ipady = 20;
    c.ipadx = 50;
    c.insets = new Insets(0,0,0,0);
    c.gridwidth = GridBagConstraints.REMAINDER;
    lowerContainer.add(convert1, c);

    weightOutput = new JTextArea(5,30);
    weightOutput.setEditable(false);
    weightOutput.setText("                                            Output");
    weightOutput.setFont(new Font("Serif", Font.BOLD, 15));
    weightOutput.setBorder(outputCenter);
    c.gridx = 0;
    c.gridy = 5;
    c.weightx = 0.5;
    c.ipady = 1;
    c.ipadx = 5;
    c.gridwidth = GridBagConstraints.REMAINDER;
    c.insets = new Insets(30,30,0,0);
    c.anchor = GridBagConstraints.CENTER;
    lowerContainer.add(weightOutput, c);

}

//Constractor
public ConvertAllSystem() {
    createAllComponents();
    setDefaultLookAndFeelDecorated(true);
    setTitle("Converting App"); 
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setSize(700, 700);
    setResizable(true); 
    setLocationRelativeTo(null); 
    setVisible(true);
}
public static void main(String[] args) {
    try {
        UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
    } catch(Exception e) {
        e.printStackTrace();

    }
    SwingUtilities.invokeLater(() -> {
        new ConvertAllSystem(); 
    });

}
}

截图:

正如我所怀疑的,您的问题出在:

    setSize(700, 700);
通过人为调整GUI的大小,您添加了额外的空间,BorderLayout将用空白填充

将此更改为:

    // setSize(700, 700);
    pack();
让布局和组件自行调整大小

还要注意,如果要创建两个类似的JPanel,一个在另一个之上,请不要使用容器将它们放入BorderLayout,而是使用容器放入GridLayout0,1:

    JPanel upperContainer = new JPanel();
    JPanel lowerContainer = new JPanel();
    upperContainer.setLayout(new GridBagLayout());
    lowerContainer.setLayout(new GridBagLayout());
    // getContentPane().add(upperContainer, BorderLayout.NORTH);
    // getContentPane().add(lowerContainer, BorderLayout.CENTER);
    getContentPane().setLayout(new GridLayout(0, 1));
    getContentPane().add(upperContainer);
    getContentPane().add(lowerContainer);

您是在设置整个应用程序的大小还是首选大小?你在打电话给帕克吗?如果人为设置尺寸,则居中放置的零部件将展开以填充尺寸,从而导致出现问题。请发布一个有效的代码,以便我们自己测试您的实际代码。@DontKnowMuchButGettingBetter这是完整的代码:抱歉,放置完整的代码花了一些时间@DontKnowmuchButtingBettera作为一般建议,我建议在内容窗格本身上使用GridLayout,getContentPane.setLayoutnew GridLayout2 0;然后简单地添加其他组件,这应该将它们一个接一个地布局,但会填充可用空间。使用包装setSize@sumu00考虑使用一个或多个EMPTYBRADE在内容窗格或单个组件周围添加附加填充,这实际上只是部分解决方案。是,包装将以其首选尺寸显示组件。但是,如果用户调整了框架的大小,那么您将再次获得组件之间的空间,因为GridLayout将为每个组件提供相等的空间。间距的原始问题是因为GridBagLayout将所有组件置于可用空间的中心。所以改变布局并没有改变问题。更好的解决方案可能是嵌套面板。为这两个组件创建垂直长方体布局。将此面板添加到北面。面板现在将永远不会增长。当然,如果使用SetResizeable false,则上述情况不适用。