簡體   English   中英

如何將數據從1個JFrame形式的文本字段傳遞到另一個JFrame形式的JList?

[英]How can I pass data from text-fields in 1 JFrame Form to a JList in another JFrame Form?

在一個允許客戶在1個GUI上注冊其信息的GUI(單擊按鈕以添加新客戶)上進行操作,從而在單擊“添加”按鈕以注冊其信息之后,它將收集其所有數據(姓,名,地址第1 / 2,城市和郵政編碼),然后將其上載到上一個GUI的JList中,其中顯示客戶的名字和姓氏。 然后,用戶可以從中選擇該特定客戶,然后單擊以在新的GUI中更新該客戶的詳細信息。

我遇到的問題是試圖弄清楚如何從第二個GUI中的文本字段傳遞所有客戶的數據,然后將它們傳輸到第一個GUI中的JList中,並且只顯示名字和姓氏。 我還面臨的第二個問題是如何打開另一個GUI,當選擇了該特定客戶時,它將逆轉該過程,以便可以更改其詳細信息。

在數據模型包的Person類中,我有方法getFullName,其方法如下:

public String getFullName()
{
    String result = this.forename + " " + this.surname;
    return result;
}

有誰知道如何或者可以向我展示如何解決這些問題?

我嘗試在按btnAdd時在第二個GUI中使用getFullName方法進行實驗,如下所示:

public void addItem()
{
    String result = this.forename + " " + this.surname;
    return result;
}

但是a,我沒有運氣。

關於您的問題:

我遇到的問題是試圖弄清楚如何從第二個GUI的文本字段傳遞所有客戶的數據,然后將它們傳輸到第一個GUI的JList中。

在這種情況下通常有兩個問題-

  1. 如何獲取由添加新客戶對話框窗口(是的,這應該是某種形式的對話框窗口,JDialog或JOptionPane)的字段保存的信息到父窗口對象中,以及
  2. 如何准確地通知何時應該進行信息傳遞,而這通常是兩者中比較棘手的問題。

同樣,第一個問題通常很容易解決,因為它只不過是如何在兩個類之間傳遞信息這一更普遍問題的特定版本。 解決它的最簡單方法是在對話框窗口類中使父窗口類調用getter方法以提取其狀態。 例如,對話框窗口可以具有每個JTextField中保存的數據的公共getter方法,調用父窗口可以調用該方法,或者對話框類可以具有getCustomer()方法,在其中收集其輸入字段保留的所有信息。 ,創建一個Customer對象,然后返回該對象。

傳輸數據的一種更好,更健壯的方法可能是將程序構造為Model-View-Control或MVC類型的程序,讓添加新的客戶對話框窗口在按下其提交按鈕時更新模型,並讓其父主由模型通知窗口其數據已更改,因此它知道必須更新其數據視圖。 這可能是矯枉過正為您的程序,所以我不打算在這個時候推這一建議,但在未來,當你創建更大更復雜的程序,這是真的,你會想要做什么,因為它會更輕松地使程序的類具有高內聚性(處理相同事物的代碼緊密結合在一起)和低耦合(處理不同事物的代碼沒有緊密結合在一起,從而降低了代碼復雜性),從而使調試和改善您的代碼變得更加容易程序。

同樣,第二個問題更難解決。 如果對話框窗口是獲得並提交構成一個客戶的信息后關閉,比最簡單的解決方案,這是為了讓新客戶對話窗口模態的JDialog或JOptionPane的(這真的沒有什么比一個專門的模態的JDialog更多)。 為什么這樣做有幫助,是因為Swing具有一種用於模式對話框的特殊機制,該機制在將對話框設置為可見后立即凍結在調用窗口中的代碼流。 因此,調用代碼將始終知道對話框何時不再可見,因為僅當對話框不可見時,其代碼的程序流才會恢復。 因此,您需要在將對話框或JOptionPane設置為可見的那一行之后的行中提取對話框窗口的數據。 並且在您放棄JOptionPanes過於簡單之前,請了解它們的第二個參數, Object類型的Object可以將任何 Swing GUI組件作為參數,包括一個包含非常大而復雜的GUI的JPanel,這使這些工具非常有用。

如果第二個對話框窗口在提交客戶時不會關閉,而是保持打開狀態,例如,如果您希望將其保持打開狀態,以便用戶可以輸入多個客戶,那么您很可能希望它是一個非模態 JDialog,將需要設置某種通知方案,以便在用戶提交客戶時通知調用代碼。 一種可能的方法是通過給對話框類提供公共的addActionListener(....)方法,從而允許調用類向對話框的提交按鈕添加ActionListener。 另一個方法是使用Swing的PropertyChangeSupport並讓調用類將PropertyChangeListener添加到添加客戶對話框中,從而通知其屬性發生重大更改(即,提交按鈕已更改,或者已創建新客戶)。 。 如果您對程序使用MVC設計,則通知將從模型到視圖。 換句話說,該對話框將創建新的Customer,提交按鈕將使Control將Customer添加到模型,並且將向主GUI的Model偵聽器通知新創建的對象並將其顯示。


