我无法从JDialog更新Jcombobox(通过模型)

Sar*_*ona 1 java swing

我有一个简单的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)

请帮忙 :(

Mad*_*tha 6

在你的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)

  • @SargeOrona当你调用你的`SecondUI`然后将你的`OneUI`的引用作为参数传递给`SecondUI`的构造函数 (2认同)
  • @LuxxMiner谢谢我讨厌复制粘贴:D:D你是对的它不应该是`new SecondUI(this);`我想写`new SecondUI(OneUI.this);` (2认同)