JohnMarston
16-11-2015, 15:21
Ciao a tutti. Passando il mouse sul frame, questa classe disegna due linee. Direi che va bene, il problema è che disegna in "ritardo". Un movimento rapido del mouse e le linee "seguono". Io invece desidero che siano incollate al passaggio del mouse e restino tale. Avete dei suggerimenti per ottimizzare al meglio il codice?
public class DisegnaLineaMouse extends JPanel {
Line2D ascissa, ordinata;
private static final String TITLE = "Disegna!";
private static final int W = 640;
private static final int H = 480;
public DisegnaLineaMouse() {
ascissa = new Line2D.Double();
ordinata = new Line2D.Double();
this.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
this.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
}
});
this.addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseDragged(MouseEvent e) {
}
@Override
public void mouseMoved(MouseEvent e) {
disegna(e);
e.consume();
}
});
}
private void disegna(MouseEvent e) {
System.out.println("X "+e.getX()+" Y "+e.getY());
ascissa = new Line2D.Double(0, e.getY(), getWidth(), e.getY());
ordinata = new Line2D.Double(e.getX(), 0, e.getX(), getHeight());
repaint();
}
@Override
public Dimension getPreferredSize() {
return new Dimension(W, H);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setPaint(Color.BLUE);
g2d.draw(ascissa);
g2d.setPaint(Color.RED);
g2d.draw(ordinata);
repaint();
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame f = new JFrame(TITLE);
f.add(new DisegnaLineaMouse());
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
});
}
}
public class DisegnaLineaMouse extends JPanel {
Line2D ascissa, ordinata;
private static final String TITLE = "Disegna!";
private static final int W = 640;
private static final int H = 480;
public DisegnaLineaMouse() {
ascissa = new Line2D.Double();
ordinata = new Line2D.Double();
this.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
this.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
}
});
this.addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseDragged(MouseEvent e) {
}
@Override
public void mouseMoved(MouseEvent e) {
disegna(e);
e.consume();
}
});
}
private void disegna(MouseEvent e) {
System.out.println("X "+e.getX()+" Y "+e.getY());
ascissa = new Line2D.Double(0, e.getY(), getWidth(), e.getY());
ordinata = new Line2D.Double(e.getX(), 0, e.getX(), getHeight());
repaint();
}
@Override
public Dimension getPreferredSize() {
return new Dimension(W, H);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setPaint(Color.BLUE);
g2d.draw(ascissa);
g2d.setPaint(Color.RED);
g2d.draw(ordinata);
repaint();
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame f = new JFrame(TITLE);
f.add(new DisegnaLineaMouse());
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
});
}
}