Java 在类之间传递值

Java 在类之间传递值,java,swing,oop,Java,Swing,Oop,我有一个JPanel表单,其中包含一个JList和一些JButton。 JPanel看起来像这样 单击“添加列表”按钮时,将显示一个单独的JFrame表单。 JFrame表单将如下所示 单击JFrame上的add按钮时,我需要将JTextfield(命名列表名)的值添加到上一个JPanel上的JList中。我想知道如何将值从JFrame传递到JPanel?如有任何建议,将不胜感激 以下是JPanel表单的代码(使用Designer GUI) 以下是JFrame表单的代码(使用Designer

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

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

单击JFrame上的add按钮时,我需要将JTextfield(命名列表名)的值添加到上一个JPanel上的JList中。我想知道如何将值从JFrame传递到JPanel?如有任何建议,将不胜感激

以下是JPanel表单的代码(使用Designer GUI)

以下是JFrame表单的代码(使用Designer GUI)

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

您是否认真地为
JTextField
JButton
创建了一个全新的
JFrame

您是否听说过
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类中也可以有一个字符串列表名。在另一个框架中,当您点击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的参考,做您想做的事情


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

使用您的代码更新

您可以利用
PropertyChangeListener
PropertyChangeSupport
(此类实现了观察者模式)

我举一个例子给你指导:

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)如果您想尽快得到更好的帮助,请发布一封电子邮件。2) 请不要忘记在问题中添加“?”!有些人在页面中搜索“?”,如果“问题”中不存在,则直接转到行中的下一个(实际)问题。3) Java类以大写字母开头。使用它。4) 不要扩展框架/面板等,我想这是“你的IDE在说话”。对不起,我简化了这个问题,实际上框架包含这样的内容,就是弹出的框架吗?列表名是您所指的文本字段?是的,它是一个单独的弹出式JFrame(我使用designer GUI创建该JFrame),列表名是我所指的文本字段。您将frame作为主类的内部类。这样它就可以访问主类中的所有变量。GUI类中也可以有一个字符串
listName
。当您点击add时,它会在另一个框架中设置GUI类中的listName,然后将其添加到列表中如果框架表单是使用Designer GUI创建的呢?它生成了一个长而混乱的代码,因此我将其分离为respone.thx,顺便问一下如何向JList对象添加setter?好的。为JList对象创建setter/getter方法,在哪个类中创建JPanel。
Frameform form=new Frameform();addPropertyChangeListener(FrameForm.BUTTON\u单击,listener)如果框架表单已经由netbeans自动生成(因为我使用designer GUI创建框架),该怎么办?我应该向该框架添加一个带参数的新构造函数吗?我对
newaddlistframe()进行编码;this.addPropertyChangeListener()。“这个”东西怎么能引用另一个创建的JFrame?现在不应该提到JPanel吗?抱歉,我是java初学者。@salaceovanz我编辑了答案,希望对您有所帮助,如果您不理解
if(evt.getPropertyName(FrameForm.BUTTON\u CLICKED))
此代码产生错误:方法getPropertyName不需要参数,找到了String@SalacceoVanz我看了你的代码,你有一些严重的潜在错误,1)不要使用向量,使用
ArrayList
,2)这是最重要的。您正在重写
validate()
,这是一个一直被调用的方法,这就是为什么您的gui不可见,请用另一个名称调用它,第3)您的musicPanel每次单击时都在创建JFrame我不知道您是否想要这个第4)遵循java代码约定,类以大写开头!!
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());
         }

    });
}