...如何從第二個GUI中的文本字段傳遞所有客戶的數據,然后將其傳輸到第一個GUI中的JList中, 並且只顯示名字和姓氏

您的JList應該是JList<Customer>以便它包含完整的 Customer對象的集合。 您可以通過覆蓋Customer toString()方法(不推薦使用此方法,因為它比用於最終用戶顯示的調試更多,而不推薦這樣做),或者通過為JList分配自定義ListCellRenderer (推薦)更好地更改JList顯示數據的方式。 Swing JList教程將說明如何執行此操作,如果您在此步驟中遇到困難 ,可以嘗試使用代碼返回此處。


我還面臨的第二個問題是如何打開另一個GUI,當選擇了該特定客戶時,它將逆轉該過程,以便可以更改其詳細信息。

這將以與上述基本相同的方式解決,除了要創建一個新的Customer並將其添加到JList顯示的集合中,您可以將JList中的一個Customer替換為已編輯的Customer。

要獲得更詳細的幫助,請考慮創建並發布最小,完整和可驗證的示例程序 我們不想看到您的整個程序,但是您應該將代碼壓縮為仍可編譯的最小位,沒有與您的問題無關的額外代碼,但仍然可以演示您的問題。

您可以在main(args [])中傳遞名字和姓氏或其他數據;

這樣稱呼您Jframe Yourclassname.main(new string [] {“ firstname”,“ lastname”});

讓我們知道您想如何在JList中設置數據。

每個項目應包含一個實體或每個項目包含一個實體屬性。

為了更好地顯示數據,您必須使用jtable。

關於您的兩個jframe,一個包含用於輸入的文本字段,另一個則顯示數據。 我想指導您在joptionPane中使用jpanel,例如以下代碼片段:

私人客戶客戶;

private void newCustomer() {

    JLabel labelCode = new JLabel("Customer Code *");
    JTextField jTextFieldCode = new JTextField();
    JLabel labelName = new JLabel("Customer Name *");
    JTextField jTextFieldName = new JTextField();
    JLabel labelPrincipalAdress = new JLabel("Principal Adress *");
    JTextField jTextFieldPrincipalAdress = new JTextField();
    JLabel labelSaleAdress = new JLabel("Sale Adress *");
    JTextField jTextFieldSaleAdress = new JTextField();
    JLabel labelActivity = new JLabel("Activity ");
    JTextField jTextFieldActivity = new JTextField();

    JLabel labelDiscountC = new JLabel("Discount Code *");

    JLabel labelCountryC = new JLabel("Country Code *");
    JComboBox<String> jComboBoxCountryC = new JComboBox<>(Locale.getISOCountries());
    jComboBoxCountryC.setSelectedIndex(-1);

    JPanel panel = new JPanel();

    panel.add(labelCode);
    panel.add(jTextFieldCode);
    panel.add(labelName);
    panel.add(jTextFieldName);
    panel.add(labelPrincipalAdress);
    panel.add(jTextFieldPrincipalAdress);
    panel.add(labelSaleAdress);
    panel.add(jTextFieldSaleAdress);
    panel.add(labelActivity);
    panel.add(jTextFieldActivity);

    panel.add(labelCountryC);
    panel.add(jComboBoxCountryC);
    panel.setLayout(new GridLayout(8, 2, 1, 3));

    for (Component c : panel.getComponents()) {
        c.setFont(new Font("", Font.PLAIN, 14));
        c.setPreferredSize(new Dimension(150, 25));
    }

    if (JOptionPane.showConfirmDialog(this, panel, "New Customer",
            JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE) == JOptionPane.OK_OPTION) {


            Customer newCustomer = new Customer();
            newCustomer.setCode(jTextFieldCode.getText());
            newCustomer.setName(jTextFieldName.getText());
            newCustomer.setPrincipalAdresse(labelPrincipalAdress.getText());
            newCustomer.setShippingAdresse(jTextFieldSaleAdress.getText());
            newCustomer.setActivity(jTextFieldActivity.getText());
             newCustomer.setCountry_code((String) jComboBoxCountryC.getSelectedItem());

            MainFrame.customerSBRemote.addCustomer(newCustomer);
            customersList.add(newCustomer);
            this.customer = newCustomer;
            jTableCustomer.changeSelection(customersList.indexOf(newCustomer), 0, false, false);
            this.hashcode = customer.hashCode();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(this, e.getMessage());
        }

    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM