【问题标题】:How do you draw shapes on a JPanel, which is within another JPanel?如何在另一个 JPanel 中的 JPanel 上绘制形状?
【发布时间】:2013-03-31 19:57:03
【问题描述】:

我目前正在尝试在JPanel 上绘制形状,该JPanel 位于另一个JPanel 内,位于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);
}

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

【问题讨论】:

  • 无法得到您的问题..如果您想在一个面板中绘制很多形状,然后通过继承 JPanel 创建自己的面板并覆盖其 paintComponent 方法并绘制尽可能多的形状想在那个面板上画画..

标签: java swing jpanel java-2d paintcomponent


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-09
      • 2020-06-06
      相关资源
      最近更新 更多