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.
精彩评论