2017-05-07 11 views
0

私は単純な十字線を描く必要があります。私が見ているのは空白のパネルだけです。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); 
    } 
} 

正しい値でdrawCrosshair()メソッドに入っています。私は何をしているのか分かりません。

+1

小さなヒント: 'getPreferredSize'をオーバーライドするのではなく、あなたが望む次元で' setPreferredSize'を呼び出す方が良いでしょう。 – byxor

+0

あなたはそれを働かせましたか? – ItamarG3

+0

@byxor:[getPreferredSize() '](http://stackoverflow.com/q/7229226/230513)をオーバーライドすることを実際に意味するときは、' setPreferredSize() 'を使わないでください。 [* Initial Threads *](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html)も参照してください。 – trashgod

答えて

0

あなただけdrawCrosshair()を処分し、paintComponent方法に代わるpaint方法で十字線を描く(実際に私はあなたが今までpaintComponentをオーバーライドするべきではないと思う)ことができます。

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); 
    } 

をそして、これはすべきそれを行う(実際には、私がテストしたように))

+1

"Swingプログラムは、' paint() 'をオーバーライドするのではなく、' paintComponent() 'をオーバーライドする必要があります。" - [* AWTとSwingのペイント:ペイントメソッド*](http://www.oracle.com/technetwork/java/ painting-140037.html#コールバック)。 [* Initial Threads *](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html)も参照してください。 – trashgod

+0

私のために働いた。しかし、私のコードに何が間違っているのか分かりません。 – Dheeraj

関連する問題