我有一个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
}
答案 0 :(得分:2)
更新。
您可以利用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 :(得分:0)
“当我点击添加按钮时,会显示一个单独的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;
}
}
答案 2 :(得分:0)
好的。如果我理解你的问题,这很容易。 第1步:为JList对象引用创建setter和getter。 第2步:单击按钮,当您打开新的JFrame时,在继承JFrame的类的构造函数中传递面板引用。 第3步:通过这样做,您可以在面板引用上调用getter方法。 第4步:现在你已经引用了JList,做你想做的事。
我希望这是您问题的最佳解决方案