Java JList修改后重新绘制JDialog

Java JList修改后重新绘制JDialog,java,swing,jdialog,Java,Swing,Jdialog,我有一个JDialog dlg,由JFrame frm创建,它包含一个JList列表。 当我(通过ListModel)修改列表时,列表本身被重新绘制,而不是JDialog。 这意味着,如果我删除一行,列表将保留一个空行,而如果我添加一行,在我手动强制重新绘制dlg(在frm中双击)之前,该新行不会显示(因为对话框中没有空格) 本帖建议如下: 在这篇文章中: 我试图从我的控制器类(更新列表的地方)调用以下行: SwingUtilities.getWindowAncestor(dlg).repa

我有一个JDialog dlg,由JFrame frm创建,它包含一个JList列表。 当我(通过ListModel)修改列表时,列表本身被重新绘制,而不是JDialog。 这意味着,如果我删除一行,列表将保留一个空行,而如果我添加一行,在我手动强制重新绘制dlg(在frm中双击)之前,该新行不会显示(因为对话框中没有空格)

本帖建议如下:

在这篇文章中:

我试图从我的控制器类(更新列表的地方)调用以下行:

SwingUtilities.getWindowAncestor(dlg).repaint();
但它不起作用。 我还尝试:

dlg.repaint();
SwingUtilities.getWindowAncestor(dlg.getMyJList()).repaint();
也没有运气

有线索吗? 多谢各位

编辑: 我的课程安排如下: 包含对主JFrame frm的引用的控制器类。 我还将JDialog扩展到MyDialog中,其中包含一个JList。 当检测到双击frm时,我将显示MyDialog的实例(如果是第一次显示它,则显示create),JList将填充传递给DefaultListModel的数据。MyDialog已绘制,因此列表仅具有所需的空间。 现在,当控制器检测到特定事件时,我会获取特定的MyDialog,从JList获取ListModel并更新它。此处JList确实已更新,但对话框保持不变。 我使用这样的代码:

MyDialog dlg = group.getDlg();
if(dlg != null){
    DefaultListModel listModel = ((DefaultListModel) dlg.getMyJList().getModel());
    listModel.addElement(idStock);
    SwingUtilities.getWindowAncestor(dlg).repaint();
}
这不会重新绘制dlg。 我还尝试:

dlg.repaint();
SwingUtilities.getWindowAncestor(dlg.getMyJList()).repaint();
但它不起作用

我使用调试器检查了这些行是否实际执行


我没有太多的代码要显示,真的….

我认为你走错了方向,定义了可通过所有Java方法和类访问的
DefaultListModel
,这个
模型将保存你的
对象
,然后将
JList
放入
JDialog
JOptionPane

import java.awt.*;
import java.awt.event.ActionEvent;
import javax.swing.*;

// based on @trashgod code
/** @see http://stackoverflow.com/questions/5759131 */
// http://stackoverflow.com/questions/8667719/jdialog-repaint-after-jlist-modification

public class ListDialog {

    private static final int N = 12;
    private JDialog dlg = new JDialog();
    private DefaultListModel model = new DefaultListModel();
    private JList list = new JList(model);
    private JScrollPane sp = new JScrollPane(list);
    private int count;

    public ListDialog() {
        list.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        JPanel panel = new JPanel();
        panel.add(new JButton(new AbstractAction("Add") {

            private static final long serialVersionUID = 1L;

            @Override
            public void actionPerformed(ActionEvent e) {
                append();
                if (count <= N) {
                    list.setVisibleRowCount(count);
                    dlg.pack();
                }
            }
        }));
        panel.add(new JButton(new AbstractAction("Remove") {

            private static final long serialVersionUID = 1L;

            @Override
            public void actionPerformed(ActionEvent e) {
                int itemNo = list.getSelectedIndex();
                if (itemNo > -1) {
                    removeActionPerformed(e, itemNo);
                }
            }
        }));
        for (int i = 0; i < N - 2; i++) {
            this.append();
        }
        list.setVisibleRowCount(N - 2);
        dlg.add(sp, BorderLayout.CENTER);
        dlg.add(panel, BorderLayout.SOUTH);
        dlg.pack();
        dlg.setLocationRelativeTo(null);
        dlg.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        dlg.setVisible(true);
    }

    private void removeActionPerformed(ActionEvent e, int itemNo) {
        System.out.println("made_list's model: " + list.getModel());
        System.out.println("Model from a fresh JList: " + new JList().getModel());
        model = (DefaultListModel) list.getModel();
        if (model.size() > 0) {
            if (itemNo > -1) {
                model.remove(itemNo);
            }
        }
    }

