【问题标题】:JDialog repaint after JList modificationJList修改后JDialog重绘
【发布时间】:2023-03-18 11:12:01
【问题描述】:

我有一个由 JFrame frm 创建的 JDialog dlg,其中包含一个 JList 列表。 当我修改列表(通过 ListModel)时,列表本身被重新绘制,但不是 JDialog。 这意味着,如果我删除一行,列表将保留一个空行,而如果我添加一行,则在我手动强制重新绘制 dlg (在 frm 中双击)。

以下建议: How to make repaint for JDialog in Swing?

在这篇文章中: Force repaint after button click

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

SwingUtilities.getWindowAncestor(dlg).repaint();

但它没有用。 我也试过了:

dlg.repaint();

也没有运气......

有什么线索吗? 非常感谢。

编辑: 我的班级组织如下: 一个控制器类,包含对主 JFrame,frm 的引用。 我还将 JDialog 扩展为 MyDialog,其中包含一个 JList。 当检测到对 frm 的双击时,我会显示 MyDialog 的实例(或创建,如果这是我第一次显示它),并且 JList 会填充传递给 DefaultListModel 的数据。 MyDialog 被绘制,以便列表只有它需要的空间。 现在,当控制器检测到特定事件时,我获取特定的 MyDialog,从 JList 获取 ListModel 并更新它。这里 JList 确实更新了,但 Dialog 保持不变。 我使用这样的代码:

MyDialog dlg = group.getDlg();
if(dlg != null){
    DefaultListModel listModel = ((DefaultListModel) dlg.getMyJList().getModel());
    listModel.addElement(idStock);
    SwingUtilities.getWindowAncestor(dlg).repaint();
}

这不会重新绘制 dlg。 我也试过了:

SwingUtilities.getWindowAncestor(dlg.getMyJList()).repaint();

但它不起作用。

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

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

【问题讨论】:

  • 你能发布一个准确描述问题的简短示例代码吗?
  • 如需尽快获得更好的帮助,请发帖SSCCE。
  • 如前所述,发布一些代码。也可以尝试 revalidate(),当然,使用调试器确保您输入了调用 repaint / revalidate 方法的代码。
  • 我应该尝试 revalidate() “而不是”还是“之前”重绘?
  • 您是否将您的 JList 放入了 JScrollPane 中?如果没有,那就是你应该做的。如果您发布代码,问题会更加明显,已经问了三遍了。

标签: java swing jdialog


【解决方案1】:

我认为你走错路了,定义DefaultListModel 可以通过所有Java 方法和类访问,这个Model 将包含你的Objects,然后将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();
            }
        });
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    相关资源
    最近更新 更多