当前位置: 首页 > 知识库问答 >
问题:

在类之间传递值

曾宏毅
2023-03-14

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

当我单击Add List按钮时,会显示一个单独的JFrame表单。JFrame表单将如下所示

单击JFrame上的add按钮时,我需要将JTextfield(命名列表名)的值添加到上一个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表单的代码(使用设计器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个答案

晁国发
2023-03-14

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

您是否认真地为JTextFieldJButton创建了一个全新的JFrame?!

你没听说过< code>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类中也可以有一个字符串listName。在另一个框架中,当您单击add时,它将在GUI类中设置listName,然后将其添加到列表中。

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

    private class InnerFrame extends JFrame {
        JButton addButton;
    }
}
夏弘文
2023-03-14

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

我希望这是解决你问题的最好办法

季森
2023-03-14

用您的代码更新。

您可以利用Property tyChangeListenerProperty tyChangeSupport(该类实现了观察者模式)。

我给你举个例子作为指导:

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

 类似资料:
  • 我得到了这个错误: “变量'a'已赋值,但其值永远不可用”

  • 问题内容: 我有一个调用会弹出一个的,以便用户可以选择目录。这些都是单独的类。从中传递值的正确方法是什么,以便我可以在中显示目录的路径? 编辑:更新了问题。 问题答案: 这是一个不完整的示例,但我想可以使您了解如何实现所需的目标。重要的一点是引用要在其中进行选择的属性,例如 参见下面如何将其放置在代码中: 希望对您有所帮助,对不起您没有提供完整的示例。 编辑 本质上,我们没有将任何参数传递给Abs

  • 可以在多个类之间传递数据吗? 我试图实现的是“一个类设置某个类的值,另一个类访问它”(java初学者)

  • 我正在创建一个支持多重选择的QML,并将在我的应用程序中实例化其中的多个。我需要将键盘焦点赋予特定列表,处理该列表的按键,并根据焦点为选定的行绘制高亮显示。 但是,将赋予ListView委托或ListView本身并不会导致在ListView上出现,也不会导致触发按键信号。 我创建了一个简单的示例应用程序,展示了我的问题: 单击任一列表都不会将选定的行变成粉红色,按上/下键也不会调整选定内容。 如何

  • 如何从secondactivity.java中的包到fragment_2.java文件中获取值?

  • 我有两项活动。两者都已实现surfaceview。在第一个活动中,我有一个名为score1的变量,我想将score1中的值传递给第二个活动。 每次我运行应用程序时,它在完成第一个活动后崩溃,并尝试加载第二个活动。在我编写代码以获取第二个活动中的额外意图之前,一切都很好。 我的第一个活动有这样的意图: 在我的第二个活动中,以下代码试图获取score1变量的值: 我不明白为什么每次activity o