import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class twobuttons
{
int x=70;
int y=70;
public static void main(String args[])
{
twobuttons gui =new twobuttons();
gui.go();
}
public void go()
{
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mydraw drawpanel = new mydraw();
frame.getContentPane().add(drawpanel);
frame.setSize(300,300);
frame.setVisible(true);
for(int i=0;i<130;i++)
{
x++;
y++;
drawpanel.repaint();
try
{
Thread.sleep(50);
}
catch(Exception ex)
{
}
}
}
class mydraw extends JPanel
{
public void paintconponent(Graphics g)
{
g.setColor(Color.green);
g.fillOval(x, y, 40, 40);
}
}
}
这是Head First Java的第12章p384的代码(我正在阅读中文版,也许它不在英文版的同一页面。)如果成功,应该有一个点从左边开始但是,我在窗口看不到任何东西。
答案 0 :(得分:5)
您在绘画类中有拼写错误(paintconponent =&gt; paintComponent)。所以你没有重写JComponent超类的行为。试试这个:
class mydraw extends JPanel
{
@Override
public void paintComponent(Graphics g)
{
g.setColor(Color.green);
g.fillOval(x, y, 40, 40);
}
}
答案 1 :(得分:4)
如果这个片段是从书中直接复制粘贴的话,我会把书扔掉
main
方法需要EventQueue.invokeLater
(或类似)Thread.sleep
上调用Thread
将无效。 StackOverflow充满了为什么Thread.sleep
无法在EDT上运行的问题,以及可能的解决方法。在这种情况下,我会使用Swing Timer
移动点并触发重绘
答案 2 :(得分:2)
1)在EDT期间从不使用Thread.sleep(int),此代码行导致Swing GUI闪烁或冻结,例如冻结here
2)Swing GUI应该在Initial Threads
中启动3)使用Swing Time r进行动画或暂停Swing GUI