java - 如何多次实例化 Swing 组件的 Java 类

标签 java swing multiple-instances

我有一个java类用作容器,它被编码为具有JPanelTabbedPane

我有另一个java类,它构建一个包含JLabelJTextFieldJPanel,我想将它们添加到容器类的TabbedPane中。我想要一个添加 JPanel 的类的新实例,这样我就可以向容器类添加多个选项卡。

我已查看以下内容:Can we reuse Java Swing application components in other instances of same application? , Multiple instances of model components in Java Swing? , Multiple instance of ONE JFrame ,以及多个网络作者。我不是一个做作业的学生,​​我是一个老家伙,刚接触 Java,正在将我自上而下的技能转向 OOP。

这是我的代码:

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.border.EmptyBorder;

@SuppressWarnings("serial")
public class TestContainer extends JFrame {

private JPanel contentPane;
public static JTabbedPane tabbedPane1;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            try {
                TestContainer frame = new TestContainer();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the frame.
 */
public TestContainer() {

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 450, 300);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(null);

    JScrollPane scrollBasePane = new JScrollPane();
    scrollBasePane.setBounds(10, 11, 414, 239);
    contentPane.add(scrollBasePane);

    JPanel panelBase = new JPanel();
    scrollBasePane.setViewportView(panelBase);
    panelBase.setLayout(null);

    tabbedPane1 = new JTabbedPane(JTabbedPane.TOP);
    tabbedPane1.setBounds(10, 11, 392, 215);
    panelBase.add(tabbedPane1);

    // add new JPanel to TabbedPane via a reusable Class
    MoreTabs mt1 = new MoreTabs();

    tabbedPane1.addTab( mt1() ); //non-static
    }
 }

还有

import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class MoreTabs{

private JPanel panel = new JPanel();
private JLabel lblPutStuffOn = new JLabel("Put stuff on this panel, T3-MoreTabs.");
private JTextField text = new JTextField();

panel.add(lblPutStuffOn);
panel.add(text);

public String getLblText() {
    String lblText;
    lblText = lblPutStuffOn.getText();
    return lblText;
}

public void setLblText(String s){
    lblPutStuffOn.setText(s);
}

public String getTxtText() {
    String txtText;
    txtText = text.getText();
    return txtText;
}

public void setTxtText(String s){
    text.setText(s);
  }

}

最佳答案

不要将 JTabbedPane 设为静态。这样的 JComponentent 不能共享:例如,它们有一个父容器。

可以创建一个容器类(例如 JMyPanel),并在多个位置创建多个实例。

如果这些实例也应该引用相同的数据模型,假设 JTextField 更改相同的文本,并且两个实例可以同时访问,那么在 swing 中需要更改这些文本字段上的监听器。

这需要模型- View - Controller 范例。

可以创建一个单独的 Controller 类,其中包含数据模型(文本为字符串),并让对 JTextField( View )的更改调用 Controller 来更新模型并将更新的值移植到其他 View 。

使用Document :

jTextComponent.getDocument()

您可以让两个 JTextField 拥有自己的文档,并使用真实更改的交互通知。或者正如文档的 javadoc 建议使用一个共享文档。我记得很少使用后者,因为通常数据模型由更多输入组件组成。

(顺便说一句。在 JavaFX 中,TextField 将绑定(bind)到可以保存在数据模型中的 StringProperty,并通知更改并且可以绑定(bind)多次。)

关于java - 如何多次实例化 Swing 组件的 Java 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35395094/

相关文章:

java - 使用java发送简单的电子邮件

java - 参数化 Swing 对话框

java - 更改背景颜色可编辑 JComboBox

apache - 如何在 RedHat Linux 中运行两个 Apache Web 服务器 (httpd)?

android - 轮换后更改服务的第二个实例

java - 动态变量名称 Java

java - 优化 JSF + JPA Web 应用程序中的身份验证

java - 如何动态构建 JMenu(而不仅仅是运行时创建)?

java - Swing 中的虚拟列表框

c++ - 运行一个应用程序的多个实例有问题吗?