你如何在另一个JPanel中的JPanel上绘制形状?

时间:2013-03-31 19:57:04

标签: java swing jpanel java-2d paintcomponent

我目前正在尝试在JPanel内绘制形状,该JPanel位于JFrame内的另一个JFrame内。

我搜索了谷歌和Youtube,并找到了如何在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); } 内绘制有一个面板的形状,但却找不到任何可以帮助我正在做的事情。 (也许我没看到什么)。

到目前为止我见过的代码:

{{1}}

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

2 个答案:

答案 0 :(得分:2)

以与您现在相同的方式将Jarame添加到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);
}

如果将组件添加为子组件,则可以对组件中的组件起作用。关键是扩展组件并覆盖您想要更改的方法。

答案 1 :(得分:2)

  

当我只处理一个小组时,这一切都很好,

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

  

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

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

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

public Dimension getPreferredSize()
{
    return new Dimension(200, 200);
}