【问题标题】:Passing values between classes在类之间传递值
【发布时间】:2014-01-15 02:46:26
【问题描述】:

我有一个 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                   
}

【问题讨论】:

  • "如有任何建议,我们将不胜感激。" 1) 为了尽快获得更好的帮助,请发帖 SSCCE。 2)请不要忘记添加“?”提问!有些人在页面中搜索“?”如果“问题”中不存在,则直接转到下一个(实际)问题。 3) Java 类以大写字母开头。用它。 4)不要扩展框架/面板等,我想那是“你的 IDE 说话”。

标签: java swing oop


【解决方案1】:
使用您的代码

更新

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

【讨论】:

  • Frameform form=new Frameform(); form.addPropertyChangeListener(FrameForm.BUTTON_CLICKED,listener);如果框架表单已经由netbeans自动生成(因为我使用设计器GUI来创建框架)怎么办?我应该向该框架添加一个带参数的新构造函数吗?
  • 我现在在 JPanel 表单上编码new addListFrame(); this.addPropertyChangeListener();。 “这个”事物如何引用另一个创建的 JFrame?现在不应该参考JPanel吗?我是java初学者,对不起。
  • @SalcceoVanz 我编辑答案希望它对你有帮助,如果你不明白的话请告诉我
  • if(evt.getPropertyName(FrameForm.BUTTON_CLICKED)) 此代码产生错误:Method getPropertyName required no arguments, found String
  • @SalaccioVanz 我看你的代码,你有一些严重的潜在错误,1)不要使用 Vector,使用 ArrayList,2)这是最重要的。您正在覆盖validate(),这是一种一直被调用的方法,这就是为什么您的 gui 不可见的原因,请用另一个名称调用它,3rd)您的 musicPanel 每次单击时都会创建一个 JFrame 我不知道您是否想要this 4th) 遵循java代码约定,类以大写开头!!
【解决方案2】:

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

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

【讨论】:

  • 感谢回复,顺便问一下如何给JList对象添加setter?
  • ok。为 JList 对象创建一个 setter /getter 方法,在哪个类中创建 JPanel。
【解决方案3】:

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

认真是否为JTextFieldJButton 创建了一个全新的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 类中使用 String listName。当您点击添加时,从另一个框架中,它会在 GUI 类中设置 listName,然后添加到列表中。

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

    private class InnerFrame extends JFrame {
        JButton addButton;
    }
}

【讨论】:

  • 对不起,我简化了问题,实际上框架包含类似imgur.com/fNhv0tB
  • 是弹出的那个框吗?列表名称是您指的文本字段?
  • 是的,它是一个单独的弹出式 JFrame(我使用设计器 GUI 创建该 JFrame),列表名称是我所指的文本字段。
  • 让你框架作为你的主类的内部类。这样它就可以访问主类中的所有变量。您也可以在 GUI 类中拥有一个字符串 listName。当您点击添加时,从另一帧开始,它会在 GUI 类中设置 listName,然后添加到列表中
  • 如果使用Designer GUI创建框架窗体怎么办?它生成了一个很长的乱码,所以我把它分开了。
猜你喜欢
  • 2012-04-14
  • 1970-01-01
  • 2016-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-05
  • 2011-12-07
  • 2023-03-20
相关资源
最近更新 更多