[英]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
}
用你的代碼更新 。
您可以利用PropertyChangeListener
和PropertyChangeSupport
(此類實現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
一個JTextField
和JButton
?!
你沒聽說過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.