当前位置: 首页 > 知识库问答 >
问题:

actionPerformed仅在计时器启动时运行

满子实
2023-03-14

苏,希望你们都没事。出于某种原因,在我的java代码中,当我按下一个键(当它工作时),我的ActionListener要求我保持计时器启动,否则会绘制一个矩形并显示JLabel simple的条件不会运行,因为ActionListener无法调用它。

这是工作代码。

package Game;

import javax.swing.JPanel;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyAdapter;
import java.awt.Color;
import java.awt.Toolkit;
import java.awt.Dimension;
import javax.swing.ImageIcon;
import java.awt.Image;
import java.awt.Point;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JLabel;
import java.awt.Font;
import java.awt.Rectangle;
import javax.swing.Timer;

public class Riven extends JPanel implements ActionListener
{
    private keyBindings kb;
    private int C_ImageID = 0;
    private Dimension size = Toolkit.getDefaultToolkit().getScreenSize(); //Get screen resolution
    private Image C_Image;
    JLabel mouseX = new JLabel();
    private final int DELAY = 10;
    private Timer timer;

    public Riven()
    {
        initRiven();
    }

    private void initRiven()
    {
        addKeyListener(new TAdapter());
        setBackground(Color.black);
        loadImage();
        setFocusable(true);

        kb = new keyBindings(); //set keyBindings

        //Configuring the Debug JLabel
        mouseX.setFont(new java.awt.Font("Microsoft YaHei UI", Font.PLAIN, 16)); //Set configurations such as Font, and size
        mouseX.setText("Test");
        mouseX.setOpaque(false);
        mouseX.setForeground(Color.white);
        add(mouseX);

        setLayout(null);
        mouseX.setBounds(new Rectangle(new Point(200, 300), mouseX.getPreferredSize()));
        mouseX.setLocation(mouseX.WIDTH + 10, 10);
        mouseX.setVisible(false);

        timer = new Timer(DELAY, this);
        timer.start();
    }

    private void loadImage()
    {
        String imagedir = showImage.importImage(C_ImageID, size);
        ImageIcon ii = new ImageIcon(imagedir);
        C_Image = ii.getImage();
    }

    //Paints
    @Override
    public void paintComponent(Graphics g)
    {
        g.drawImage(C_Image, 0, 0, null); //Draw the front frame
        paintDBG(g);
    }

    private void paintDBG(Graphics g)
    {
        Graphics2D g2d = (Graphics2D) g;

        if (kb.getDBG()) //If the debug is set to ON
        {
            //set shape color
            g2d.setPaint(Color.black);

            //drawing the rectangle
            g2d.fillRect(0, 0, size.width / 10 , size.height / 10);
            mouseX.setVisible(true);
        }
        else
        {
            g2d.dispose();
            mouseX.setVisible(false);
        }
    }

    @Override
    public void actionPerformed(ActionEvent e)
    {
        repaint();
    }
    
    //Key Bindings
    private class TAdapter extends KeyAdapter
    {
        @Override
        public void keyPressed(KeyEvent e)
        {
            System.out.print("Entrei");
            kb.keyPressed(e);
        }

        @Override
        public void keyReleased(KeyEvent e)
        {
            System.out.print("Sai");
            kb.keyReleased(e);
        }
    }
}

下面是使actionEvent不执行的原因

package Game;

import javax.swing.JPanel;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyAdapter;
import java.awt.Color;
import java.awt.Toolkit;
import java.awt.Dimension;
import javax.swing.ImageIcon;
import java.awt.Image;
import java.awt.Point;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JLabel;
import java.awt.Font;
import java.awt.Rectangle;
import javax.swing.Timer;

public class Riven extends JPanel implements ActionListener
{
    private keyBindings kb;
    private int C_ImageID = 0;
    private Dimension size = Toolkit.getDefaultToolkit().getScreenSize(); //Get screen resolution
    private Image C_Image;
    JLabel mouseX = new JLabel();
    private final int DELAY = 10;
    private Timer timer;

    public Riven()
    {
        initRiven();
    }

    private void initRiven()
    {
        addKeyListener(new TAdapter());
        setBackground(Color.black);
        loadImage();
        setFocusable(true);

        kb = new keyBindings(); //set keyBindings

        //Configuring the Debug JLabel
        mouseX.setFont(new java.awt.Font("Microsoft YaHei UI", Font.PLAIN, 16)); //Set configurations such as Font, and size
        mouseX.setText("Test");
        mouseX.setOpaque(false);
        mouseX.setForeground(Color.white);
        add(mouseX);

        setLayout(null);
        mouseX.setBounds(new Rectangle(new Point(200, 300), mouseX.getPreferredSize()));
        mouseX.setLocation(mouseX.WIDTH + 10, 10);
        mouseX.setVisible(false);

        //timer = new Timer(DELAY, this);
        //timer.start();
    }

