JTextField 在静态时在某些页面上消失,而在其他页面上出现 [英] JTextField disappears on some pages when being static, while appearing on others

查看:49
本文介绍了JTextField 在静态时在某些页面上消失,而在其他页面上出现的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

MainProgram.java

import java.awt.CardLayout;导入 java.awt.EventQueue;导入 javax.swing.JFrame;导入 javax.swing.JPanel;导入 javax.swing.UIManager;导入 net.miginfocom.swing.MigLayout;公共类 MainProgram 扩展 JFrame {private static final long serialVersionUID = 1L;public static JPanel centerPanel = new JPanel();public static CardLayout contentCardsLayout = new CardLayout();概览页面概览页面 = 新概览页面();TrackingPage trackingPage = new TrackingPage();公共无效初始化(){创建中心面板();}私有无效 createCenterPanel() {centerPanel.setLayout(contentCardsLayout);概览页面.setName("概览页面");trackingPage.setName("trackingPage");centerPanel.add(overviewPage, "overviewPage");centerPanel.add(trackingPage, "trackingPage");添加(中心面板,成长,包装");}公共主程序(){setBounds(300, 50, 1200, 900);setLayout(new MigLayout());setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}公共静态无效主(字符串 [] args){EventQueue.invokeLater(new Runnable() {公共无效运行(){尝试 {UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");MainProgram window = new MainProgram();window.setVisible(true);窗口初始化();} 捕获(异常 e){e.printStackTrace();}}});}}

OverviewPage.java

import javax.swing.JPanel;导入 net.miginfocom.swing.MigLayout;公共类概览页面扩展 JPanel {WorkNumberPanel workNumberPanel = new WorkNumberPanel();private static final long serialVersionUID = 1L;公共概览页面(){setLayout(new MigLayout());添加(workNumberPanel,包装,growx");}}

TrackingPage.java

import javax.swing.JPanel;导入 net.miginfocom.swing.MigLayout;公共类 TrackingPage 扩展 JPanel {private static final long serialVersionUID = 1L;WorkNumberPanel devicesNumberPanel = new WorkNumberPanel();公共跟踪页面(){setLayout(new MigLayout("", "grow, fill"));添加(设备编号面板,包装,成长");}}

WorkNumberPanel.java

import java.awt.event.ActionEvent;导入 java.awt.event.ActionListener;导入 javax.swing.JButton;导入 javax.swing.JLabel;导入 javax.swing.JPanel;导入 javax.swing.JTextField;导入 net.miginfocom.swing.MigLayout;公共类 WorkNumberPanel 扩展 JPanel {private static final long serialVersionUID = 1L;私有静态最终整数 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.:");公共静态 JTextField txtWorkNumber = 新 JTextField(TEXTFIELD_LENGTH);JTextField txtNNumber = new JTextField(TEXTFIELD_LENGTH);JTextField txtSNumber = new JTextField(TEXTFIELD_LENGTH);JButton btnSearchEntry = new JButton("Search");公共工作编号面板(){createEquipmentNumberPanel();btnSearchEntry.addActionListener(new ActionListener() {@覆盖public void actionPerformed(ActionEvent e) {MainProgram.contentCardsLayout.show(MainProgram.centerPanel, "trackingPage");}});}私有无效 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);添加(mainWorkNumberPanel,推,跨度,成长");}}

解决方案

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

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

TrackingPage 将是最后一个执行以下行

mainWorkNumberPanel.add(txtWorkNumber);

private void createEquipmentNumberPanel() 中,因此该面板将拥有"JTextField.UI 组件在任何给定时间只能位于一个地方才有意义,否则事情会变得很奇怪:)

你的陈述

<块引用>

两个页面都包含相同的 workNumberPanel,我找不到可以解释行为的差异.

根本不是真的.当您执行以下行

时,您将在 OverViewPageTrackingPage 中创建 WorkNumberPanel 的新实例

WorkNumberPanel equipmentNumberPanel = new WorkNumberPanel();

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

While working on a program, I made some of my fields static i.e. a JTextField for a E-Number. But now this field behaves not as expected, on some of my pages it appears, on some others it disappears. Since I am not very experienced working with a lot of statics, there might be a concept I am not understanding.

I have created a very simplified but working example of my program (MCVE) if you want to test it.

It shows my overview page at first - the E-Number JTextField is missing.

If you click on the search button, it shows the tracking page - with the E-Number JTextField present.

Both pages contain the same workNumberPanel and I cant find a difference, that would explain the behaviour.

So why is the E-Number JTextField present on the overview page and missing on the tracking page? Any help / explanation is appreciated!

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();
                }
            }
        });
    }
}

OverviewPage.java

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");
    }
}

TrackingPage.java

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");
    }
}

WorkNumberPanel.java

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");
    }
}

解决方案

Probably because when you create your "pages" with this code

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

the TrackingPage will be the last one to execute the following line

mainWorkNumberPanel.add(txtWorkNumber);

in private void createEquipmentNumberPanel(), and hence that Panel will "own" the JTextField. It only makes sense that a UI component can only be at one place at any given time, otherwise things would get very strange :)

Your statement

Both pages contain the same workNumberPanel and I cant find a difference, that would explain the behaviour.

is simply not true. You are creating a new instance of WorkNumberPanel in both OverViewPage and TrackingPage when you execute the following line

WorkNumberPanel equipmentNumberPanel = new WorkNumberPanel();

So my recommendation is that you find another way of implementing what you want without using a static JTextField (or any other UI component for that matter).

这篇关于JTextField 在静态时在某些页面上消失,而在其他页面上出现的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