我正在尝试使用以下代码创建动态GridLayout:
package resizablegui;
import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
class GUIHandler extends JFrame {
JSpinner widthSpinner;
JSpinner heightSpinner;
JPanel board;
private JPanel resizer() {
final JPanel resizer = new JPanel(new GridLayout(2,2));
final JPanel resizer_wrapper = new JPanel();
JLabel widthLabel;
JLabel heightLabel;
SpinnerModel widthModel;
SpinnerModel heightModel;
resizer_wrapper.setLayout(new BoxLayout(resizer_wrapper, BoxLayout.X_AXIS));
widthModel = new SpinnerNumberModel(8, 4, 32, 1);
heightModel = new SpinnerNumberModel(8, 4, 32, 1);
ResizeWindow onResize = new ResizeWindow();
widthLabel = new JLabel("Width: ");
resizer.add(widthLabel);
widthSpinner = new JSpinner(widthModel);
resizer.add(widthSpinner);
widthSpinner.addChangeListener(onResize);
heightLabel = new JLabel("Height: ");
resizer.add(heightLabel);
heightSpinner = new JSpinner(heightModel);
resizer.add(heightSpinner);
heightSpinner.addChangeListener(onResize);
resizer.setMaximumSize(new Dimension(100,100));
resizer_wrapper.add(resizer);
return resizer_wrapper;
}
private JPanel board(int width, int height) {
final JPanel board = new JPanel(new GridLayout(width, height));
for(int x = 0; x < width; x++) {
for(int y = 0; y < width; y++) {
JButton button = new JButton(x+", "+y);
board.add(button);
}
}
return board;
}
public GUIHandler() {
super("Board");
setLayout(new BorderLayout());
board = board(8,8);
add(resizer(), BorderLayout.NORTH);
add(board, BorderLayout.CENTER);
}
private class ResizeWindow implements ChangeListener {
@Override
public void stateChanged(ChangeEvent e) {
int width = (Integer)widthSpinner.getValue() * 45;
int height = (Integer)heightSpinner.getValue() * 45;
setSize(width,height);
}
}
}
public class ResizableGUI {
public static void main(String[] args) {
GUIHandler gui = new GUIHandler();
gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
gui.setSize(350,350);
gui.setVisible(true);
}
}
你可以说,目标是拥有一个8x8的按钮网格,根据微调器的值可以做得更大(ex 9x10,10x10 ......)或更小(ex 6x8,4x4) 。代码编译得很好,但在尝试调整对话框大小时,程序会冻结并崩溃。
答案 0 :(得分:2)
不确定为什么你的代码冻结和崩溃,它不会对我这样做。
无论如何,我仍然发现您的代码存在问题。
由于您需要动态网格,因此需要能够在使用微调器时删除/添加按钮。因此,我将创建并清空“board”面板并将其添加到GUI。然后我将你的“boar(...)”方法重命名为“resetBoard(...)”,因为这个方法应该用于删除/添加按钮,而不是创建一个新的面板。
下一个问题是你在这个新的“resetBoard(...)”方法中的循环代码。外部循环应该用于高度,内部循环用于宽度,因为您将一次一个地向网格添加按钮行。
因此,此方法的重组可能如下所示:
private void resetBoard(int width, int height) {
board.removeAll();
board.setLayout( new GridLayout(0, width) );
for(int y = 0; y < height; y++) {
for(int x = 0; x < width; x++) {
JButton button = new JButton(x+", "+y);
board.add(button);
}
}
}
所以现在你需要创建电路板并为其添加按钮:
//board = board(8,8);
board = new JPanel();
resetBoard(8, 8);
最后,在ChangeListener中你需要重置棋盘上的按钮,而不是改变框架的大小:
int width = (Integer)widthSpinner.getValue();
int height = (Integer)heightSpinner.getValue();
resetBoard(width,height);
board.revalidate();
//pack(); pack the frame is you wish
另外,首次创建框架时,请不要手动设置尺寸,让pack()方法为您完成工作:
//gui.setSize(350,350);
gui.pack();