我写了一个课程,我们将这个问题称为DrawCard,在我的甲板课上显示随机抽取的扑克牌。我编写了一个图形对象,其中包含与扑克牌,套装,价值,颜色等相关的信息。我在main方法中初始化对象并将其添加到JFrame中,它会100%正确地显示和绘制所有内容。然后我添加了一个带有按钮的工具栏,其动作监听器应该创建一个新的DrawCard对象,从框架中删除第一个并将新的一个添加到框架中。程序编译并运行得很好但是当我点击按钮时它不会在框架上绘制新卡。它将删除第一个但不会将新的一个添加到帧中,即使我调用重绘方法。
以下是我在main方法中的代码:
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);
我尝试在主方法周围的几个不同的地方和我的actionlistener中调用我的JFrame上的重绘方法,但没有运气。我也试过以不同的顺序添加我的对象,但似乎没有任何工作。任何帮助将不胜感激!
答案 0 :(得分:1)
在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