JTextField 在静态时在某些页面上消失,而在其他页面上出现 [英] JTextField disappears on some pages when being static, while appearing on others
问题描述
在编写程序时,我将一些字段设为静态,即 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,我找不到可以解释行为的差异.
根本不是真的.当您执行以下行
时,您将在OverViewPage
和 TrackingPage
中创建 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屋!