Java 摆动图形重新定位抽绳

Java 摆动图形重新定位抽绳,java,swing,graphics2d,Java,Swing,Graphics2d,我在用户屏幕上画了一个字符串,我想移动这个字符串,但它不会改变位置,这是我的代码 public static int x = 200, y = 200; public static Window draw() { Window w = new Window(null) { @Override public void paint(Graphics g) { super.paint(g); System

我在用户屏幕上画了一个字符串,我想移动这个字符串,但它不会改变位置,这是我的代码

public static int x = 200, y = 200;

    public static Window draw() {
    Window w = new Window(null) {
        @Override
        public void paint(Graphics g) {
            super.paint(g);
            System.out.println("repainting");
            final Font font = getFont().deriveFont(48f);
            g.setFont(font);
            g.setColor(Color.WHITE);
            final String message = "Hello";
            FontMetrics metrics = g.getFontMetrics();
            g.drawString(message, x, y);
        }

        @Override
        public void update(Graphics g) {
            paint(g);
        }
    };
    w.setAlwaysOnTop(true);
    w.setBounds(w.getGraphicsConfiguration().getBounds());
    w.setBackground(new Color(0, true));
    w.setVisible(true);
    return w;
}


  public static void main(String[] args) throws AWTException {
        Window window = draw();
        x = 500;
        y = 500;
        window.repaint();
        window.invalidate();
        }
    }

它似乎没有改变文本位置,它打印出
重新绘制
,因此调用了point方法,我在绘制方法内部打印了
x,y
,并且它似乎也被更新了,因此,不想绘制新字符串的图形有问题。

只需将窗口类全部删除并用JFrame替换即可。然后自定义类应该是一个JPanel,并且只重写paintComponent。我猜它不起作用,所以你正在经历一些事情使它起作用,最后你得到了一些相当狡猾的代码

import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Graphics;
import javax.swing.Timer;
import java.awt.EventQueue;

public class Confusion{
    static int x = 100;
    static int y = 0;
    static double theta = 0;

    public static void startGui(){
        JFrame frame = new JFrame("title");

        JPanel panel = new JPanel(){
            public void paintComponent(Graphics g){
                g.drawString("string", x, y);
            }
        };
        frame.setSize(640, 480);
        frame.add(panel);
        frame.setVisible(true);
        Timer timer = new Timer( 30, (e)->{
            x = (int)(300 + Math.sin(theta)*200);
            y = (int)(300 - Math.cos(theta)*200);
            theta += 0.1;
            panel.repaint();        
        } );
        timer.start();
    }
    public static void main(String[] args) throws Exception {
        EventQueue.invokeAndWait( Confusion::startGui );   
    }
}

这太可怕了。为什么要覆盖“更新”?什么是窗户,那是AWT窗户吗?你为什么要覆盖油漆?您应该制作一个添加到窗口的组件,并覆盖该组件。最重要的是,你永远不会改变x/y,那么字符串将如何移动?@matt,我改变了原始代码中的x,y,有一个
,而
循环改变了x,y。我试图在屏幕上画一个字符串,所以我创建了一个空的'java.awt.Window',并更新了画图方法来画一个字符串。x,y是一个全局变量。忘记包含在问题中,已更新。“忘记包含在问题中”忘记添加不可编译代码的位。为了更快地获得更好的帮助,请添加or。这似乎绘制了另一个字符串,而不是更改原始字符串的位置。“这似乎绘制了另一个字符串…”
public void paintComponent(图形g){
应该是
public void paintComponent(图形g){super.paintComponent(g);
删除以前的绘图。@AndrewThompson,谢谢我对swing的了解不是很好:)现在我更仔细地看了答案中的代码,还有两点。1)Java swing/AWT GUI应该在事件调度线程(EDT)上构造和更新.2)动画通常使用Swing
定时器来完成,这确保了GUI的任何更新都是在EDT上完成的。@AndrewThompson我同意第1点,我可以补充一点。我主要是试图指出一个实际使用Swing类而不是awt的方向,并覆盖适当的方法。我发现第2点取决于动画步骤。在这个简单的例子中,我同意你的观点。为了完整性,我将进行更新。