【问题标题】:class is-a-JPanel when it should have-a类是-a-JPanel,什么时候应该有-a
【发布时间】:2012-05-07 07:43:11
【问题描述】:

当 Netbeans 扩展 JPanel 时,是否会因为它使用继承而不是组合而在引用自动生成类的实例时产生问题?

因为 Netbeans 将 JPanel 声明为 private javax.swing.JPanel overview;,所以实例具有 JPanel 类型,而它应该具有 Overview 类型。

如何调用 setGroup 方法同时将 Overview 保留为自动生成的 JPanel?我这样尝试:

Main.java

private void groupsPropertyChange(java.beans.PropertyChangeEvent evt) {
    String s = evt.getNewValue().toString();
    LOG.fine("new group: " + s);
    overview.setGroup(s);
}

使用 Overview.java:

public class Overview extends javax.swing.JPanel {


...

    public String getGroup() {
        return group;
    }

    public void setGroup(String group) {
        this.group = group;
    }

}

但是得到这个编译错误:

init:
Deleting: /home/thufir/NetBeansProjects/SwingNNTP/build/built-jar.properties
deps-jar:
Updating property file: /home/thufir/NetBeansProjects/SwingNNTP/build/built-jar.properties
Compiling 1 source file to /home/thufir/NetBeansProjects/SwingNNTP/build/classes
warning: [options] bootstrap class path not set in conjunction with -source 1.5
/home/thufir/NetBeansProjects/SwingNNTP/src/net/bounceme/dur/nntp/view/Main.java:59: error: cannot find symbol
        overview.setGroup(s);
  symbol:   method setGroup(String)
  location: variable overview of type JPanel
1 error
1 warning
/home/thufir/NetBeansProjects/SwingNNTP/nbproject/build-impl.xml:628: The following error occurred while executing this line:
/home/thufir/NetBeansProjects/SwingNNTP/nbproject/build-impl.xml:285: Compile failed; see the compiler error output for details.
BUILD FAILED (total time: 1 second)

【问题讨论】:

  • 在哪里实例化 Overview 类?
  • Overview 在 Main 类中实例化,但它太垃圾了,我省略了它,因为它是自动生成的;它在initComponents 方法中。
  • 我认为是你的问题。查看错误:location: variable overview of type JPanel。概览是面板的一个变量。您没有实例化 Overview 对象。
  • 它被声明为该类型。如何更改 GUI builder 中的声明?
  • 我认为变量的类型是JPanel,而不是Overview- 使用net.bounceme.dur.nntp.view.Overview overview = new net.bounceme.dur.nntp.view.Overview();

标签: java swing oop user-interface netbeans


【解决方案1】:

JPanel 与合适的layout 是一个方便的Container 用于一个或多个JComponent 实例。它提供(基本)UI 委托和双缓冲,但仅此而已。自定义组件可能应该直接扩展JComponent。 (可选)UI 委托的基础结构显示为here。您可以按照here 的讨论将此类自定义组件添加到设计器面板。

【讨论】:

  • tools->Palette->Swing/AWT Componets,然后选择“从项目添加”并选择一个扩展的类,在这种情况下,JPanel?即使在清理和构建之后,此窗口中也不会出现任何类。 “构建”文件夹中的任何类也没有。还在研究中,谢谢。
  • @Thufir:恐怕我在那个兔子洞里还没有走太远,但还有更多here
  • 谢谢,我应该先用谷歌搜索一下!我一会儿看看。
【解决方案2】:

好吧,我猜 Netbeans 没有将使用 GUI 创建的 JPanel 声明为除 JPanel 之外的任何类型的选项,这有点奇怪。如果继续使用 Netbeans GUI 构建器,您不能用该扩展类型实例化 JPanel 的子类,为什么要扩展 JPanel?并不是说扩展 JPanel 本质上是一个好主意...

解决方案代码:

package net.bounceme.dur.nntp.view;

import java.util.logging.Logger;
import javax.swing.JTabbedPane;

public class MyTabs extends JTabbedPane {

    private static final Logger LOG = Logger.getLogger(MyTabs.class.getName());
    private Overview overview = new Overview();
    private Detail details = new Detail();
    private Groups groups = new Groups();

    public MyTabs() {
        this.add("groups", groups);
        this.add("overview", overview);
        this.add("detail", details);

        groups.addPropertyChangeListener(new java.beans.PropertyChangeListener() {

            public void propertyChange(java.beans.PropertyChangeEvent evt) {
                String s = evt.getNewValue().toString();
                LOG.fine(s);
                overview.setGroup(s);
            }
        });

    }
}

我只是好奇,除了不使用 GUI 构建器之外,是否有更好的方法。

【讨论】:

  • +1 表示松散耦合;您还可以收听选项卡式窗格的model。顺便说一句,它是一个GUI 设计器,而不是一个应用程序 设计器。 :-)
猜你喜欢
  • 2011-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多