Java JButton不显示文本;填充JFrame

Java JButton不显示文本;填充JFrame,java,swing,layout-manager,Java,Swing,Layout Manager,我正在尝试制作一个带有按钮的JFrame,但是我的按钮没有我想要的文本!我在button构造函数中设置它,然后使用setText,但它仍然没有显示!此外,按钮填充整个框架,有没有办法使其不粘到框架的边缘 import javax.swing.*; 公共班机 { 公共静态void main(字符串[]args) { JFrame主窗口=新JFrame(“8游戏”); 主窗口。设置大小(200200); JButton eightButton=新JButton(“8”); 设置文本(“8”); 八按

我正在尝试制作一个带有按钮的JFrame,但是我的按钮没有我想要的文本!我在button构造函数中设置它,然后使用setText,但它仍然没有显示!此外,按钮填充整个框架,有没有办法使其不粘到框架的边缘

import javax.swing.*;
公共班机
{
公共静态void main(字符串[]args)
{
JFrame主窗口=新JFrame(“8游戏”);
主窗口。设置大小(200200);
JButton eightButton=新JButton(“8”);
设置文本(“8”);
八按钮设置尺寸(30,30);
八个按钮。立根(5,5,25,25);
eightButton.setContentAreaFilled(假);
设置操作(新按钮操作());
主窗口。添加(八个按钮);
mainWindow.setVisible(true);
}
}

使用符合组件首选尺寸的布局管理器

mainWindow.setLayout(new FlowLayout(FlowLayout.CENTER));

Swing组件在添加到窗口时需要布局管理器上下文

默认布局是BorderLayout,这就是为什么会出现这种奇怪的行为。只有一个元素时,BorderLayout会用该元素填充窗格

尝试FlowLayout或AbsoluteLayout(或null)之类的方法


为什么它对我有效而对你无效?(采用其他人建议的流程布局)

import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;

public class main
{
    public static void main(String[] args)
    {
        JFrame mainWindow = new JFrame("8 Game");
        mainWindow.setLayout(new FlowLayout(FlowLayout.CENTER));
        mainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainWindow.setSize(200, 200);
        JButton eightButton = new JButton("8");
        eightButton.setText("8");
        eightButton.setSize(30, 30);
        eightButton.setBounds(5, 5, 25, 25);
        //eightButton.setAction(new buttonAction());
        //eightButton.setContentAreaFilled(false);


        mainWindow.add(eightButton);
        mainWindow.setVisible(true);
    }
}


编辑

操作
需要标题。如果未指定标题,则按钮将没有标题。如果您这样做

 eightButton.setAction(new buttonAction(), "8");

它会起作用。

使用另一个
LayoutManager
默认框架的布局管理器是
BorderLayout
,如果您添加一个没有规范的组件,它将添加到中心。您可以使用
FlowLayout
。请参阅带有
SwingUtilities的示例。invokeLater
确保它将在
EDT
中运行

public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                JFrame mainWindow = new JFrame("8 Game");
                mainWindow .setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                mainWindow.setLayout(new FlowLayout());
                mainWindow.setLocationRelativeTo(null);
                JButton eightButton = new JButton("8");
                eightButton.setText("8");
                eightButton.setContentAreaFilled(false);
                eightButton.setAction(new buttonAction());
                mainWindow.add(eightButton);
                mainWindow.pack();
                mainWindow.setVisible(true);
            }

        });

    }

看看官方教程中更完整的正确示例

JFrame的默认布局管理器是BorderLayout,它并不真正关心您在JButton上设置的边界。看看我删除了边界,但保留了30*30的大小,并且使用130*130进行了测试。现在窗口看起来是这样的(仍然没有文本):删除按钮的
setSize
setBounds
调用请勿更改任何内容:(在
setVisible()之前调用
pack()
@Pwnie2012在我测试它时运行得很好,你在运行更新的代码吗?WTF,责怪setAction!为什么?!删除setAction有效!Action需要一个标题。如果你没有指定标题,你的按钮将不会显示任何内容