1

我目前正在尝试在 a 上绘制形状JPanel,它在另一个JPanel内,在 a 内JFrame

我搜索了 Google 和 Youtube,发现了如何在JFrame一个面板中绘制形状,但没有找到任何可以帮助我完成我正在做的事情的东西。(也许我什么都没看到)。

到目前为止我看到的代码:

public class GameScreen 
{
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.setColor(Color.red);
        g.drawRect(100, 10, 30, 40);
    }

    public static void main(String[] args)
    {
       GameScreen gs = new GameScreen();
       JFrame f = new JFrame();
       f.setTitle("");
       f.setSize(400,400);
       f.setVisible(true);
       f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       f.add(gs);
}

当我只处理一个面板时,这一切都很好,但我想在我创建的第一个面板内的面板上显示形状。

4

2 回答 2

3

以与您现在相同的方式将 JPanel 添加到 JFrame,但使用您自己的 JPanel 子类来完成。

class MyPanel extends JPanel {
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.red);
        g.drawRect(100, 10, 30, 40);
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(400,400); // As suggested by camickr
    }
}

您可以将其添加到位于 JFrame 内的 JPanel

public static void main(String[] args)
{
   MyPanel mp = new MyPanel();
   JPanel jp = new JPanel();
   jp.add(mp);

   JFrame f = new JFrame();
   f.setTitle("");
   f.setSize(400,400);
   f.setVisible(true);
   f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   f.add(jp);
}

如果您将它们添加为子组件,这可以适用于组件内的组件。关键是扩展组件并覆盖您希望更改的方法。

于 2013-03-31T20:01:38.043 回答
2

当我只处理一个面板时,这一切都很好,

您发布的代码工作正常,因为框架使用 BorderLayout。因此,当您将面板添加到框架时,尺寸会增加,并且会看到您的自定义绘画。

我想在我创建的第一个面板内的面板上显示形状。

创建面板时,默认情况下它使用 FlowLayout。当您向该面板添加自定义绘画面板时,它将以其首选尺寸显示,即 (0, 0),因为您没有指定首选尺寸。

在进行自定义绘画的面板上,您还需要实现 getPreferredSize() 方法,以便布局管理器知道如何排列面板。例如:

public Dimension getPreferredSize()
{
    return new Dimension(200, 200);
}
于 2013-03-31T20:21:40.640 回答