Java JTextField在某些页面上是静态的,而在其他页面上则会消失

Java JTextField在某些页面上是静态的,而在其他页面上则会消失,java,swing,static,miglayout,Java,Swing,Static,Miglayout,在编写程序时,我将一些字段设置为静态字段,即JTextField用于e-Number。但现在这个字段的行为并不像预期的那样,在我的一些页面上它出现了,在其他一些页面上它消失了。 由于我在处理大量静力学方面不是很有经验,所以可能有一个概念我不理解 如果您想测试我的程序,我已经创建了一个非常简单但有效的示例() 它首先显示我的概览页面-缺少E-Number JTextField 如果单击搜索按钮,它将显示跟踪页面-显示E-Number JTextField 两个页面都包含相同的workNumberP

在编写程序时,我将一些字段设置为静态字段,即
JTextField
用于
e-Number
。但现在这个字段的行为并不像预期的那样,在我的一些页面上它出现了,在其他一些页面上它消失了。 由于我在处理大量静力学方面不是很有经验,所以可能有一个概念我不理解

如果您想测试我的程序,我已经创建了一个非常简单但有效的示例()

它首先显示我的概览页面-缺少
E-Number JTextField

如果单击搜索按钮,它将显示跟踪页面-显示
E-Number JTextField

两个页面都包含相同的
workNumberPanel
,我找不到区别,这可以解释这种行为

那么为什么概览页面上出现了
E-Number JTextField
,而跟踪页面上却没有?感谢您的帮助/解释

MainProgram.java

import java.awt.CardLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;

import net.miginfocom.swing.MigLayout;

public class MainProgram extends JFrame {
    private static final long serialVersionUID = 1L;

    public static JPanel centerPanel = new JPanel();

    public static CardLayout contentCardsLayout = new CardLayout();

    OverviewPage overviewPage = new OverviewPage();
    TrackingPage trackingPage = new TrackingPage();

    public void initialize() {
        createCenterPanel();
    }

    private void createCenterPanel() {
        centerPanel.setLayout(contentCardsLayout);

        overviewPage.setName("overviewPage");
        trackingPage.setName("trackingPage");

        centerPanel.add(overviewPage, "overviewPage");
        centerPanel.add(trackingPage, "trackingPage");

        add(centerPanel, "growx, wrap");
    }

    public MainProgram() {
        setBounds(300, 50, 1200, 900);
        setLayout(new MigLayout());
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
                    MainProgram window = new MainProgram();
                        window.setVisible(true);
                        window.initialize();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
}
import javax.swing.JPanel;

import net.miginfocom.swing.MigLayout;

public class OverviewPage extends JPanel {
    WorkNumberPanel workNumberPanel = new WorkNumberPanel();

    private static final long serialVersionUID = 1L;

    public OverviewPage() {
        setLayout(new MigLayout());
        add(workNumberPanel, "wrap, growx");
    }
}
import javax.swing.JPanel;

import net.miginfocom.swing.MigLayout;

public class TrackingPage extends JPanel {
    private static final long serialVersionUID = 1L;

    WorkNumberPanel equipmentNumberPanel = new WorkNumberPanel();

    public TrackingPage(){
        setLayout(new MigLayout("", "grow, fill"));
        add(equipmentNumberPanel, "wrap, growx");
    }
}
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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

import net.miginfocom.swing.MigLayout;

public class WorkNumberPanel extends JPanel {
    private static final long serialVersionUID = 1L;
    private static final Integer TEXTFIELD_LENGTH = 20;

    JPanel mainWorkNumberPanel = new JPanel();

    JLabel lblWorkNumber = new JLabel("E-Nr: ");
    JLabel lblN_Number = new JLabel("N-Nr.: ");
    JLabel lblSNumber = new JLabel("W-Nr.: ");

    public static JTextField txtWorkNumber = new JTextField(TEXTFIELD_LENGTH);
    JTextField txtNNumber = new JTextField(TEXTFIELD_LENGTH);
    JTextField txtSNumber = new JTextField(TEXTFIELD_LENGTH);

    JButton btnSearchEntry = new JButton("Search");

    public WorkNumberPanel() {
        createEquipmentNumberPanel();
        btnSearchEntry.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                MainProgram.contentCardsLayout.show(MainProgram.centerPanel, "trackingPage");
            }
        });
    }

    private void createEquipmentNumberPanel() {
        setLayout(new MigLayout());
        mainWorkNumberPanel.setLayout(new MigLayout("", "[][grow, fill][][grow, fill][][grow, fill][]"));
        mainWorkNumberPanel.add(lblWorkNumber);
        mainWorkNumberPanel.add(txtWorkNumber);
        mainWorkNumberPanel.add(lblN_Number);
        mainWorkNumberPanel.add(txtNNumber);
        mainWorkNumberPanel.add(lblSNumber);
        mainWorkNumberPanel.add(txtSNumber);
        mainWorkNumberPanel.add(btnSearchEntry);

        add(mainWorkNumberPanel, "push, span, growx");
    }
}
概览页面.java

