1

我试图将两个按钮堆叠在一起并将它们锚定到面板的顶部,但第二个按钮留在面板的中心。

在此代码中,我创建了一个拆分窗格,然后向其中添加了两个面板。一个面板包含按钮(我感兴趣的面板),另一个包含一个文本字段。这些按钮使一些文本出现在文本字段中。

我想弄清楚 GridBagLayout 参数的哪个正确组合将允许我将两个按钮放在一起(中间没有间隙)并将它们锚定到面板的顶部。我用 weighting 和 gridy 参数尝试了一些不同的东西,但无济于事。

提前感谢您的时间和回复。

package gridbagtest;

import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class GridBagTest
{
    public static void main(String[] args)
    {
        JFrame gridTest = new JFrame("Grid Bag Layout Test");

        JSplitPane splitPaneHorizontal = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);

        final JTextField blah = new JTextField(30);
        JPanel textPane = new JPanel();
        textPane.add(blah);

        JPanel buttonPane = new JPanel();
        buttonPane.setBackground(Color.WHITE);
        buttonPane.setLayout(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();
        c.fill = GridBagConstraints.HORIZONTAL;
        c.anchor = GridBagConstraints.FIRST_LINE_START;
        c.gridx = 0;
//      c.gridy = GridBagConstraints.RELATIVE;
        c.gridy = 0;
        c.weightx = 1;
        c.weighty = 1;

        JButton flightPlanButton = new JButton("First Button");

        flightPlanButton.addActionListener(new ActionListener() 
        {
            public void actionPerformed(ActionEvent e) 
            {   blah.setText("First Button pushed");    }
         });

        buttonPane.add(flightPlanButton, c);

        JButton powerButton = new JButton("Second Button");
        powerButton.addActionListener(new ActionListener()                            
        {
            public void actionPerformed(ActionEvent e) 
            {   blah.setText("Second Button pushed");   }
        });

        c.gridy = 1;
        buttonPane.add(powerButton, c);

        splitPaneHorizontal.setTopComponent(new JScrollPane(buttonPane));
        splitPaneHorizontal.setBottomComponent(textPane);   

        gridTest.add(splitPaneHorizontal);
        gridTest.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        gridTest.pack();
        gridTest.setSize(600,800);
        gridTest.setVisible(true);

    }
}
4

2 回答 2

2

我认为一个问题是您没有在按钮下方添加任何内容来填充空白空间。有很多方法可以解决这个问题。一种是完全避免使用 GridBagLayout,将 JButton 放入使用 BoxLayout 的 JPanel 中,然后将该 JPanel 放入另一个在 BorderLayout.PAGE_START(或 NORTH)位置使用 BorderLayout 的 JPanel 中。另一个,我将展示你是否将按钮的重量设置为 0,然后添加另一个组件,例如空 JLabel 或者在这里我使用 box 类中的胶水,给它一个合适的重量,合适的高度,比如说剩余,看看会发生什么:

  JPanel buttonPane = new JPanel();
  buttonPane.setBackground(Color.WHITE);
  buttonPane.setLayout(new GridBagLayout());
  GridBagConstraints c = new GridBagConstraints();
  c.fill = GridBagConstraints.HORIZONTAL;
  c.anchor = GridBagConstraints.FIRST_LINE_START;
  c.gridx = 0;
  c.gridy = 0;
  c.weightx = 1;
  c.weighty = 0;

  JButton flightPlanButton = new JButton("First Button");

  flightPlanButton.addActionListener(new ActionListener() {
     public void actionPerformed(ActionEvent e) {
        blah.setText("First Button pushed");
     }
  });

  buttonPane.add(flightPlanButton, c);

  JButton powerButton = new JButton("Second Button");

  c.gridy = 1;
  buttonPane.add(powerButton, c);

  c.gridy = 2;
  c.fill = GridBagConstraints.BOTH;
  c.anchor = GridBagConstraints.LINE_END;
  c.weighty = 100.0;
  c.gridheight = GridBagConstraints.REMAINDER;
  buttonPane.add(Box.createGlue(), c);

另外,我相信 Devon_C_Miller 所说的,如果你正在改变字段,你需要创建一个新的 GridBagConstraint 是不正确的,事实上 Oracle 在它自己的 GridBagLayout API 中挑战了这一点。

Devon_C_Miller 补充一点:可以肯定的是,我检查了 GridBagLayout 源代码,发现该类将这些信息存储在一个HashTable<Component, GridBagConstraints>名为comptable的变量中,并且在将setConstraints(...)信息放置在该表中的方法中,首先克隆了 GridBagConstraints 对象在将其添加到表之前,完全证明不需要创建新的 GridBagConstraints 对象(尽管这样做通常是一种很好的编程习惯,但出于其他原因)。

于 2012-07-13T23:56:04.137 回答
0

如果您添加一个新的 GridBagConstraints 对象并将其用于添加第二个按钮,则可以修复您的代码。

        GridBagConstraints d = 新的 GridBagConstraints();
        d.fill = GridBagConstraints.HORIZONTAL;
        d.gridx = 0;
        d.gridy = 0;
        d.weightx = 0;
        d.weighty = 0;

然后在你的添加中使用它。

        buttonPane.add(flightPlanButton, d);

我运行了这段代码,它像你想要的那样堆叠了按钮。

于 2012-07-14T02:39:49.817 回答