当前位置: 首页 > 知识库问答 >
问题:

如何在JPanel顶部放置2个JButton(一个居中,另一个位于右上)?

施越彬
2023-03-14

我想在我的JPanel上放置两个按钮,其中一个位于中心,另一个位于JPanel的右上角。JPanel与包含JPanel的JFrame大小相同。如何使用GridBagLayout和GridBagConstraints实现这一点?

public class MyPanel extends JPanel {
public MyPanel() {
    JButton btnGame1 = new JButton("Game 1");
    JButton btnExitFrame = new JButton("Exit");

    setLayout(new GridBagLayout());
    GridBagConstraints c = new GridBagConstraints();
    c.anchor = GridBagConstraints.PAGE_START;
    c.weighty = 1;
    c.gridx = 0;
    add(btnGame1, c);
    c.gridx = 1;
    c.anchor = GridBagConstraints.FIRST_LINE_END;
    add(btnExitFrame, c);
}

public static void main(String[] args) {
    JFrame frame = new JFrame();
    frame.setResizable(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().add(new MyPanel());
    frame.setSize(400, 400);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
}
}

用于camickr的MCVE

public class MyPanel extends JPanel {
static JFrame frame = new JFrame();

public MyPanel() {
    JButton btnGame1 = new JButton("Game 1");
    JButton btnExitFrame = new JButton("Exit");;

    setLayout(new BorderLayout());

    JPanel top = new JPanel( new FlowLayout(FlowLayout.RIGHT) );
    top.add( btnExitFrame );

    JPanel center = new JPanel(new GridBagLayout());
    center.add(btnGame1, new GridBagConstraints());

    add(top, BorderLayout.PAGE_START);
    add(center, BorderLayout.CENTER);
}

public static void main(String[] args) {
    frame.setResizable(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().add(new MyPanel());
    frame.setSize(400, 400);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
}
}

固定溶胶:

public class MyPanel extends JPanel {
    static JFrame frame = new JFrame();

    public MyPanel() {
        JButton btnGame1 = new JButton("Game 1");
        JButton btnExitFrame = new JButton("Exit");;

        int nOfCells = 3;
        setLayout(new GridBagLayout());        
        GridBagConstraints c = new GridBagConstraints();
        c.weightx = 1;
        c.weighty = 1;
        for(int i = 0; i < nOfCells; i++){
            for(int j = 0; j < nOfCells; j++){
                c.gridx = i;
                c.gridy = j;               
                if(i == 1 && j == 0) {
                    c.anchor = c.PAGE_START;
                    add(btnGame1, c);
                    c.anchor = c.CENTER;
                }
                else if(i == 2 && j == 0) {
                    c.anchor = c.FIRST_LINE_END;
                    add(btnExitFrame, c);
                    c.anchor = c.CENTER;
                }
                else {
                    c.fill = c.BOTH;
                    add(Box.createRigidArea(new Dimension(frame.getWidth()/nOfCells, frame.getHeight()/nOfCells)), c);
                    c.fill = c.NONE;
                }
            }
        }

    }

    public static void main(String[] args) {
        frame.setResizable(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(600, 600);
        frame.getContentPane().add(new MyPanel());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

固定文本框的图像

共有2个答案

桓嘉谊
2023-03-14

利用框架的边框布局并使用嵌套面板。

JPanel top = new JPanel( new FlowLayout(set right alignment) ); // read FlowLayout API
top.add( topRightButton );

JPanel center = new JPanel( new GridBagLayout() );
center.add(centerButton, new GridBagConstraints());

frame.add(top, BorderLayout.PAGE_START);
frame.add(center, BorderLayout.CENTER);

编辑:

不要像那样使用静态变量。如果您认为需要使用静态变量,则存在设计问题。

由于您是将MyPanel类直接添加到框架中,因此需要进行以下更改,以有效地使MyPanel类成为使用< code>BorderLayout的容器:

//setLayout(new GridBagLayout());
setLayout(new BorderLayout());

...

//frame.add(top, BorderLayout.PAGE_START);
//frame.add(center, BorderLayout.CENTER);
add(top, BorderLayout.PAGE_START);
add(center, BorderLayout.CENTER);

我建议你也可以阅读 Swing 教程中关于如何使用 BorderLayout 的部分。那里的演示代码将展示将组件直接添加到框架的另一种方法。

您当前的代码(加上我建议的上述更改)可能是更好的方法。但是您应该理解这两种方法,以便更好地理解布局管理器是如何工作的。

端木令
2023-03-14

另一个仅使用GridBagLayout的选项是添加不可见的框作为填充符,将JPanel分成几个部分,然后用JButtons替换首选位置的框。

    GridBagConstraints c = new GridBagConstraints();
    c.weightx = 1;
    for(int i=0; i<nOfCells; i++){
        for(int k=0; k<nOfCells; k++){

            c.gridx = i;
            c.gridy= k;
            this.add(Box.createRigidArea(new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT)), c);
        }
    }

GridBagLayout不允许在空间中固定位置,它们依赖于它们相对于JFrame其他组件的位置。

 类似资料:
  • 问题内容: 我想将居中。但是,事实并非如此。我只想找出原因以及如何使其居中。 问题答案: 您需要设置容器的宽度。(不起作用) MDN的CSS参考说明了这一切。

  • 我有一个SingleChildScrollView,它有一个包含许多子项的列小部件。我希望将一组按钮“放在下一个屏幕上”(例如“PageBreak小部件”)。 我已经尝试过了,但是它产生了一个异常,因为您只应该使用一个定位小部件和一个堆栈小部件(而不是列小部件):

  • 我为欢迎屏幕设计了一个接口,其中有一个JFrame,包括两个JPanel(JPanel1在右边,JPanel2在左边)。左边的按钮用于切换JPanel1中的面板。我想按下一个按钮,用另一个JPanel替换JPanel1内容,但我不知道怎么做。请帮忙。

  • 我似乎无法为JPanel设置按钮的自定义位置。它总是在左上角添加按钮,然后继续向右。我还有一个背景图像,这让事情变得更加困难。框架如下所示:imageshack.com/a/img838/3240/ez6l.png我的代码是: 我想将按钮“MusicButton”添加到右下角/中间/或左侧。如果您可以在JPanel中定制JButton,请分享。谢谢

  • 问题内容: 我想将添加到另一个div内的div居中。 这是我当前正在使用的CSS。 如您所见,我现在使用的方法取决于width和height的值。如果width / height发生变化,我将不得不修改and值。是否有任何通用解决方案可用于始终将居中对齐它的大小? 我发现使用可以将innerDiv水平分配到中间,但是垂直分配中间呢? 问题答案: tl; dr 垂直对齐中间作品,但是您将不得不在父元

  • 我想在一个JFrame中用另一个Jpanel替换一个Jpanel,我已经搜索并尝试了我的代码,但什么也没有发生,这是我的代码: 有人能帮帮我吗?多谢