    private void loadImage()
    {
        String imagedir = showImage.importImage(C_ImageID, size);
        ImageIcon ii = new ImageIcon(imagedir);
        C_Image = ii.getImage();
    }

    //Paints
    @Override
    public void paintComponent(Graphics g)
    {
        g.drawImage(C_Image, 0, 0, null); //Draw the front frame
        paintDBG(g);
    }

    private void paintDBG(Graphics g)
    {
        Graphics2D g2d = (Graphics2D) g;

        if (kb.getDBG()) //If the debug is set to ON
        {
            //set shape color
            g2d.setPaint(Color.black);

            //drawing the rectangle
            g2d.fillRect(0, 0, size.width / 10 , size.height / 10);
            mouseX.setVisible(true);
        }
        else
        {
            g2d.dispose();
            mouseX.setVisible(false);
        }
    }

    @Override
    public void actionPerformed(ActionEvent e)
    {
        repaint();
    }
    
    //Key Bindings
    private class TAdapter extends KeyAdapter
    {
        @Override
        public void keyPressed(KeyEvent e)
        {
            System.out.print("Entrei");
            kb.keyPressed(e);
        }

        @Override
        public void keyReleased(KeyEvent e)
        {
            System.out.print("Sai");
            kb.keyReleased(e);
        }
    }
}

共有1个答案

谷彦君
2023-03-14

您似乎在问,除非打开Swing计时器,否则为什么永远不会调用ActionListener中的代码。

原因是,Swing库是一个事件驱动的GUI库,这个库有监听器类,当它们正确地连接到代码中时,它们有回调方法,这些方法是响应程序运行时发生的事件而调用的,例如仅在发生按键时调用。

ActionListeners也是如此。只有当侦听器连接到事件生成器并且该生成器生成事件时,才会调用它们的代码。对于ActionListener,事件生成器可能是一个JButton(通过addActionListener),然后在按下JButton时调用侦听器代码,或者可以将其连接到一个Swing计时器,当计时器启动时,会生成一个事件,该事件会在计时器停止前每隔一个计时器延迟毫秒重复一次。

代码的其他问题:

  • 始终在覆盖中调用super的paintComponent方法。否则,不进行内务处理绘画,如清洁脏像素
 类似资料:
  • 问题内容: 我需要在Java应用程序中启动1-3个外部程序,这些程序具有用户定义的路径。我有几个要求: 如果程序已经在运行,我不希望其执行 我不希望任何程序从我的Java应用程序中夺走焦点 我不在乎其中任何一个是否无法启动。他们只需要默默地失败。 到目前为止,这是我想出的: 然后我再用其他两条路径重复3次。就像我期望的那样开始,并满足了我的第三个要求,但是在前两个条件上却失败了。 做这个的最好方式

  • 我的团队拥有一个非回归测试项目。在这个项目中,有代码和非回归测试。像经典项目一样,我们希望使用linter或其他工具分析我们的代码。但是我们不想在每个分支上为每个提交运行测试,它们持续数小时。我们希望手动启动这些测试。 要专门在master上运行测试,我们在Jenkinsfile中包含以下内容: 但是一旦我们将我们的分支合并到master中,就会触发一个基于master的构建并启动测试。 为了避免

  • 问题内容: 我需要一些有关在PHP中启动和停止计时器的信息。我需要测量从我的.exe程序开始(我在PHP脚本中使用函数)到完成执行并显示所花费的时间(以秒为单位)之后经过的时间。 我怎样才能做到这一点? 问题答案: 您可以使用并计算差异: 这是PHP的文档:http : //php.net/manual/zh/function.microtime.php

  • 问题内容: 我正在使用Camel&Spring进行Java项目。在Spring完成其工作并且Camel完成所有路径的构建之后,我们想在单例bean上触发一个initialize方法。 我们无法在类创建时调用该方法,因为它具有从@Component spring批注中拾取的与其他类的动态链接,并且我们不知道何时/是否已加载这些类,而尚未真正将init方法作为a的一部分运行构造函数。 我如何才能在Ca

  • 我正在使用Windows server 2008 r2我安排了一项任务,每天10:00开始,运行8小时。如果服务器重新启动并且时间在10-18之间,那么任务应该尽快开始,否则它不应该运行。 如果我在启动时设置触发器,它随时启动。 如果我设置了“尽快运行”选项并且服务器在启动时没有工作,那么当服务器启动时,任务就会启动,如果任务“今天”已经启动,则不会自动重新启动。 所以我问你的建议:是否可以仅使用

  • 问题内容: 首先,这可能需要移至超级用户。我无法确定哪个场地更好。 我正在尝试编写一个将在启动/重新启动时运行的R脚本,并将该计算机添加到doRedis工作者池中。(doRedis是一个foreach后端)。 这是我的R脚本“〜/ Rworker.R” 我可以使用command从命令行运行此脚本 。 接下来,我编写了一个shell脚本来运行R脚本,标题为“ /etc/init.d/StartWor