【发布时间】:2023-01-11 05:17:32
【问题描述】:
我试图让这个 JPanel 在按下一个按钮时显示一个生成的迷宫,并给出它的大小。
我成功地获得了大小,并生成了一个我知道 actionPerformed() 可以访问的迷宫。 单击该按钮时,它让我知道实际上已经创建了一个迷宫,但没有显示它。
我有 paint 方法遍历迷宫数组并填充矩形来显示它。但我不确定它何时被调用或如何手动调用它。 我是 GUI 的新手,所以请理解。
public class View extends JFrame implements ActionListener{
private static JPanel maze_box;
private static JLabel message;
private static JButton generate_button;
private static JTextField maze_size;
private static JTextField start_stop;
private static JButton solve_button;
private String coords;
private String size;
private final ArrayList<Integer> path = new ArrayList<Integer>();
private int[][] maze = {{}};
public void paint(Graphics g){
super.paint(g);
g.translate(50,50);
int scale = maze_box.getWidth()/maze.length;
for(int row=0; row<maze.length; row++){
for(int col=0; col<maze[0].length; col++){
System.out.println("drawing");
Color color;
switch (maze[row][col]) {
case 1 : color = Color.BLACK; break;
case 9 : color = Color.RED; break;
default : color = Color.WHITE;
};
g.setColor(color);
g.fillRect(10*col, 10*row, 10, 10);
g.setColor(Color.BLACK);
g.drawRect(10*col, 10*row, 10, 10);
}
}
for(int p=0; p<path.size(); p+=2){
System.out.println("drawing");
int pathX = path.get(p);
int pathY = path.get(p+1);
g.setColor(Color.GREEN);
g.fillRect(pathX*10, pathY*10, 10,10);
}
super.paint(g);
}
public static void main(String[] args){
JPanel panel = new JPanel();
JFrame frame = new JFrame();
frame.setSize(800,800);
frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
frame.add(panel);
frame.setVisible(true);
panel.setLayout(null);
maze_box = new JPanel();
maze_box.setBounds(100, 20, 600, 400);
maze_box.setBackground(Color.GRAY);
panel.add(maze_box);
message = new JLabel();
message.setBounds(200, 400, 200, 30);
panel.add(message);
maze_size = new JTextField("size");
maze_size.setBounds(200, 550, 100, 30);
panel.add(maze_size);
generate_button = new JButton("Generate Maze");
generate_button.setBounds(500, 550, 100, 30);
panel.add(generate_button);
generate_button.addActionListener( new View());
start_stop = new JTextField("coords");
start_stop.setBounds(200, 600, 100, 30);
panel.add(start_stop);
solve_button = new JButton("Solve!");
solve_button.setBounds(500, 600, 100, 30);
panel.add(solve_button);
solve_button.addActionListener(new View());
}
@Override
public void actionPerformed( ActionEvent aActionEvent ) {
if ( aActionEvent.getSource() == generate_button ){
this.size = maze_size.getText();
try{
int sized = Integer.parseInt(this.size);
if(sized>199){
message.setText("Please choose a smaller width");
}if(sized<=0 || this.size.equals("")){
message.setText("Please enter valid numbers");
}else{
System.out.println("generating: ");
this.maze = new Generate(sized,sized).maze;
System.out.println("done "+ this.maze[0][2]);
}
}catch(NumberFormatException e){
message.setText("Please enter valid numbers");
}
}
}
}
【问题讨论】:
-
生成迷宫后尝试添加
repaint()。甚至在你尝试之前,尝试调整你的框架大小,看看它是否出现(我认为应该) -
在我调整窗口大小之前,“坐标”和“解决”按钮不会出现。但是 repaint() 什么也没做,框仍然是空白的。
-
你为什么两次打电话给
super.paint?事实上,你为什么要覆盖paint(尤其是顶级容器),这是一个问题的根源。generate_button.addActionListener(new View());<- 创建View的新实例也是一个坏主意