здесь я пытаюсь отбить шар в моей пользовательской панели, пока пользователь нажимает на пользовательский компонент вентилятора (это просто синий квадрат, компонент унаследован от 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;
}