2017-05-07 11 views
0

Ich muss ein einfaches Fadenkreuz zeichnen. Alles, was ich sehe, ist eine leere Tafel.Einfaches Fadenkreuz in Java

class ChartPanel extends JPanel implements MouseMotionListener{ 
    Graphics2D g; 
    Dimension dimFrame; 
    ChartPanel() { 
     addMouseMotionListener(this); 
    } 
    public void mouseMoved(MouseEvent e) { 
     drawCrosshair(e.getX(),e.getY()); 
    } 
    public void mouseDragged(MouseEvent e) {} 
    protected void paintComponent(Graphics g2) { 
     g = (Graphics2D)g2; 
     g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
     dimFrame = getSize(); 
     setBackground(Color.WHITE); 
    } 
    public Dimension getPreferredSize() { 
     return new Dimension(700, 500); 
    } 
    void drawCrosshair(double x, double y) { 
     double maxx = dimFrame.getWidth(); 
     double maxy = dimFrame.getHeight(); 
     g.setPaint(Color.BLACK); 
     g.draw(new Line2D.Double(0, y, maxx, y)); 
     g.draw(new Line2D.Double(x, 0, x, maxy)); 
    } 
} 
public class pra { 
    public static void main(String[] args) { 
     JFrame jFrame = new JFrame(); 
     ChartPanel chartPanel = new ChartPanel(); 
     jFrame.add(chartPanel); 
     jFrame.pack(); 
     jFrame.setVisible(true); 
     jFrame.setExtendedState(Frame.MAXIMIZED_BOTH); 
     jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
} 

Und es wird in drawCrosshair() -Methode mit korrektem Wert. Ich habe keine Ahnung, was ich falsch mache.

+1

Kleiner Tipp: Statt 'getPreferredSize' zu ​​überschreiben, ist es besser,' setPreferredSize' mit den gewünschten Dimensionen aufzurufen. – byxor

+0

hast du es funktioniert? – ItamarG3

+0

@byxor: [Verwenden Sie 'setPreferredSize()' nicht, wenn Sie 'getPreferredSize()' wirklich überschreiben wollen (http://stackoverflow.com/q/7229226/230513). Siehe auch [* Initial Threads *] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html). – trashgod

Antwort

0

können Sie verfügen nur über drawCrosshair(), und das Fadenkreuz in der paint Methode zeichnen, die die paintComponent Methode (Eigentlich denke ich, dass Sie nicht immer paintComponent außer Kraft setzen sollte) ersetzen würde:

Graphics2D g; 
    Dimension dimFrame; 
    int x, y; 
    ChartPanel() { 
     addMouseMotionListener(this); 
     setPreferredSize(new Dimension(700, 500)); 
    } 

    public void mouseMoved(MouseEvent e) { 
     x = e.getX(); 
     y = e.getY(); 
     repaint(); 
    } 

    public void mouseDragged(MouseEvent e) { 
    } 

    public void paint(Graphics g2) { 
     super.paint(g2); 
     g = (Graphics2D) g2; 
     g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
     dimFrame = getSize(); 
     g.clearRect(0, 0, dimFrame.width, dimFrame.height);//clears previous drawings 
     g.setColor(Color.BLACK); 
     g.drawLine(x - 10, y, x + 10, y); 
     g.drawLine(x, y - 10, x, y + 10); 
    } 

und dies sollte tue es (tatsächlich tut es, wie ich es getestet habe;))

+1

"Swing-Programme sollten' paintComponent() 'überschreiben, anstatt' paint() '' zu überschreiben. "- [* Malen in AWT und Swing: Die Malmethoden *] (http://www.oracle.com/technetwork/java/ painting-140037.html # Rückrufe). Siehe auch [* Initial Threads *] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html). – trashgod

+0

Arbeitete für mich. Aber ich verstehe nicht, was mit meinem Code falsch war? – Dheeraj