2017-05-07 75 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