java

pprl5pva  于 2021-07-09  发布在  Java
关注(0)|答案(3)|浏览(250)

我有以下问题:我用java创建了这个类:

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class OvalPanelCanvas extends JPanel {
public OvalPanelCanvas() {
    JFrame frame = new JFrame("Oval Sample");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.add(this);
    frame.setSize(300, 200);
    frame.setVisible(true);
}
public void paintComponent(Graphics g, int a, int b) {

g.setColor(Color.black);
g.drawLine(10, 10, a, b);
}
public static  void main(String args[]) {

}
}

方法paintcomponent(graphics g,int a,int b)由另一个类的函数调用:

testen.paintComponent(f,50, 50);

f是创建为公共的图形对象。当另一个类启动时,ovalpanelvanvas类的jframe启动,但调用方法时它不绘制?我现在在想为什么,因为没有错误信息。

y53ybaqx

y53ybaqx1#

注意事项:
首先你应该重写 paintComponent() 方法。别忘了打电话 super.paintComponent(g) .
把你的班主任交给 a 以及 b 属性并从外部调用repaint()方法。
看看执行自定义绘画教程。
不要设置框架的大小(或者任何swing组件的实际大小)。可以通过重写getpreferredsize()方法为面板指定默认大小。

示例:

public class OvalPanelCanvas extends JPanel {

    private int a, b;

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D graphics = (Graphics2D)g.create(); // just as good practice
        graphics.setColor(Color.black);
        graphics.drawLine(10, 10, a, b);
        graphics.dispose();
    }

    @Override
    public Dimension getPreferredSize() {
        return isPreferredSizeSet() ? super.getPreferredSize() : new Dimension(200, 200);
    }

    public void setA(int a) {
        this.a = a;
    }

    public void setB(int b) {
        this.b = b;
    }
}
jhdbpxl9

jhdbpxl92#

它不能直接调用 paintComponent() 它不能直接创造一个 Graphics 对象。 Graphics 对象是由系统创建的绘画上下文,因此您只需将ovalpanelcanvas对象添加到框架和系统调用中 paintComponent() 需要时自动。

k3fezbri

k3fezbri3#

你似乎对定制绘画的工作原理有一个错误的理解。老实说,我甚至不知道从哪里开始,有那么多事情看起来完全是错的。
你说的不对 paintComponent . 正确的签名是

protected void paintComponent(Graphics g)

没有其他理由。
你不应该创造 JFrameJPanel 建造师。在教室里做 main 方法或在 main 方法,就像常用的 createAndShowGui() 你应该打电话来 super.paintComponent 内部 paintComponent 方法。
如果您确实想重复重新绘制您的评论中提到的,请致电 repaint() 而不是 paintComponent 方法,您永远不必这样做。它通过绘制堆栈隐式调用。
如果你想改变 a 以及 b 值,您应该做的是将它们作为类成员 int a, b 为他们准备了餐具。喜欢

public class OvalCanvasPanel extends JPanel {
    int a, b;
    public OvalCanvasPanel(int a, int b) {
        this.a = a;
        this.b = b;
    }
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.fillOval(10, 10, a, b);
    }
    public void setA(int a) {
        this.a = a;
        repaint();
    }
}

然后从类中示例化 OvalCanvasPanel ,您只需设置 a 以及 b ,它会的
repaint() frame.add(this); 不!。应该是 frame.add(new OvalCanvasPanel()); 我建议你去看看定制绘画的一些例子,好的做法,和正确的绘画方法。

相关问题