Я в основном хочу сделать приложение с одним окном, где пользователь сможет рисовать сегментные линии. Потока приложение должно быть:Цепочка событий на Java Swing
- пользователь нажимает уникальную кнопку приложения для того, чтобы начать процесс
- пользователь выбирает нажатием на первую точку отрезка
- пользователь выбирает, нажав вторая точка отрезка
у меня уже есть следующий фрагмент кода:
public class LineEditor extends JComponent{
private class Point{
int x, y;
public Point(int x, int y){
this.x = x;
this.y = y;
}
}
private class Line{
Point a, b;
public Line(Point a, Point b){
this.a = a;
this.b = b;
}
}
private ArrayList<Line> lines = new ArrayList<Line>();
public void setLine(Point a, Point b){
lines.add(new Line(a, b));
repaint();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
for (Line line : lines) {
g.setColor(line.color);
g.drawLine(line.a.x, line.a.y, line.b.x, line.b.y);
}
}
public static void main(String[] args){
int height = 500, width = 500;
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Properties of the main window
frame.setAlwaysOnTop(true);
final LineEditor lineEditor = new LineEditor();
lineEditor.setPreferredSize(new Dimension(width, height));
JPanel panelCanvas = new JPanel();
panelCanvas.setPreferredSize(new Dimension(width, height));
JPanel secondaryPanel = new JPanel();
JButton addLineButton = new JButton("Add new line");
secondaryPanel.add(addLineButton);
frame.getContentPane().add(lineEditor, BorderLayout.CENTER);
frame.getContentPane().add(panelCanvas, BorderLayout.CENTER);
frame.getContentPane().add(secondaryPanel, BorderLayout.NORTH);
panelCanvas.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
int x = e.getX();
int y = e.getY();
}
});
addLineButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// x
}
});
frame.pack();
frame.setVisible(true);
}
}
Не знаю как:
- Активировать панельCanvas.addMouseListener только после того, как пользователь нажал кнопку.
- Получить координаты мыши (после щелчка было сделано) из addLineButton.addActionListener, так что я могу создать два объекта Point, и после этого сделать вызов lineEditor.setLine (pointB, точке А)
Я хочу добиться чего-то вроде:
addLineButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// Wait for the first user click
int x1 = mouseListener.getX();
int y1 = mouseListener.getY();
Point a = new Point(x1, y1);
// Wait for the second user click
int x2 = mouseListener.getX();
int y2 = mouseListener.getY();
Point b = new Point(x2, y2);
lineEditor.setLine(a, b);
}
});
Что вам может понадобиться какая-то модель, когда 'panelCanvas' в' MouseListener' может обновлять и из которых 'addLineButton' в' ActionListener' может читать. Лично я думаю, что у вас может быть это в обратном направлении, что должно произойти, так это использование должно выбрать «рисовать линию», а затем нажать на холсте точки, которые они хотят нарисовать между ними. Опять же, большая часть этого будет контролироваться какой-то моделью – MadProgrammer
Приводится пример [здесь] (http://stackoverflow.com/a/11944233/230513). – trashgod
@trashgod этот пример не был связан с тем, что я искал, но все еще является интересным образцом, который нужно иметь в виду. – Erwol