import java.awt.CardLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;

import net.miginfocom.swing.MigLayout;

public class MainProgram extends JFrame {
    private static final long serialVersionUID = 1L;

    public static JPanel centerPanel = new JPanel();

    public static CardLayout contentCardsLayout = new CardLayout();

    OverviewPage overviewPage = new OverviewPage();
    TrackingPage trackingPage = new TrackingPage();

    public void initialize() {
        createCenterPanel();
    }

    private void createCenterPanel() {
        centerPanel.setLayout(contentCardsLayout);

        overviewPage.setName("overviewPage");
        trackingPage.setName("trackingPage");

        centerPanel.add(overviewPage, "overviewPage");
        centerPanel.add(trackingPage, "trackingPage");

        add(centerPanel, "growx, wrap");
    }

    public MainProgram() {
        setBounds(300, 50, 1200, 900);
        setLayout(new MigLayout());
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
                    MainProgram window = new MainProgram();
                        window.setVisible(true);
                        window.initialize();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
}
import javax.swing.JPanel;

import net.miginfocom.swing.MigLayout;

public class OverviewPage extends JPanel {
    WorkNumberPanel workNumberPanel = new WorkNumberPanel();

    private static final long serialVersionUID = 1L;

    public OverviewPage() {
        setLayout(new MigLayout());
        add(workNumberPanel, "wrap, growx");
    }
}
import javax.swing.JPanel;

import net.miginfocom.swing.MigLayout;

public class TrackingPage extends JPanel {
    private static final long serialVersionUID = 1L;

    WorkNumberPanel equipmentNumberPanel = new WorkNumberPanel();

    public TrackingPage(){
        setLayout(new MigLayout("", "grow, fill"));
        add(equipmentNumberPanel, "wrap, growx");
    }
}
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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

import net.miginfocom.swing.MigLayout;

public class WorkNumberPanel extends JPanel {
    private static final long serialVersionUID = 1L;
    private static final Integer TEXTFIELD_LENGTH = 20;

    JPanel mainWorkNumberPanel = new JPanel();

    JLabel lblWorkNumber = new JLabel("E-Nr: ");
    JLabel lblN_Number = new JLabel("N-Nr.: ");
    JLabel lblSNumber = new JLabel("W-Nr.: ");

    public static JTextField txtWorkNumber = new JTextField(TEXTFIELD_LENGTH);
    JTextField txtNNumber = new JTextField(TEXTFIELD_LENGTH);
    JTextField txtSNumber = new JTextField(TEXTFIELD_LENGTH);

    JButton btnSearchEntry = new JButton("Search");

    public WorkNumberPanel() {
        createEquipmentNumberPanel();
        btnSearchEntry.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                MainProgram.contentCardsLayout.show(MainProgram.centerPanel, "trackingPage");
            }
        });
    }

    private void createEquipmentNumberPanel() {
        setLayout(new MigLayout());
        mainWorkNumberPanel.setLayout(new MigLayout("", "[][grow, fill][][grow, fill][][grow, fill][]"));
        mainWorkNumberPanel.add(lblWorkNumber);
        mainWorkNumberPanel.add(txtWorkNumber);
        mainWorkNumberPanel.add(lblN_Number);
        mainWorkNumberPanel.add(txtNNumber);
        mainWorkNumberPanel.add(lblSNumber);
        mainWorkNumberPanel.add(txtSNumber);
        mainWorkNumberPanel.add(btnSearchEntry);

        add(mainWorkNumberPanel, "push, span, growx");
    }
}
TrackingPage.java

import java.awt.CardLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;

import net.miginfocom.swing.MigLayout;

public class MainProgram extends JFrame {
    private static final long serialVersionUID = 1L;

    public static JPanel centerPanel = new JPanel();

    public static CardLayout contentCardsLayout = new CardLayout();

    OverviewPage overviewPage = new OverviewPage();
    TrackingPage trackingPage = new TrackingPage();

    public void initialize() {
        createCenterPanel();
    }

    private void createCenterPanel() {
        centerPanel.setLayout(contentCardsLayout);

        overviewPage.setName("overviewPage");
        trackingPage.setName("trackingPage");

        centerPanel.add(overviewPage, "overviewPage");
        centerPanel.add(trackingPage, "trackingPage");

        add(centerPanel, "growx, wrap");
    }

