Java简单的绘图代码不起作用

时间:2014-02-18 13:32:31

标签: java swing graphics paintcomponent mouse-listeners

我有这个简单的油漆代码应该绘制,但它会在面板周围移动椭圆。 当我删除super.paintComponent(g)行程序时,它会绘制而不仅仅是移动椭圆形,但我继续读到我们不应该删除这一行,那么我该怎样做才能让线路进入但仍能获得理想的结果呢?

class OraclePaint extends JFrame {
    public static void main(String[] args) {
        OraclePaint ss = new OraclePaint();
        ss.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        ss.add(new MyPanel());
        ss.setSize(250, 200);
        ss.setVisible(true);
    }
}

class MyPanel extends JPanel {
    private int x = -10, y = -10;

    public MyPanel() {
        addMouseMotionListener(new MouseMotionAdapter() {
            public void mouseDragged(MouseEvent event) {
                x = event.getX();
                y = event.getY();
                repaint();
            }
        }); // end call to addMouseMotionListener
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.fillOval(x, y, 22, 22);
    }
}

2 个答案:

答案 0 :(得分:2)

根据描述,我假设您想要“简单的绘画程序”。

super.paintComponent(g)作为被覆盖的paintComponent的第一行调用是正确的。确实,这会消除背景(也就是说,之前绘制的所有内容都将被删除)。

在Swing中,您要绘制的所有必须在paintComponent方法中绘制(或者从那里调用的任何方法,并接收相同的{{1} } object)。

如果要“保存”您绘制的所有内容,则必须将所有内容绘制到图像中(即放入Graphics),然后在BufferedImage方法中绘制此图像。

代码还有一些其他问题,但是如果不改变剩余的代码,可以大致(!)实现这样:

paintComponent

答案 1 :(得分:0)

将您的MyPanel更改为:

class MyPanel extends JPanel
{
    private int x2 = 0, y2 = 0;
    private int x1 = 0, y1 = 0;
    public MyPanel()
    {
        addMouseMotionListener(new MouseMotionAdapter()
        {
            public void mouseDragged( MouseEvent event )
            {
                x2 = event.getX();
                y2 = event.getY();
                repaint();
            }
        }
        ); // end call to addMouseMotionListener

        addMouseListener(new MouseListener() {
            @Override
            public void mousePressed(MouseEvent e) {
                x1 = e.getX();
                y1 = e.getY();
            }
        });

    }

    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.fillOval(x1, y1, x2, y2);
    }
}