2

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

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

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

主.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)
4

2 回答 2

4

JPanel具有合适布局的A便于Container一个或多个JComponent实例。它提供(基本)UI 委托和双缓冲,但仅此而已。自定义组件可能应该JComponent直接扩展。此处显示了(可选)UI 委托的基础架构。您可以将此类自定义组件添加到此处讨论的设计器调色板。

于 2012-05-07T10:46:10.967 回答
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 构建器。

于 2012-05-07T08:56:47.713 回答