我正在阅读Head First Java,但我对这个程序感到困惑

时间:2012-03-15 11:50:48

标签: java swing

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的代码(我正在阅读中文版,也许它不在英文版的同一页面。)如果成功,应该有一个点从左边开始但是,我在窗口看不到任何东西。

3 个答案:

答案 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)

如果这个片段是从书中直接复制粘贴的话,我会把书扔掉

  • Swing操作应该在EDT上进行,因此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

4)学习Java Naming Convention