    public MainProgram() {
        setBounds(300, 50, 1200, 900);
        setLayout(new MigLayout());
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
                    MainProgram window = new MainProgram();
                        window.setVisible(true);
                        window.initialize();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
}
import javax.swing.JPanel;

import net.miginfocom.swing.MigLayout;

public class OverviewPage extends JPanel {
    WorkNumberPanel workNumberPanel = new WorkNumberPanel();

    private static final long serialVersionUID = 1L;

    public OverviewPage() {
        setLayout(new MigLayout());
        add(workNumberPanel, "wrap, growx");
    }
}
import javax.swing.JPanel;

import net.miginfocom.swing.MigLayout;

public class TrackingPage extends JPanel {
    private static final long serialVersionUID = 1L;

    WorkNumberPanel equipmentNumberPanel = new WorkNumberPanel();

    public TrackingPage(){
        setLayout(new MigLayout("", "grow, fill"));
        add(equipmentNumberPanel, "wrap, growx");
    }
}
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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

import net.miginfocom.swing.MigLayout;

public class WorkNumberPanel extends JPanel {
    private static final long serialVersionUID = 1L;
    private static final Integer TEXTFIELD_LENGTH = 20;

    JPanel mainWorkNumberPanel = new JPanel();

    JLabel lblWorkNumber = new JLabel("E-Nr: ");
    JLabel lblN_Number = new JLabel("N-Nr.: ");
    JLabel lblSNumber = new JLabel("W-Nr.: ");

    public static JTextField txtWorkNumber = new JTextField(TEXTFIELD_LENGTH);
    JTextField txtNNumber = new JTextField(TEXTFIELD_LENGTH);
    JTextField txtSNumber = new JTextField(TEXTFIELD_LENGTH);

    JButton btnSearchEntry = new JButton("Search");

    public WorkNumberPanel() {
        createEquipmentNumberPanel();
        btnSearchEntry.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                MainProgram.contentCardsLayout.show(MainProgram.centerPanel, "trackingPage");
            }
        });
    }

    private void createEquipmentNumberPanel() {
        setLayout(new MigLayout());
        mainWorkNumberPanel.setLayout(new MigLayout("", "[][grow, fill][][grow, fill][][grow, fill][]"));
        mainWorkNumberPanel.add(lblWorkNumber);
        mainWorkNumberPanel.add(txtWorkNumber);
        mainWorkNumberPanel.add(lblN_Number);
        mainWorkNumberPanel.add(txtNNumber);
        mainWorkNumberPanel.add(lblSNumber);
        mainWorkNumberPanel.add(txtSNumber);
        mainWorkNumberPanel.add(btnSearchEntry);

        add(mainWorkNumberPanel, "push, span, growx");
    }
}
WorkNumberPanel.java

import java.awt.CardLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;

import net.miginfocom.swing.MigLayout;

public class MainProgram extends JFrame {
    private static final long serialVersionUID = 1L;

    public static JPanel centerPanel = new JPanel();

    public static CardLayout contentCardsLayout = new CardLayout();

    OverviewPage overviewPage = new OverviewPage();
    TrackingPage trackingPage = new TrackingPage();

    public void initialize() {
        createCenterPanel();
    }

    private void createCenterPanel() {
        centerPanel.setLayout(contentCardsLayout);

        overviewPage.setName("overviewPage");
        trackingPage.setName("trackingPage");

        centerPanel.add(overviewPage, "overviewPage");
        centerPanel.add(trackingPage, "trackingPage");

        add(centerPanel, "growx, wrap");
    }

    public MainProgram() {
        setBounds(300, 50, 1200, 900);
        setLayout(new MigLayout());
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
                    MainProgram window = new MainProgram();
                        window.setVisible(true);
                        window.initialize();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
}
import javax.swing.JPanel;

import net.miginfocom.swing.MigLayout;

public class OverviewPage extends JPanel {
    WorkNumberPanel workNumberPanel = new WorkNumberPanel();

    private static final long serialVersionUID = 1L;

    public OverviewPage() {
        setLayout(new MigLayout());
        add(workNumberPanel, "wrap, growx");
    }
}
import javax.swing.JPanel;

import net.miginfocom.swing.MigLayout;

public class TrackingPage extends JPanel {
    private static final long serialVersionUID = 1L;

    WorkNumberPanel equipmentNumberPanel = new WorkNumberPanel();

    public TrackingPage(){
        setLayout(new MigLayout("", "grow, fill"));
        add(equipmentNumberPanel, "wrap, growx");
    }
}
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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

import net.miginfocom.swing.MigLayout;

public class WorkNumberPanel extends JPanel {
    private static final long serialVersionUID = 1L;
    private static final Integer TEXTFIELD_LENGTH = 20;

    JPanel mainWorkNumberPanel = new JPanel();

