开发者

Java Swing : managing the "MousePressed" event on a component until it is released

开发者 https://www.devze.com 2023-04-11 16:40 出处:网络
here I try, in my custom panel, to repulse a ball while a user click on a custom ventilator component (it is just a blue square, the component is inherited from JButton).

here I try, in my custom panel, to repulse a ball while a user click on a custom ventilator component (it is just a blue square, the component is inherited from JButton).

But the problem is that the event is only managed when the user click the ventilator, and not all the time the mouse is down on the ventilator.

Here my different classes. Thank in advance

PhysicsPanel.java

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

}

MainFrame.java

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;

}

VentilatorPanel.java

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;

}

VentilatorComponent.java

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;

}

BallComponent.java

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;

}


Without reading all of your code, the problem might be as follows: Mousepressed is triggered only once, when the user presses down the button. You have to save that state in a variable (e.g. boolean pressed = true), and then react also to mousereleased events, which set your variable to false. By the state of your variable you know then whether the mouse button is currently pressed or released.


To get events that are generated when the mouse is in a pressed state you need to use a MouseMotionListener and handle the mouseDragged() event.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号