【问题标题】:Extending JPanel or returning JPanel扩展 JPanel 或返回 JPanel
【发布时间】:2018-04-23 20:47:52
【问题描述】:

我目前正在尝试重新创建 Breakout,并且想知道如何实现基本 gui。我的结构是一个包含 JPanel 的 JFrame,而 JPanel 是实际保存游戏元素的东西。 JFrame 通过将其添加到其内容窗格 [frame.getContentPane().add(myPanel)] 来获取此 JPanel。

我的问题是,保存游戏元素的类应该扩展 JPanel 还是简单地返回一个 JPanel?

public class myPanel {
    private JPanel panel;
    public myPanel() {
        panel = new JPanel();
        //do stuff with the panel
    }

    public JPanel getPanel() {
        return panel;
    }
}

public class myPanel extends JPanel{
    public myPanel() {
        panel = new JPanel();
        //do stuff with the panel
    }
}

【问题讨论】:

  • 您是否打算覆盖JPanel 的任何方法?
  • 如果您打算直接在 JPanel 中绘图,您应该继承子类,因为您可能想要覆盖 paintComponent(Graphics g) 来绘制您的自定义内容
  • 似乎扩展 Swing 组件是一件很常见的事情,但没有意义,除非您试图覆盖一个方法(如此处所述)。我的偏好是永远不要扩展组件(包括 JFrame 或 JDIalog 之类的窗口组件),除非您需要重写方法或创建扩展 JComponent 的自定义 swing 组件。

标签: java user-interface 2d-games


【解决方案1】:

我认为,在大多数情况下,您应该明确地使用 extend。
这也是错误的:

public class myPanel extends JPanel{
    public myPanel() {
        panel = new JPanel();
        //do stuff with the panel
    }
}

应该是这样的:

public static void main(String[] args){
    JFrame frame=new JFrame();
    myPanel panel=new myPanel("hello");
    frame.add(panel);
    System.out.println(panel.getHello());
}

public class myPanel extends JPanel{
    String hello;
    //stuff you need in the panel
    public myPanel(String hello) {
        this.hello=hello;
    }
    public String getHello(){
        return hello;
    }
}

您应该这样做的一个原因是轻松地@override thepaint(),并处理其中的 JPanel 所需的东西。
如果你想保持简单并且不需要覆盖任何你可能不需要扩展的东西,但我不会考虑创建一个类来保存 JPanel 一个选项。

【讨论】:

    猜你喜欢
    • 2013-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    • 2013-07-21
    • 2014-06-26
    相关资源
    最近更新 更多