    JLabel lblWorkNumber = new JLabel("E-Nr: ");
    JLabel lblN_Number = new JLabel("N-Nr.: ");
    JLabel lblSNumber = new JLabel("W-Nr.: ");

    public static JTextField txtWorkNumber = new JTextField(TEXTFIELD_LENGTH);
    JTextField txtNNumber = new JTextField(TEXTFIELD_LENGTH);
    JTextField txtSNumber = new JTextField(TEXTFIELD_LENGTH);

    JButton btnSearchEntry = new JButton("Search");

    public WorkNumberPanel() {
        createEquipmentNumberPanel();
        btnSearchEntry.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                MainProgram.contentCardsLayout.show(MainProgram.centerPanel, "trackingPage");
            }
        });
    }

    private void createEquipmentNumberPanel() {
        setLayout(new MigLayout());
        mainWorkNumberPanel.setLayout(new MigLayout("", "[][grow, fill][][grow, fill][][grow, fill][]"));
        mainWorkNumberPanel.add(lblWorkNumber);
        mainWorkNumberPanel.add(txtWorkNumber);
        mainWorkNumberPanel.add(lblN_Number);
        mainWorkNumberPanel.add(txtNNumber);
        mainWorkNumberPanel.add(lblSNumber);
        mainWorkNumberPanel.add(txtSNumber);
        mainWorkNumberPanel.add(btnSearchEntry);

        add(mainWorkNumberPanel, "push, span, growx");
    }
}

可能是因为当您使用此代码创建“页面”时

OverviewPage overviewPage = new OverviewPage();
TrackingPage trackingPage = new TrackingPage();
TrackingPage
将是最后一个执行以下行的页面

mainWorkNumberPanel.add(txtWorkNumber);
私有void createEquipmentNumberPanel()
中,因此该面板将“拥有”JTextField。UI组件在任何给定时间只能位于一个位置才有意义,否则事情会变得非常奇怪:)

你的陈述

两个页面都包含相同的workNumberPanel,我找不到区别,这可以解释这种行为

这根本不是真的。执行以下行时,您正在
概览页面
跟踪页面
中创建一个新的
WorkNumberPanel
实例

WorkNumberPanel equipmentNumberPanel = new WorkNumberPanel();

因此,我的建议是,您可以找到另一种实现所需内容的方法,而无需使用静态JTextField(或任何其他UI组件)。

这里,您将实例化一个
概览页面,然后实例化一个
跟踪页面

OverviewPage overviewPage = new OverviewPage();
TrackingPage trackingPage = new TrackingPage();
这两个类都实例化了
WorkNumberPanel

WorkNumberPanel
将静态
JTextField
(txtWorkNumber)添加到其显示面板(mainWorkNumberPanel)

单个
组件
不能添加到多个
容器
对象中。 这就是文本字段的情况,因为它是
静态的
,而不是实例变量

最后添加的内容将获胜,因此文本字段将仅出现在
跟踪页面
中,而不再出现在
概览页面


只是不要让它成为静态的,首先你需要理解静态字段是什么。静态字段与对象的特定实例无关。该字段与类本身相关。
有很好的解释和解释


关于你的案子。
JComponent
一次只能添加到一个面板。将它添加到另一个将从第一个中删除它

在代码中,您正在创建“WorkingNumberPanel”的多个实例。执行此操作时,将文本字段添加到面板,包括
static
文本字段
txtWorkNumber
。由于字段
txtWorkNumber
是静态的,因此您将同一对象添加到多个组件中,正如我前面提到的,这将从先前添加的任何位置删除该对象


解决此问题的一种可能方法是将
txtWorkNumber
中的值存储在一个静态变量中,并创建一个新的实例(非静态)文本字段添加到面板中。

两个答案都非常清楚,我的错误是什么。现在我必须找到一种方法来使用
JTextField
,而不使用static。我正在创建一个
OrderObject
,将其从概述页面发送到跟踪页面。在这里,我想在
JTextField
中显示订单号(E-number)。但是我还没有弄清楚,概览页面如何告诉跟踪页面将文本设置为E-Number,因此我使用了static,因为这似乎很简单,但却错了?是的,以这种方式使用
static
并不是一个解决方案。您必须获得第一个对话框的结果并将其插入第二个对话框。这可以通过多种方式实现,我更喜欢。这些不是对话。我有一个页面,上面有一个导航面板(左侧),数字面板(标题),其余的是内容(中心)。我使用卡片布局从一页切换到另一页,需要在每页页眉的数字面板中保留相同的数字,因为它们都属于相同的顺序。对不起,我的错。无论如何,您都不应该使用静态UI组件。只需存储一个面板中的值,并在显示时显示在另一个面板中。我的误解似乎是滥用
static
,将信息/数据从一个类传输到另一个类。我需要弄清楚何时创建实例/对象以及如何为它们提供所需的信息。