Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Swing:管理;“鼠标按下”;事件,直到组件释放为止_Java_Swing_Custom Controls - Fatal编程技术网

Java Swing:管理;“鼠标按下”;事件,直到组件释放为止

Java Swing:管理;“鼠标按下”;事件,直到组件释放为止,java,swing,custom-controls,Java,Swing,Custom Controls,在这里,在我的自定义面板中,我尝试在用户单击自定义呼吸机组件(它只是一个蓝色正方形,该组件是从JButton继承的)时击退一个球 但问题是,只有当用户单击呼吸机时,才会管理该事件,而不是在鼠标落在呼吸机上的所有时间。 这是我的不同课程。提前感谢 physicPanel.java MainFrame.java VentilatorPanel.java VentilatorComponent.java BallComponent.java 要获取鼠标处于按下状态时生成的事件,需要使用MouseMot

在这里,在我的自定义面板中,我尝试在用户单击自定义呼吸机组件(它只是一个蓝色正方形,该组件是从JButton继承的)时击退一个球

但问题是,只有当用户单击呼吸机时,才会管理该事件,而不是在鼠标落在呼吸机上的所有时间。

这是我的不同课程。提前感谢

physicPanel.java

MainFrame.java

VentilatorPanel.java

VentilatorComponent.java

BallComponent.java


要获取鼠标处于按下状态时生成的事件,需要使用MouseMotionListener并处理mouseDragged()事件。

要获取鼠标处于按下状态时生成的事件,需要使用MouseMotionListener并处理mouseDragged()事件。

无需阅读所有代码,问题可能如下:
Mousepressed
仅在用户按下按钮时触发一次。您必须将该状态保存在变量中(例如,
boolean pressed=true
),然后还要对将变量设置为false的
mousererelease
事件做出反应。通过变量的状态,您可以知道鼠标按钮当前是按下还是释放。

如果不读取所有代码,问题可能如下:
Mousepressed
仅在用户按下按钮时触发一次。您必须将该状态保存在变量中(例如,
boolean pressed=true
),然后还要对将变量设置为false的
mousererelease
事件做出反应。通过变量的状态,您可以知道鼠标按钮当前是按下还是释放。

但如果鼠标未移动,您是否也会收到这些事件?我尝试使用MouseDragged事件,但我只有在按下按钮的同时移入呼吸机时才能工作:但是如果鼠标不移动,你也会得到这些事件吗?我尝试使用MouseDragged事件,但我只有在按下按钮的同时移入呼吸机时才能工作:哦,你说得对,但我认为有一种方法可以在不保存状态的情况下管理它。不可能的?所以,我会按照你的建议去工作。谢谢:)不幸的是,在当前的类设计中,我无法避免在尝试实现鼠标“按下”功能时阻塞UI线程。而不是布尔变量,您可以启动一个新线程,它在
mousepressed
上执行
unsheeball
操作,并在
mousepressed
上终止线程。最后,我管理了:)我创建了一个新的线程子类,该子类将所需的Runnable作为参数,在其中,我编写了自己的finish()方法。这个新类的run()方法创建并启动runnable的新线程,而不需要完成这个子类。最后,runnable必须有一个简单的run()。。。没有任何循环(既不是while,也不是for,也不是do)。所以它是一种线程装饰器:)哦,你是对的,但我认为有一种方法可以在不保存状态的情况下管理它。不可能的?所以,我会按照你的建议去工作。谢谢:)不幸的是,在当前的类设计中,我无法避免在尝试实现鼠标“按下”功能时阻塞UI线程。而不是布尔变量,您可以启动一个新线程,它在
mousepressed
上执行
unsheeball
操作,并在
mousepressed
上终止线程。最后,我管理了:)我创建了一个新的线程子类,该子类将所需的Runnable作为参数,在其中,我编写了自己的finish()方法。这个新类的run()方法创建并启动runnable的新线程,而不需要完成这个子类。最后,runnable必须有一个简单的run()。。。没有任何循环(既不是while,也不是for,也不是do)。所以它是一种线程装饰器:)是的,这是因为我一方面开始我的项目计划添加其他选项卡式窗格,而在这里我喜欢重用,我通过创建组件而不是仅仅管理面板中的所有组件使管理更容易是的,这是因为我一方面开始我的项目计划添加其他选项卡式窗格,在这里,我倾向于重用,我通过创建组件而不是仅仅管理面板中的所有组件,使管理更加容易
package com.gmail.loloof64.java_swing.physics_panels;

