在类之间传递值

时间:2013-12-27 13:48:58

标签: java swing oop

我有一个JPanel表单,其中包含一个JList和一些JButton。 JPanel看起来像这样

enter image description here

单击“添加列表”按钮时,将显示单独的JFrame表单。 JFrame表单将如下所示

enter image description here

单击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                   
}

3 个答案:

答案 0 :(得分:2)

使用您的代码

更新

您可以利用PropertyChangeListenerPropertyChangeSupport(此类实现观察者模式)。

我举一个例子给你指导:

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中,按照惯例,类以大写开头并遵循驼峰样式。这对可读性非常重要。

答案 1 :(得分:0)

  

“当我点击添加按钮时,会显示一个单独的jFrame表单.jFrame包含一个jTextfield和一个提交按钮。”

您是否认真JFrameJTextField创建了全新的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;
    }
}

答案 2 :(得分:0)

好的。如果我理解你的问题,这很容易。 第1步:为JList对象引用创建setter和getter。 第2步:单击按钮,当您打开新的JFrame时,在继承JFrame的类的构造函数中传递面板引用。 第3步:通过这样做,您可以在面板引用上调用getter方法。 第4步:现在你已经引用了JList,做你想做的事。

我希望这是您问题的最佳解决方案