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



我有一个简单的绘画代码,应该绘制,但它在面板周围移动椭圆形。当我删除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);
    }
}

根据描述,我假设你想要类似"一个简单的绘图程序"的东西。

调用

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

在 Swing 中,要绘制的所有内容都必须paintComponent 方法(或从该方法调用的任何方法中绘制,并接收相同的Graphics对象)。

如果要"保存"已绘制的所有内容,则必须将所有内容绘制到图像中(即BufferedImage中),并在paintComponent方法中绘制此图像。

代码

还有其他一些问题,但如果不更改太多剩余代码,这可以大致(!)实现如下:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
import javax.swing.JPanel;
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 BufferedImage image = null;
    public MyPanel() {
        addMouseMotionListener(new MouseMotionAdapter() {
            @Override
            public void mouseDragged(MouseEvent event) {
                if (image != null) {
                    // Paint into the image
                    Graphics g = image.getGraphics();
                    g.setColor(Color.BLACK);
                    g.fillOval(event.getX(),  event.getY(), 22, 22);
                    g.dispose();
                    repaint();
                }
            }
        }); // end call to addMouseMotionListener
    }
    // Make sure that the image is not 'null' and that
    // it has the same size as this panel
    private void validateImage()
    {
        if (image == null)
        {
            image = new BufferedImage(getWidth(), getHeight(),
                BufferedImage.TYPE_INT_ARGB);
        }
        if (image.getWidth() != getWidth() || image.getHeight() != getHeight())
        {
            BufferedImage newImage = new BufferedImage(getWidth(), getHeight(),
                BufferedImage.TYPE_INT_ARGB);
            Graphics g = newImage.getGraphics();
            g.drawImage(image, 0, 0, null);
            g.dispose();
            image = newImage;
        }
    }
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        validateImage();
        g.drawImage(image, 0, 0, null);
    }
}
将您的

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

相关内容

  • 没有找到相关文章

最新更新