使用paintComponent()在JFrame中绘制矩形

5
我正在尝试创建一个程序,使用JPanel的paintComponent()方法来绘制形状(在下面的示例中为矩形),但是我无法让它正常工作,并且无法发现问题所在。
代码如下:
import javax.swing.*;
import java.awt.*;

public class RandomRec{
    JFrame frame;

    public void go(){
        frame = new JFrame();
        frame.setSize(500,500);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        DrawPanel panel = new DrawPanel();
    }

    public static void main (String[] args){
        class DrawPanel extends JPanel{
           public void paintComponent(Graphics g) {
              super.paintComponent(g);
              g.setColor(Color.orange);
              g.drawRect(20, 20, 100, 60);
           }
        }

        RandomRec test = new RandomRec();
        test.go();
    }
}

非常感谢您的帮助。

谢谢。

*更新*问题已解决!将 go() 方法移出 main 方法,添加 frame.add(panel) 并将 frame.setVisible(true) 移至 go() 方法底部(更具体地说,在面板添加到框架之后)已解决该问题。谢谢。


3
不需要用答案更新您的问题。最好的方法是在最有用的答案旁边勾选检查标记以表示“已解决”。您还可以投票支持任何帮助您的回答。 - KatieK
2个回答

4

你的类DrawPanel被限制在main方法的范围内,无法被构造函数看到。

你需要将DrawPanel移到main方法外,并将其添加到JFrame中:

frame.add(panel);

此外,在添加完所有组件后再调用frame.setVisible(true)更好。

1
非常准确 - 在添加frame.add(panel)之后,矩形不会显示出来。真正起作用的是frame.setVisible(true)提示。现在一切都正常了。类也从主方法中删除了(这是我错误地忽略的)。非常感谢! - priboyd

2
您实际上从未将该面板添加到框架中,因此它从未可见。您需要使用类似以下的代码将其添加到框架中:
frame.getContentPane().add( panel );

为什么你要在主方法中定义DrawPanel类?这很奇怪。

那很奇怪,这是我错误地忽略了的事情 - 现在已经修复了。我尝试添加frame.getContentPane().add(panel),它和frame.add(panel)一样有效。谢谢! - priboyd
我认为如果您查看jframe中的源代码,无论如何都要添加getcontentpane.add调用。我认为jframe上的add方法是为了与awt frame兼容而存在的?(不要忘记将答案标记为正确!) - John Gardner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接