簡體   English   中英

在類之間傳遞值

[英]Passing values between classes

我有一個JPanel表單,其中包含一個JList和一些JButton。 JPanel看起來像這樣

在此輸入圖像描述

單擊“添加列表”按鈕時,將顯示單獨的JFrame表單。 JFrame表單將如下所示

在此輸入圖像描述

單擊JFrame上的添加按鈕時,我需要將JTextfield(名為List Name)的值添加到上一個JPanel上的JList。 我想知道如何將值從JFrame傳遞給JPanel? 任何建議將不勝感激。

這是JPanel表單的代碼(使用Designer GUI)

package multimediaproject;

public class musicPlayerPanel extends javax.swing.JPanel {

    public musicPlayerPanel() {       
        initComponents();   
    }

    private void initComponents() {
          //...here is the generated code by using designer GUI       
    }                      

    // Variables declaration - do not modify                     
    //..generated code
    // End of variables declaration                   
}

這是JFrame表單的代碼(使用Designer GUI)

package multimediaproject;

public class addListFrame extends javax.swing.JFrame {

    public addListFrame() {
        initComponents();

        this.setLocation(515, 0);
        setVisible(true);        
    }

    private void initComponents() {
    //..here is the generated code by using Designer GUI       
    }                       

    private void addBtnActionPerformed(java.awt.event.ActionEvent evt){                                      
        //some validation
        if(...)
        {
            //validation
        }

        else
        {
           //IF VALUE IS CORRECT, ADD the List Name JTextfield value to the JList on the previous JPanel

          errorMessage.setText("");
        }

}                                      

public static void main(String args[]) {

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new addListFrame().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify                     
    //....generated code
    // End of variables declaration                   
}

用你的代碼更新

您可以利用PropertyChangeListenerPropertyChangeSupport (此類實現Observer Pattern)。

我給你一個例子作為指導:

public class MusicPlayerPanel extends JPanel {

private JList list;
private JButton addButton;
private PropertyChangeListener listener = new MyPropertyChangeListener();

//..in some place
addButton.addActionListener(new ActionListener(){
  @Override
  public void actionPerformed(ActionEvent e){
        JFrame form = new FrameForm();
        form.addPropertyChangeListener(FrameForm.BUTTON_CLICKED,listener);
        form.setVisible(true);
  }

});

//in another place

private class MyPropertyChangeListener implements PropertyChangeListener{

    @Override
    public void propertyChange(PropertyChangeEvent evt){
         if(evt == null)
              return;

        if(evt.getPropertyName().equals(FrameForm.BUTTON_CLICKED)){
           String value = (String) evt.getNewValue();
           ((DefaultListModel)list.getModel()).addElement(value); 
        }

    }

}


}

框架形式如下:

public class AddListFrame extends JFrame{


 private JTextField textfield;
 private JButton submitButton;
 public static final String BUTTON_CLICKED ="buttonClicked";

 // in some place
   submitButton.addActionListener(new ActionListener(){
         @Override
         public void actionPerformed(ActionEvent evt){
               firePropertyChange(BUTTON_CLICKED,null,textfield.getText());
         }

    });
}

注意 :在按慣例的java中,類以大寫開頭並遵循駝峰樣式。 這對可讀性非常重要。

“當我點擊添加按鈕時, 會顯示一個單獨的jFrame表單.jFrame包含一個jTextfield和一個提交按鈕。”

你有沒有認真地創造一個全新JFrame一個JTextFieldJButton ?!

你沒聽說過JOptionPane嗎? 這正是你想要復制的東西。 您需要的唯一代碼是:

String s = JOptionPane.showInputDialog(component, message);    
model.addElement(s);

第一行將涵蓋您的自定義JFrame所有代碼。

看看這個例子

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class JOPDemo extends JPanel {

    JList list;
    JButton button = new JButton("Add Name");
    String name;
    DefaultListModel model;

    public JOPDemo() {
        model = new DefaultListModel();
        list = new JList(model);

        setLayout(new BorderLayout());
        add(list, BorderLayout.CENTER);
        add(button, BorderLayout.SOUTH);



        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                name = JOptionPane.showInputDialog(this, "Enter a name");
                model.addElement(name);
            }
        });
    }

    public Dimension getPreferredSize() {
        return new Dimension(300, 300);

    }

    private static void createAndShowGui() {
        JFrame frame = new JFrame();
        frame.add(new JOPDemo());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGui();

            }
        });
    }
}

編輯

你可以做的是有一個內部類,它是你的JFrame。 就個人而言,我會選擇JDialog。

來自評論:將您的框架作為主類的內部類。 這樣它就可以訪問主類中的所有變量。 您也可以在GUI類中擁有String listName。 當你點擊add時,從另一個框架中,它在GUI類中設置listName,然后添加到列表中。

public class GUI {
    String listName;
    JList list;
    InnerFrame inner = new InnerFrame();

    private class InnerFrame extends JFrame {
        JButton addButton;
    }
}

好的。如果我理解你的問題,這很容易。 第1步:為JList對象引用創建setter和getter。 第2步:單擊按鈕,當您打開新的JFrame時,在繼承JFrame的類的構造函數中傳遞面板引用。 第3步:通過這樣做,您可以在面板引用上調用getter方法。 第4步:現在你已經引用了JList,做你想做的事。

我希望這是你問題的最佳解決方案

暫無
暫無

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

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