Java 图形对象未更新?
Java Graphics Object Not Updating?
我已经写了一个class,我们将在这个问题中称这个为DrawCard,用于显示从我的牌组中随机抽取的一张扑克牌class。我编写了一个图形对象,其中包含与扑克牌、花色、价值、颜色等相关的信息。我在我的主要方法中初始化该对象并将其添加到 JFrame 中,它 100% 正确地显示和绘制所有内容。然后我添加了一个带有按钮的工具栏,其动作侦听器应该创建一个新的 DrawCard 对象,从框架中删除第一个对象并将新的添加到框架中。该程序编译并运行得很好,但是当我单击按钮时,它不会在框架上绘制新卡片。它会删除第一个,但不会将新的添加到框架中,即使我调用重绘方法也是如此。
这是我的主要方法中的代码:
JFrame frame = new JFrame("Paying Card");
JButton button = new JButton("Button 1");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
int width = 330;
int height = 500;
frame.setSize(width, height);
DrawPlayingCard drawCard = new DrawPlayingCard(1, 1,width,height,1, frame);
JToolBar toolBar = new JToolBar("This Tool Bar Does Nothing.");
toolBar.add(button);
toolBar.addSeparator();
Container contentPane = frame.getContentPane();
contentPane.add(toolBar, BorderLayout.NORTH);
frame.add(drawCard);
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
//Execute when button is pressed
frame.remove(drawCard);
frame.repaint();
//method signature:
//public DrawPlayingCard(int x, int y, int width, int height, int arcSize, JFrame frame);
DrawPlayingCard drawCard2 = new DrawPlayingCard(1, 1, width, height, 1, frame);
System.out.println("Card drawn");
frame.add(drawCard2);
}
});
frame.setLocationRelativeTo(null);
frame.setVisible(true);
我曾尝试在 main 方法周围和 actionlistener 内部的几个不同位置调用我的 JFrame 上的 repaint 方法,但没有成功。我也尝试过以不同的顺序添加我的对象,但似乎没有任何效果。任何帮助将不胜感激!
在 actionPerformed
中,您在添加第二张卡片之前执行 repaint
。尝试在重新绘制之前添加第二张卡片,例如
frame.remove(drawCard);
DrawPlayingCard drawCard 2 = new DrawPlayingCard(1, 1, width, height, 1, frame);
frame.add(drawCard2);
frame.validate(); // this is what needs to be called to actually paint drawCard2
frame.repaint();
编辑:我的回答不完整。尝试在重绘之前调用 frame.validate()
。框架需要知道它需要在重新绘制时绘制新组件。类似问题供参考:repaint() in Java
我已经写了一个class,我们将在这个问题中称这个为DrawCard,用于显示从我的牌组中随机抽取的一张扑克牌class。我编写了一个图形对象,其中包含与扑克牌、花色、价值、颜色等相关的信息。我在我的主要方法中初始化该对象并将其添加到 JFrame 中,它 100% 正确地显示和绘制所有内容。然后我添加了一个带有按钮的工具栏,其动作侦听器应该创建一个新的 DrawCard 对象,从框架中删除第一个对象并将新的添加到框架中。该程序编译并运行得很好,但是当我单击按钮时,它不会在框架上绘制新卡片。它会删除第一个,但不会将新的添加到框架中,即使我调用重绘方法也是如此。
这是我的主要方法中的代码:
JFrame frame = new JFrame("Paying Card");
JButton button = new JButton("Button 1");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
int width = 330;
int height = 500;
frame.setSize(width, height);
DrawPlayingCard drawCard = new DrawPlayingCard(1, 1,width,height,1, frame);
JToolBar toolBar = new JToolBar("This Tool Bar Does Nothing.");
toolBar.add(button);
toolBar.addSeparator();
Container contentPane = frame.getContentPane();
contentPane.add(toolBar, BorderLayout.NORTH);
frame.add(drawCard);
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
//Execute when button is pressed
frame.remove(drawCard);
frame.repaint();
//method signature:
//public DrawPlayingCard(int x, int y, int width, int height, int arcSize, JFrame frame);
DrawPlayingCard drawCard2 = new DrawPlayingCard(1, 1, width, height, 1, frame);
System.out.println("Card drawn");
frame.add(drawCard2);
}
});
frame.setLocationRelativeTo(null);
frame.setVisible(true);
我曾尝试在 main 方法周围和 actionlistener 内部的几个不同位置调用我的 JFrame 上的 repaint 方法,但没有成功。我也尝试过以不同的顺序添加我的对象,但似乎没有任何效果。任何帮助将不胜感激!
在 actionPerformed
中,您在添加第二张卡片之前执行 repaint
。尝试在重新绘制之前添加第二张卡片,例如
frame.remove(drawCard);
DrawPlayingCard drawCard 2 = new DrawPlayingCard(1, 1, width, height, 1, frame);
frame.add(drawCard2);
frame.validate(); // this is what needs to be called to actually paint drawCard2
frame.repaint();
编辑:我的回答不完整。尝试在重绘之前调用 frame.validate()
。框架需要知道它需要在重新绘制时绘制新组件。类似问题供参考:repaint() in Java