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