2016-03-31 18 views
3

出現,同時在程序工作在一些網頁上消失了,我做了我的一些領域,即靜態的E-Number一個JTextField的。但是現在這個領域的行爲並不像我預期的那樣,在我看來的一些頁面上,在其他一些頁面上它消失了。 由於我在很多靜力學方面工作不是很有經驗,所以可能有一個我不理解的概念。JTextField的是靜態的時候,而在其他

,如果你想測試我創建了我的程序(MCVE)的一個非常簡單的,但工作示例。

它顯示我的總覽頁面,在第一 - 在E-Number JTextField丟失。

如果你點擊搜索按鈕,它顯示了跟蹤頁面 - 與E-Number JTextField存在。

兩頁都包含相同workNumberPanel我無法找到差異,這將解釋行爲。

那麼,爲什麼是E-Number JTextField目前概覽頁面上缺少跟蹤頁面上?任何幫助/解釋讚賞!

Static JTextField disappears

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

回答

3

可能是因爲當你創建你的 「網頁」,此代碼

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

TrackingPage將是最後一個執行以下行

mainWorkNumberPanel.add(txtWorkNumber); 

private void createEquipmentNumberPanel()中,因此該面板將「擁有」JTextField。它纔有意義,UI組件只能是在任何時候一個地方,否則情況會很奇怪:)

你的陳述

兩個頁面包含相同workNumberPanel,我無法找到一個差異,這將解釋行爲。

是不正確的。您在這兩個OverViewPageTrackingPage創造WorkNumberPanel一個新實例,當您執行以下行

WorkNumberPanel equipmentNumberPanel = new WorkNumberPanel(); 

所以我的建議是,你會發現實現你想要的東西,而無需使用靜態JTextField的另一種方式(或任何其他UI組件)。

+0

兩個答案都說得很清楚,我的錯誤是什麼。現在我必須找到一種無靜態使用'JTextField'的方法。我正在創建一個'OrderObject',我從概覽頁面發送到跟蹤頁面。在那裏我想在'JTextField'中顯示訂單號(E-Number)。但我還沒有弄清楚,概覽頁面如何告訴跟蹤頁面將文本設置爲E-Number,因此我使用靜態,因爲這看起來很簡單,但是錯誤? – hamena314

+0

是的,以這種方式使用'static'不是一個解決方案。您必須獲得第一個對話框的結果並將其插入到第二個對話框中。這可以通過多種方式完成,我更喜歡[此方法](http://stackoverflow.com/a/4089370/930640)。 – BadCash

+0

那些不是對話。我有一個頁面,其中是一個導航面板(左側),號碼面板(標題),其餘是內容(中)。我使用卡片佈局從一個頁面切換到另一個頁面,並且需要在每個頁面的標題中的數字面板上保留相同的數字,因爲它們都屬於相同的順序。 – hamena314

2

在這裏你實例化一個OverviewPage,然後一個TrackingPage

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

這兩個類都實例化WorkNumberPanel

WorkNumberPanel將靜態JTextField(txtWorkNumber)添加到其顯示面板(mainWorkNumberPanel)。

單個Component不能被添加到幾個Container對象。 這是發生在您的文本字段,因爲它是static而不是一個實例變量。

最後一個加法會贏,所以文本字段只會出現在TrackingPage中,而不會再出現在OverviewPage中。

只是不要讓它static

+1

我的誤解似乎是將'static'用作將信息/數據從一個類傳遞到另一個類的簡單方法。我需要弄清楚什麼時候創建實例/對象,以及如何給他們提供他們需要的信息。 – hamena314

1

首先你需要了解什麼是靜態字段。靜態字段與對象的特定實例無關。該領域與類本身有關。
有一個很好的解釋herehere


現在關於你的情況。 A JComponent一次只能添加到一個面板。將它添加到另一個將從第一個中刪除它。

在您的代碼中,您正在創建'WorkingNumberPanel'的多個實例。當您執行此操作時,將文本字段添加到面板,其中包括static文本字段txtWorkNumber。由於字段txtWorkNumber是靜態的,因此您正在將多個組件添加相同的對象,正如我上面提到的那樣,它將從之前添加的任何位置刪除它。

解決此問題的一種可能的方法是將txtWorkNumber的值存儲在靜態變量中,並創建一個新實例(非靜態)文本字段以添加到面板。

相關問題