我有一个简单的UI,我的按钮调用我的方法updateModelCmb(),这个方法只是增加了一个计数器的值并更新了模型.按钮似乎为模型添加了正确的值.但是当我在我的secondUI类中做同样的事情时,模型没有得到更新......我做错了什么?这是我的代码:
package testing;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JComboBox;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class OneUI extends JFrame {
private JPanel contentPane;
private JComboBox comboBox ;
private DefaultComboBoxModel modeltest;
private Integer count=0;
private JButton btnOpenSecondUi;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
OneUI frame = new OneUI();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public OneUI() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
JButton btnAddOne = new JButton("Add 1 element");
btnAddOne.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
updateModelCmb();
}
});
btnAddOne.setBounds(187, 46, 129, 23);
contentPane.add(btnAddOne);
modeltest= new DefaultComboBoxModel() ;
comboBox= new JComboBox();
comboBox.setBounds(48, 47, 129, 20);
comboBox.setModel(modeltest);
contentPane.add(comboBox);
btnOpenSecondUi = new JButton("Open second UI");
btnOpenSecondUi.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
new SecondUI();
}
});
btnOpenSecondUi.setBounds(155, 163, 161, 23);
contentPane.add(btnOpenSecondUi);
}
public void updateModelCmb(){
count++;
modeltest.addElement(count);
comboBox.setModel(modeltest);
}
}
Run Code Online (Sandbox Code Playgroud)
这是第二类似乎不起作用.
package testing;
import java.awt.BorderLayout;
public class SecondUI extends JDialog {
private final JPanel contentPanel = new JPanel();
/**
* Create the dialog.
*/
public SecondUI() {
setVisible(true);
setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
setBounds(100, 100, 327, 142);
getContentPane().setLayout(new BorderLayout());
contentPanel.setLayout(new FlowLayout());
contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
final OneUI obj = new OneUI();
getContentPane().add(contentPanel, BorderLayout.CENTER);
{
JButton btnAddOneElement = new JButton("Add 1 element");
btnAddOneElement.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
obj.updateModelCmb();
}
});
contentPanel.add(btnAddOneElement);
}
}
}
Run Code Online (Sandbox Code Playgroud)
请帮忙 :(
在你的SecondUI你正在创建新的实例OneUI
final OneUI obj = new OneUI();
obj.setVisible(true);// you don't call even this
Run Code Online (Sandbox Code Playgroud)
但你没有把它称为真可见.所以有一个隐藏的jframe和组合框,组合框得到更新,但不是第一帧的组合框,你看不到更新的组合框因为框架不可见
修复此传递oneui引用secondui然后调用该引用的方法
例
OneUI.java
public class OneUI extends JFrame {
private JPanel contentPane;
private JComboBox comboBox;
private DefaultComboBoxModel modeltest;
private Integer count = 0;
private JButton btnOpenSecondUi;
private SecondUI secondui;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
OneUI frame = new OneUI();
frame.setVisible(true);
}
});
}
public OneUI() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
JButton btnAddOne = new JButton("Add 1 element");
btnAddOne.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
updateModelCmb();
}
});
btnAddOne.setBounds(187, 46, 129, 23);
contentPane.add(btnAddOne);
modeltest = new DefaultComboBoxModel();
comboBox = new JComboBox();
comboBox.setBounds(48, 47, 129, 20);
comboBox.setModel(modeltest);
contentPane.add(comboBox);
btnOpenSecondUi = new JButton("Open second UI");
btnOpenSecondUi.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
secondui= new SecondUI(OneUI.this); // pass reference of this oneui to secondui .so secondui can catch reference of this class[this frame] and update this combobox by calling updateModelCmb on this reference
}
});
btnOpenSecondUi.setBounds(155, 163, 161, 23);
contentPane.add(btnOpenSecondUi);
}
public void updateModelCmb() {
count++;
modeltest.addElement(count);
comboBox.setModel(modeltest);
}
}
Run Code Online (Sandbox Code Playgroud)
SecondUI.java
public class SecondUI extends JDialog {
private final JPanel contentPanel = new JPanel();
public SecondUI(OneUI oneui) {
//setVisible(true); // don't call setvisible here call setvisible after you add all the component .
setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
setBounds(100, 100, 327, 142);
getContentPane().setLayout(new BorderLayout());
contentPanel.setLayout(new FlowLayout());
contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
getContentPane().add(contentPanel, BorderLayout.CENTER);
{
JButton btnAddOneElement = new JButton("Add 1 element");
btnAddOneElement.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
oneui.updateModelCmb();
}
});
contentPanel.add(btnAddOneElement);
}
setVisible(true); // call setvisible at last
}
}
Run Code Online (Sandbox Code Playgroud)