首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java中使用EventHandlers使形状来回移动

在Java中使用EventHandlers使形状来回移动
EN

Stack Overflow用户
提问于 2015-09-08 12:12:07
回答 1查看 1.3K关注 0票数 0

我认为我的标题很好地概括了我的问题。我对编程真的很陌生(大约2-3周使用Head First Java自学),我正在尝试使用Action Listener在屏幕上来回移动一个正方形,直到用户终止程序。我的问题是我有一个计时器和两个实现Action Listener的类。我可以让它来回运行一次,但这是我能做的所有事情。

代码语言:javascript
复制
package Animation;

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class Window extends JPanel implements ActionListener{
int x = 100;
Timer timer = new Timer(5, this);
int velX = 2;

public void paintComponent(Graphics  g){
    super.paintComponent(g);
    this.setBackground(Color.BLACK);
    g.setColor(Color.BLUE);
    g.fill3DRect(x, 150, 200, 200, true);
    timer.start();
    if(x >= 1000){
        timer.addActionListener(new HandlerClass());
            }//end if

    }//end paintComponent

public void actionPerformed(ActionEvent e){
    x += velX;
    repaint();
}//end actionP method

public class HandlerClass implements ActionListener{
    @Override
    public void actionPerformed(ActionEvent e) {
        if(x >= 100){
        x -= velX;
        repaint();
        }
    }//end actionP
}//end Handler

}//end Window

我见过这样的问题,人们使用按钮来回移动或移动设定的次数,但我希望计时器做所有的事情,直到用户退出。这样,用户只需观看即可。我没有在main方法中包含这个类,因为它只是设置gui并调用这个类。

EN

回答 1

Stack Overflow用户

发布于 2015-09-08 12:40:28

首先,看看Painting in AWT and SwingPerforming Custom Painting,了解有关Swing中绘画工作方式的更多细节。

基本上,Swing使用被动渲染算法,这意味着绘制周期可能会因为任何原因而在任何时间发生,大多数情况下不需要您的直接干预。

你不应该在任何paint方法中改变组件的状态,paint方法应该进行绘制,仅此而已。

这里有一些小问题,首先,你将Window类和HandlerClass作为ActionListener添加到Timer中,这意味着你可能会让这两个侦听器在对象移动的方向上相互竞争,最好将你的移动逻辑放在一个方法中,例如:

代码语言:javascript
复制
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Window extends JPanel {

    int x = 100;
    Timer timer = new Timer(5, new HandlerClass());
    int velX = 2;

    public Window() {
        this.setBackground(Color.BLACK);
        timer.start();
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(400, 400);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.BLUE);
        g.fill3DRect(x, 150, 200, 200, true);

    }//end paintComponent

    public class HandlerClass implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            x += velX;
            if (x + 200 >= getWidth()) {
                x = getWidth() - 200;
                velX *= -1;
            } else if (x < 0) {
                x = 0;
                velX *= -1;
            }
            repaint();
        }//end actionP
    }//end Handler

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new Window());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

}//end Window
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32449163

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档