    private void append() {
        model.addElement("String " + String.valueOf(++count));
        list.ensureIndexIsVisible(count - 1);
    }

    public static void main(String[] a_args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                ListDialog pd = new ListDialog();
            }
        });
    }
}
import java.awt.*;
导入java.awt.event.ActionEvent;
导入javax.swing.*;
//基于@trashgod代码
/**@见http://stackoverflow.com/questions/5759131 */
// http://stackoverflow.com/questions/8667719/jdialog-repaint-after-jlist-modification
公共类列表对话框{
专用静态最终整数N=12;
私有JDialog dlg=newjdialog();
私有DefaultListModel=new DefaultListModel();
专用JList列表=新JList(型号);
私有JScrollPane sp=新JScrollPane(列表);
私人整数计数;
公共列表对话框(){
list.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
JPanel面板=新的JPanel();
panel.add(新的JButton(新的抽象操作(“add”){
私有静态最终长serialVersionUID=1L;
@凌驾
已执行的公共无效操作(操作事件e){
附加();
如果(计数-1){
已执行的移除操作(e,项目编号);
}
}
}));
对于(int i=0;i0){
如果(项目编号>-1){
型号。移除(项目编号);
}
}
}
私有void append(){
model.addElement(“String”+String.valueOf(++count));
列表。确保索引可见(计数-1);
}
公共静态void main(字符串[]a_args){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
ListDialog pd=新建ListDialog();
}
});
}
}

我认为您走错了方向,定义了可通过所有Java方法和类访问的
DefaultListModel
,例如,这个
模型将保存您的
对象
,然后将
JList
放入
JDialog
作业窗格

import java.awt.*;
import java.awt.event.ActionEvent;
import javax.swing.*;

// based on @trashgod code
/** @see http://stackoverflow.com/questions/5759131 */
// http://stackoverflow.com/questions/8667719/jdialog-repaint-after-jlist-modification

public class ListDialog {

    private static final int N = 12;
    private JDialog dlg = new JDialog();
    private DefaultListModel model = new DefaultListModel();
    private JList list = new JList(model);
    private JScrollPane sp = new JScrollPane(list);
    private int count;

    public ListDialog() {
        list.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        JPanel panel = new JPanel();
        panel.add(new JButton(new AbstractAction("Add") {

            private static final long serialVersionUID = 1L;

            @Override
            public void actionPerformed(ActionEvent e) {
                append();
                if (count <= N) {
                    list.setVisibleRowCount(count);
                    dlg.pack();
                }
            }
        }));
        panel.add(new JButton(new AbstractAction("Remove") {

            private static final long serialVersionUID = 1L;

            @Override
            public void actionPerformed(ActionEvent e) {
                int itemNo = list.getSelectedIndex();
                if (itemNo > -1) {
                    removeActionPerformed(e, itemNo);
                }
            }
        }));
        for (int i = 0; i < N - 2; i++) {
            this.append();
        }
        list.setVisibleRowCount(N - 2);
        dlg.add(sp, BorderLayout.CENTER);
        dlg.add(panel, BorderLayout.SOUTH);
        dlg.pack();
        dlg.setLocationRelativeTo(null);
        dlg.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        dlg.setVisible(true);
    }

    private void removeActionPerformed(ActionEvent e, int itemNo) {
        System.out.println("made_list's model: " + list.getModel());
        System.out.println("Model from a fresh JList: " + new JList().getModel());
        model = (DefaultListModel) list.getModel();
        if (model.size() > 0) {
            if (itemNo > -1) {
                model.remove(itemNo);
            }
        }
    }

    private void append() {
        model.addElement("String " + String.valueOf(++count));
        list.ensureIndexIsVisible(count - 1);
    }

    public static void main(String[] a_args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                ListDialog pd = new ListDialog();
            }
        });
    }
}
import java.awt.*;
导入java.awt.event.ActionEvent;
导入javax.swing.*;
//基于@trashgod代码
/**@见http://stackoverflow.com/questions/5759131 */
// http://stackoverflow.com/questions/8667719/jdialog-repaint-after-jlist-modification
公共类列表对话框{
专用静态最终整数N=12;
私有JDialog dlg=newjdialog();
私有DefaultListModel=new DefaultListModel();
专用JList列表=新JList(型号);
私有JScrollPane sp=新JScrollPane(列表);
私人整数计数;
公共列表对话框(){
list.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
JPanel面板=新的JPanel();
panel.add(新的JButton(新的抽象操作(“add”){
私有静态最终长serialVersionUID=1L;
@凌驾
已执行的公共无效操作(操作事件e){
附加();
如果(计数-1){
已执行的移除操作(e,项目编号);
}
}
}));
对于(int i=0;i