import com.gmail.loloof64.java_swing.physics_panels.gui.MainFrame;

public class PhysicsPanels {

    public static void main(String[] args) {
        new MainFrame().setVisible(true);
    }

}
package com.gmail.loloof64.java_swing.physics_panels.gui;

import javax.swing.JFrame;
import javax.swing.JTabbedPane;

import com.gmail.loloof64.java_swing.physics_panels.gui.the_panels.VentilatorPanel;

public class MainFrame extends JFrame {

    public MainFrame(){
        setIntrinsicsProperties();
        addPanels();
    }

    private void setIntrinsicsProperties() {
        setSize(400, 300);
        setTitle("Physics panels application");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
    }

    private void addPanels() {
        JTabbedPane mainContainer = new JTabbedPane();
        add(mainContainer);
        mainContainer.addTab("Ventilator", new VentilatorPanel());
        /*
         * This tab is not usefull for the question =>
         * mainContainer.addTab("Rotating plate", new RotatingPlatePanel());
         */
    }

    private static final long serialVersionUID = 1L;

}
package com.gmail.loloof64.java_swing.physics_panels.gui.the_panels;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;

import javax.swing.JPanel;

import com.gmail.loloof64.java_swing.physics_panels.custom_components.BallComponent;
import com.gmail.loloof64.java_swing.physics_panels.custom_components.VentilatorComponent;

public class VentilatorPanel extends JPanel {

    public VentilatorPanel(){
        setBackground(Color.WHITE);
        setLayout(null);

        ventilatorObject.setSimpleTaskOnMousedPressed(new Runnable() {

            @Override
            public void run() {
                repulseBall();
            }

        });
        add(ventilatorObject);
        add(ballObject);
        ventilatorObject.setLocation(100, 80);
        ballObject.setLocation(160, 90);
    }

    @Override
    public void paint(Graphics graphics) {
        super.paint(graphics);
    }

    private void repulseBall(){
        Point oldBallLocation = ballObject.getLocation();
        ballObject.setLocation(oldBallLocation.x + 5, oldBallLocation.y);
        repaint();
    }

    private VentilatorComponent ventilatorObject = new VentilatorComponent(60,60);
    private BallComponent ballObject = new BallComponent(40);
    private static final long serialVersionUID = 1L;

}
package com.gmail.loloof64.java_swing.physics_panels.custom_components;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JButton;

public class VentilatorComponent extends JButton {

    public VentilatorComponent(Dimension size){
        super();
        enableInputMethods(true);
        addMouseListener(new MouseAdapter() {

            @Override
                public void mousePressed(MouseEvent event) {
                    doReactToClick();
                }
        });
        setSize(size);
    }

    public VentilatorComponent(int width, int height){
        this(new Dimension(width, height));
    }

    /**
     * Sets the task that will be executed on mouse pressing.
     * Be carefull !!! Must be a very simple task (no looping inside)
     * @param r - Runnable
     */
    public void setSimpleTaskOnMousePressed(Runnable task){
        taskOnClick = task;
    }

    protected void doReactToClick() {
        new Thread(taskOnClick).run();
    }

    @Override
    protected void paintComponent(Graphics graphics) {
        super.paintComponent(graphics);
        graphics.setColor(Color.BLUE);
        graphics.fillRect(0, 0, getWidth(), getHeight());
    }

    private Runnable taskOnClick;
    private static final long serialVersionUID = 1L;

}
package com.gmail.loloof64.java_swing.physics_panels.custom_components;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.JComponent;

public class BallComponent extends JComponent {

    public BallComponent(int diameter){
        setSize(new Dimension(diameter, diameter));
    }   

    @Override
    public void paintComponent(Graphics graphics) {
        graphics.setColor(Color.RED);
        graphics.fillOval(0,0, getWidth(), getHeight());
    }

    private static final long serialVersionUID = 1L;

}