#java #swing #user-interface #move #shapes
#java #качать #пользовательский интерфейс #переместить #фигуры
Вопрос:
Я делаю проект, касающийся перемещения фигур, нарисованных в a JPanel
, но если я реализую a mouselistener
в своем классе, как я могу это сделать, если у меня нарисовано несколько фигур? В моем примере я нарисовал два прямоугольника. Это мой код:
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import static javax.swing.JFrame.EXIT_ON_CLOSE;
import javax.swing.JPanel;
public class NewClass1 extends JFrame{
JPanel panel2;
public NewClass1(){
JPanel container = new JPanel();
container.setLayout(new BoxLayout(container, BoxLayout.X_AXIS));
panel2 = new jPanel2();
container.add(panel2);
add(container);
setSize(300, 300);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
new NewClass1();
}
class jPanel2 extends JPanel {
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawRect(0, 0, 20, 20);
g.drawRect(21, 21, 20, 20);
}}
}
Комментарии:
1. Сохраняйте свои фигуры в
List
каком-то виде, затем вы выполняете базовое обнаружение попадания
Ответ №1:
java.awt.Rectangle
Класс доступен для хранения логических прямоугольников.
Я переработал ваш код и внес следующие изменения.
-
Я запустил приложение Swing с помощью вызова
SwingUtilities
invokeLater
метода. Этот метод гарантирует, что компоненты Swing создаются и выполняются в потоке отправки событий. -
Я создал и добавил два прямоугольника в
List
офRectangles
. -
JFrame
Методы должны вызываться в определенном порядке. Это порядок, который я использую для большинства своих приложений Swing. -
Я дал чертежу
JPanel
предпочтительный размер, а неJFrame
. Вы хотите знать, насколько велика ваша область рисования. РазмерJFrame
не имеет отношения к рисованию.
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class ShapesExample extends JFrame {
private static final long serialVersionUID = 1L;
private List<Rectangle> rectangles;
public ShapesExample() {
rectangles = new ArrayList<>();
rectangles.add(new Rectangle(10, 10, 20, 20));
rectangles.add(new Rectangle(41, 41, 20, 20));
setDefaultCloseOperation(EXIT_ON_CLOSE);
setTitle("Shapes Example");
add(new DrawingPanel());
pack();
setLocationByPlatform(true);
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new ShapesExample();
}
});
}
class DrawingPanel extends JPanel {
private static final long serialVersionUID = 1L;
public DrawingPanel() {
this.setPreferredSize(new Dimension(300, 300));
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.RED);
for (Rectangle rectangle : rectangles) {
g.drawRect(rectangle.x, rectangle.y,
rectangle.width, rectangle.height);
}
}
}
}