Что я пытаюсь сделать: нарисуйте вертикальную и горизонтальную линии, которые перпендикулярны друг другу и встречаются там, где указывает мышь. Этакий курсор-трекер.
Моя структура: JFrame -> CustomPanel -> другие панели/компоненты и т.д.
CustomPanel наследуется от JPanel и устанавливается как ContentPane моего JFrame.
Я пытался использовать GlassPane, все работало отлично, но я хочу сохранить свои события, а не отключать их. Я все еще хочу иметь возможность нажимать кнопки и т.
На изображении он должен был продолжить рисование над кнопкой, но он остановился, когда я вошел в него, а затем возобновился, когда я вышел.
Код ниже.
public class Painter {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
JFrame frame = new JFrame();
frame.setSize(600, 600);
frame.setPreferredSize(new Dimension(600, 600));
frame.setContentPane(new CustomPanel());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
class CustomPanel extends JPanel {
int x = 0;
int y = 0;
public CustomPanel() {
addMouseListener(new AdapterImplementation(this));
addMouseMotionListener(new AdapterImplementation(this));
add(new JButton("TESTBTN"));
setSize(new Dimension(600, 600));
setPreferredSize(new Dimension(600, 600));
setVisible(true);
}
@Override
public void paint(Graphics g) {
super.paint(g);
g.drawLine(0, y, getWidth(), y);
g.drawLine(x, 0, x, getHeight());
}
public void setX(int x) {
this.x = x;
}
public void setY(int y) {
this.y = y;
}
}
и мой адаптер:
public class AdapterImplementation extends MouseAdapter {
CustomPanel pane;
public AdapterImplementation(CustomPanel pane) {
this.pane = pane;
}
@Override
public void mouseDragged(MouseEvent e) {
int x = e.getX();
int y = e.getY();
pane.setX(x);
pane.setY(y);
pane.repaint();
}
@Override
public void mouseMoved(MouseEvent e) {
System.out.println("MOUSE MOVED");
int x = e.getX();
int y = e.getY();
pane.setX(x);
pane.setY(y);
pane.repaint();
}
}