I';我在读《头先Java》,但我对这个程序感到困惑 import javax.swing.*; 导入java.awt.*; 导入java.awt.event.*; 公共类两个按钮 { int x=70; int y=70; 公共静态void main(字符串参数[]) { twobuttons gui=新twobuttons(); gui.go(); } 公开作废go() { JFrame=新JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); mydraw drawpanel=新建mydraw(); frame.getContentPane().add(drawpanel); 框架。设置尺寸(300300); frame.setVisible(true); 对于(int i=0;i

I';我在读《头先Java》,但我对这个程序感到困惑 import javax.swing.*; 导入java.awt.*; 导入java.awt.event.*; 公共类两个按钮 { int x=70; int y=70; 公共静态void main(字符串参数[]) { twobuttons gui=新twobuttons(); gui.go(); } 公开作废go() { JFrame=新JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); mydraw drawpanel=新建mydraw(); frame.getContentPane().add(drawpanel); 框架。设置尺寸(300300); frame.setVisible(true); 对于(int i=0;i,java,swing,Java,Swing,您在绘画类(paintconponent=>paintComponent)中有一个输入错误。因此您没有重写JComponent超类的行为。请尝试以下操作: 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[]) {

您在绘画类(paintconponent=>paintComponent)中有一个输入错误。因此您没有重写JComponent超类的行为。请尝试以下操作:

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);
        }
    }
}

如果这个片段是从书上粘贴下来的,我会把书扔掉

  • Swing操作应该发生在EDT上,因此
    main
    方法需要
    EventQueue.invokeLater
    (或类似)
  • 在执行绘制的同一
    线程上调用
    Thread.sleep
    ,将无法工作
StackOverflow充满了为什么
线程的问题。sleep
在EDT上不起作用,以及可能的解决方法。在这种情况下,我将使用Swing
计时器来移动点并触发重新绘制1)从不使用线程。在EDT期间,此代码行导致Swing GUI闪烁或冻结,例如关于冻结

2) Swing GUI应在中启动

3) 使用r进行Swing GUI的动画或暂停


4) 学习

我必须承认懒惰和粗心害死了我!真正的书很受尊敬,而且看起来更好。@trashgood,看起来确实更好。我自己从来没有读过这本书,所以我的评论只是基于问题中的片段
class mydraw extends JPanel
{

    @Override
    public void paintComponent(Graphics g)
    {
        g.setColor(Color.green);
        g.fillOval(x, y, 40, 40);
    }
}