3

我正在尝试使用包含编号按钮的网格创建一个简单的 GUI。问题是,按钮的文本不会根据按钮的大小自行调整。

让我先给你看一下代码,这样你就会明白我的意思了:

import javax.swing.*;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


public class SimpleGUI implements ActionListener {
    
    private JFrame frame;
    private JPanel grid;
    private JButton[] buttons;
    
    public SimpleGUI() {
        frame=new JFrame("Buttons grid");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        
        grid=new JPanel();
        buttons=new JButton[100];
        
        
        for (int i=0; i<buttons.length; i++) {
            buttons[i]=new JButton(Integer.toString(i+1));
            buttons[i].setActionCommand(Integer.toString(i+1));
            grid.add(buttons[i]);
            buttons[i].addActionListener(this);
        }
        
        frame.getContentPane().add(grid);
    }
    
    public static void main(String[] args) {
        SimpleGUI gui=new SimpleGUI();
        gui.go();
    }
    
    
    public void go() {
        grid.setLayout(new GridLayout(10,10));
        
        frame.setSize(500,500);
        frame.setVisible(true);
    }


    public void actionPerformed(ActionEvent e) {
        String buttonNum=e.getActionCommand();
        System.out.println("You've pressed "+buttonNum);
    }
    
}

按钮太小,无法容纳文本,因此按钮上会出现三个点,而不是数字。( ... ) 只有当我展开窗口(并因此相应地扩大按钮的尺寸)时,数字才会正确显示在按钮上。有没有办法让文本根据按钮的尺寸自行调整,以便始终可见?

4

2 回答 2

4

确实可以为按钮内的文本提供更多空间。文本周围的额外空白空间由边距控制,并且可以更改:

button.setMargin(new Insets(0, 0, 0, 0));

如果你想让按钮默认为方形,你可以覆盖它们的首选大小:

buttons[i] = new JButton(Integer.toString(i + 1)) {
    @Override
    public Dimension getPreferredSize() {
        Dimension naturalSize = super.getPreferredSize();
        int sideLength = Math.max(naturalSize.width, naturalSize.height);
        return new Dimension(sideLength, sideLength);
    }
};

然后在使用时初始布局将是方形的pack()(根据 Andrew Thompson 的回答,您应该使用它)。

编辑:更改了首选尺寸以考虑按钮的正常首选尺寸。(再次归功于 A. Thompson)。

于 2013-09-16T21:27:05.510 回答
3

进行如下所示的更改。

public void go() {
    grid.setLayout(new GridLayout(10,10));

    //frame.setSize(500,500);
    frame.pack();
    frame.setVisible(true);
}

这里的技巧根本不是改变按钮,而是让 GUI 调整到按钮的大小。这是通过调用pack()which..

使此 Window 调整大小以适合其子组件的首选大小和布局。..

于 2013-09-16T21:14:31.733 回答