2017-05-07 76 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()'。另見[*初始線程*](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html)。 – trashgod

回答

0

你可以只處置drawCrosshair(),並繪製在paint方法的十字線,這將取代paintComponent方法(其實我覺得你不應該永遠覆蓋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程序應該覆蓋'paintComponent()'而不是覆蓋'paint()'。」 - [* AWT和Swing中的繪製:繪製方法*](http://www.oracle.com/technetwork/java/繪畫140037.html#回調)。另見[*初始線程*](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html)。 – trashgod

+0

爲我工作。但我不明白我的代碼有什麼問題? – Dheeraj