Java Swing: управление событием MousePressed на компоненте до его выпуска - PullRequest
1 голос
/ 07 октября 2011

здесь я пытаюсь отбить шар в моей пользовательской панели, пока пользователь нажимает на пользовательский компонент вентилятора (это просто синий квадрат, компонент унаследован от JButton).

Но проблема в том, что событие управляется только тогда, когда пользователь нажимает на вентилятор, а не все время, пока мышь на нем нажимает.

Здесь мои разные занятия. Заранее благодарен

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;

}

Ответы [ 2 ]

3 голосов
/ 07 октября 2011

Без чтения всего вашего кода проблема может быть в следующем: Mousepressed срабатывает только один раз, когда пользователь нажимает кнопку. Вы должны сохранить это состояние в переменной (например, boolean pressed = true), а затем реагировать также на mousereleased события, которые устанавливают для вашей переменной значение false. По состоянию вашей переменной вы знаете, нажата или отпущена кнопка мыши.

1 голос
/ 07 октября 2011

Чтобы получить события, которые генерируются, когда мышь находится в нажатом состоянии, вам нужно использовать MouseMotionListener и обрабатывать событие mouseDragged ().

...