Я пытаюсь построить небольшую программу на Java OOP, которая будет отображать овал, который меняет свою позицию на координаты щелчка мышью. Однако, поскольку я новичок, я не знаю, как это закончить.
Кто-нибудь знает, что не так в моей программе?
public class OvalWindow {
JFrame window;
int windowWidth = 500;
int windowHeight = 500;
OvalPanel panel;
public void run() {
//Set a window
window = new JFrame("Oval moving");
window.setVisible(true);
window.setSize(windowWidth, windowHeight);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Create a panel and add it to the window
panel = new OvalPanel();
window.setContentPane(panel);
//Change the location on mouse input
panel.addMouseListener(new OvalMouseClick(panel));
}
public static void main(String[] args) {
OvalWindow oWndow = new OvalWindow();
oWndow.run();
}
}
Файл: Oval.java Создать овальный класс
public class Oval {
private int diameter;
private int x;
private int y;
private Color color;
public Oval(int x, int y, int diameter, Color color) {
this.x = x;
this.y = y;
this.diameter = diameter;
this.color = color;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public int getDiameter() {
return diameter;
}
public Color getColor() {
return color;
}
/*
* Draw the oval
*/
public void draw(Graphics g) {
g.fillOval(x, y, diameter, diameter);
g.setColor(color);
}
}
Файл: OvalPanel.java Этот класс добавляет объекты овалы на экран. Также задается начальная позиция овала
public class OvalPanel extends JPanel{
Oval oval;
public void addOval(Oval oval) {
oval = new Oval(100, 100, 50, Color.BLACK);
this.repaint();
}
public void paintComponent(Graphics g){
oval.draw(g);
}
}
Файл: OvalMouseClick.java Этот класс добавляет новый овал на экран, в той же позиции, что и координаты, на которые щелкает мышь.
public class OvalMouseClick extends MouseAdapter{
OvalPanel panel;
public OvalMouseClick(OvalPanel panel) {
this.panel = panel;
}
@Override
public void mouseClicked(MouseEvent e) {
panel.addOval(new Oval(e.getX(), e.getY(), 50, Color.BLUE));
}
}
3 ответа
В случае, если кто-то ищет ответ. Вот мое решение:
Я изменил файл: OvalWindow.java
public class OvalWindow {
JFrame window;
OvalPanel panel;
int windowWidth = 500;
int windowHeight = 500;
/**
* Run the program
*/
public void run() {
// Set a window
window = new JFrame("Oval moving");
window.setVisible(true);
window.setSize(windowWidth, windowHeight);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Create a panel and add it to the window
panel = new OvalPanel();
window.add(panel, BorderLayout.CENTER);
panel.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
panel.moveToCoord(e);
}
});
}
public static void main(String[] args) {
OvalWindow oWndow = new OvalWindow();
oWndow.run();
}
}
Я также значительно изменил файл: OvalPanel.java
public class OvalPanel extends JPanel {
Oval oval;
int x = 50;
int y = 10;
int diameter = 50;
Color color = Color.BLUE;
public void moveToCoord(MouseEvent e) {
x = e.getX() - diameter / 2;
y = e.getY() - diameter / 2;
repaint();
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
oval = new Oval(x, y, diameter, color);
oval.draw(g);
}
}
На файл: Oval.java было только небольшое изменение:
public void draw(Graphics g) {
g.setColor(color);
g.fillOval(x, y, diameter, diameter);
}
Файл: OvalMouseClick.java был удален.
Напишите собственный метод paintComponent()
, чтобы ваш OvalPanel
действительно что-то отображал. Если вы добавите к нему компоненты, они будут отображаться автоматически, но ваш Oval
класс не является компонентом (в смысле пользовательского интерфейса), поэтому вам необходимо явно написать код для их отображения.
@Override
public void paintComponent(Graphics g) {
for(Oval o : ovals)
o.draw(g);
}
Я также рекомендую прочитать след Swing по адресу https://docs.oracle.com/javase/tutorial / uiswing / потому что вы не можете просто "угадать", как все работает. Качели сложны, и вам нужно понять, что они делают. Тогда вы поймете, что draw(Graphics g)
и paintComponent(Graphics g)
- это больше, чем похожие методы с другим именем.
Просто позвольте классу «OvalMouseClick» реализовать интерфейс MouseListener. Если вы хотите что-то сделать, когда мышь двигается, просто позвольте классу также реализовать интерфейс «MouseMotionListener». Для MouseWheel вы можете использовать интерфейс «MouseWheelListener».
Новые вопросы
java
Java - это язык программирования высокого уровня. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег редко используется отдельно и чаще всего используется вместе с [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] и [maven].