Я пытаюсь написать программу, которая позволяет пользователю рисовать многоугольник, рисуя линию каждый раз, когда они нажимают внутри рамки. При первом щелчке следует нарисовать небольшой квадрат. При каждом следующем нажатии следует отобразить строку, где конечная точка последней строки находится там, где пользователь нажал. Как только пользователь нажимает на квадрат, который был сделан первоначально, полигон будет завершен, и квадрат исчезнет. Мой код выглядит следующим образом. он работает, но он работает неправильно.Рисование многоугольника на основе кликов
import java.awt.Rectangle;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.geom.Point2D;
import java.awt.geom.Point2D.Double;
import java.util.ArrayList;
import javax.swing.JFrame;
public class DrawPolygonComponent {
public static void main(String[] args) {
final JFrame frame = new JFrame();
frame.setSize(300, 400);
frame.setTitle("Draw a Polygon");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final ArrayList<Point2D.Double> path = new ArrayList();
//addRectangle(frame, 10, 10);
//
class ClickListener implements MouseListener {
@Override
public void mouseClicked(MouseEvent me) {
if (path.isEmpty()) {
System.out.println("First");
addRectangle(frame, me.getX(),me.getY());
path.add(new Point2D.Double(me.getX(),me.getY()));
} else {
System.out.println("Second");
Point2D.Double prev = path.get(path.size()-1);
addLine(frame, (int) prev.x, (int) prev.y,me.getX(),me.getY());
path.add(new Point2D.Double(me.getX(),me.getY()));
frame.repaint();
}
}
public void mousePressed(MouseEvent me) {}
public void mouseReleased(MouseEvent me) {}
public void mouseEntered(MouseEvent me) {}
public void mouseExited(MouseEvent me) {}
}
MouseListener listener = new ClickListener();
frame.addMouseListener (listener);
frame.setVisible (true);
}
public static void addRectangle(JFrame frame, int x , int y) {
RectangleComponent r = new RectangleComponent(x, y, 10, 10);
frame.add(r);
}
public static void addLine(JFrame frame, int x1, int y1, int x2, int y2) {
LineComponent line = new LineComponent(x1, y1, x2, y2);
frame.add(line);
}
}
/////////other
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import javax.swing.JComponent;
public class LineComponent extends JComponent {
private int px;
private int py;
private int x;
private int y;
public LineComponent(int px, int py, int x, int y){
this.px=px;
this.py=py;
this.x=x;
this.y=y;
}
@Override
public void paintComponent(Graphics g){
Graphics2D g2 = (Graphics2D)g;
g2.drawLine(px,py,x,y);
}
}
////////other
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import javax.swing.JComponent;
public class RectangleComponent extends JComponent {
private Rectangle box;
public RectangleComponent(int x,int y, int l, int w){
box = new Rectangle(x,y,l,w);
}
public void paintComponent(Graphics g){
Graphics2D g2 = (Graphics2D)g;
g2.fill(box);
g2.draw(box);
}
}
Побольше Precission. Какая часть этого терпит неудачу? Как это происходит? Просто сбрасывая код и ожидая, что кто-то его решит, он не очень хорошо отражается на ваших усилиях. – SJuan76
Я не знаю, какая часть терпит неудачу. Мне кажется, что все в порядке и должно работать должным образом, но при запуске он просто представляет пустой кадр. При щелчке не распечатывается ни строчка, ни квадрат. – BraxtonLanc
Ну, это больше информации для начала ... нет эксперта с графическим интерфейсом, но вы добавляете компоненты в JFrame ... вам нужно переопределить метод JFrame 'paintComponent', а не добавлять компоненты с этим метод переоценивается. Когда вы добавляете их, JFrame пытается разобраться с ними как с разными объектами, каждый из которых имеет разные прямоугольные области. – SJuan76