首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JButton in JPanel

JButton in JPanel
EN

Stack Overflow用户
提问于 2014-12-18 02:29:40
回答 5查看 2.1K关注 0票数 0

我不知道为什么我的网格覆盖我的按钮,我试图解决它,但我不能。谁能告诉我为什么?是因为,我把所有的东西都放在BorderLayout里了吗?谁能更多的玩按钮到右手边呢?

代码语言:javascript
运行
复制
public game() {
        make();
        JPanel p = new JPanel();

        frame.setLayout(new BorderLayout());
        resetButton = new JButton("Play");
        p.add(playButton, BorderLayout.EAST);
        frame.add(p);
}
public void make(){
        frame = new JFrame("Gamer");

        frame.setTitle("Gamer");
        JPanel m = new JPanel(new GridLayout(9,9));
        for(int i = 0; i < 9; i++) {
            for(int j = 0; j < 9; j++) {
                grids[i][j] = new JButton();
                m.add(grids[i][j]);
            }
        }
        frame.add(m, BorderLayout.CENTER);
        frame.setResizable(false);
        frame.setSize(width, heigth);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-12-18 02:45:47

尝试使用frame.add(p,BorderLayout.SOUTH)

下面是一个例子。

守则:

代码语言:javascript
运行
复制
import java.awt.BorderLayout;
import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class game {
    JFrame frame;
    JButton grids[][] = new JButton[9][9];

    public game() {
        make();
        JPanel p = new JPanel();
        JButton resetButton = new JButton("reset");
        JButton playButton = new JButton("Play");
        p.add(playButton);
        p.add(resetButton);
        frame.add(p,BorderLayout.SOUTH);
        frame.setVisible(true);
    }

    public void make() {
        frame = new JFrame("Gamer");
        frame.setTitle("Gamer");
        JPanel m = new JPanel(new GridLayout(9, 9));
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                grids[i][j] = new JButton();
                m.add(grids[i][j]);
            }
        }
        frame.add(m, BorderLayout.CENTER);
        frame.setResizable(false);
        frame.pack();

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
        game gameObj = new game();
    }
}

效果:

除此之外,类名的第一个字母应该大写。

票数 1
EN

Stack Overflow用户

发布于 2014-12-18 02:56:40

实际上,您正在将m (网格)和按钮面板添加到BorderLayoutCENTER位置。

这里

代码语言:javascript
运行
复制
frame.add(m, BorderLayout.CENTER);

代码语言:javascript
运行
复制
p.add(playButton, BorderLayout.EAST);
frame.add(p); // adding to the CENTER position

BorderLayout中的默认位置是CENTER位置。通过简单地使用frame.add(p, BorderLayout.EAST);,你可以把按钮移到右边.

请注意,使用setResizable时会出现问题,它将更改框架的边框大小,更改框架内容的可用空间,始终在定义框架大小之前调用它,这应该用pack来完成。

如果可以的话,您确实希望避免修改框架的内容,因为这不仅会影响内容可能喜欢的空间,而且还需要您对容器进行revalidaterepaint

更好的方法是创建框架,然后将其传递给gamemake方法.

票数 2
EN

Stack Overflow用户

发布于 2014-12-18 02:38:43

您使用的是frame.add(p) --它可能不会将面板添加到框架的正确区域。试一试

代码语言:javascript
运行
复制
frame.add(p, BorderLayout.SOUTH)

或者别的什么?也就是说,不是CENTER,它将覆盖您的网格。

还请注意,面板的布局尚未设置,因此默认情况下它将是一个FlowLayout

正如MadProgrammer所说,不需要设置框架的布局--特别是在添加网格之后!

最后,只添加到帧的getContentPane()是一个很好的实践。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27538317

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档