gpt4 book ai didi

java - JList 修改后的 JDialog 重绘

转载 作者:行者123 更新时间:2023-11-29 07:17:06 25 4
gpt4 key购买 nike

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

遵循这篇文章中的建议: How to make repaint for JDialog in Swing?

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

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

SwingUtilities.getWindowAncestor(dlg).repaint();

但是没有用。我也试过:

dlg.repaint();

也没有运气......

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

编辑:我的类(class)组织如下:一个包含对主 JFrame frm 的引用的 Controller 类。我还将 JDialog 扩展为 MyDialog,其中包含一个 JList。当检测到双击 frm 时,我显示 MyDialog 的实例(或者创建,如果这是我第一次显示它)并且 JList 填充了传递给 DefaultListModel 的数据。 MyDialog 被绘制以便列表只有它需要的空间。现在,当 Controller 检测到特定事件时,我会获取特定的 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();

但它不起作用。

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

我没有更多的代码可以展示,真的.....

最佳答案

我认为你走错了路,定义了所有 Java 方法和类都可以访问的 DefaultListModel,这个 Model 将包含你的 Objects,然后把 JList 放到 JDialogJOptionPane 中,例如

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();
}
});
}
}

关于java - JList 修改后的 JDialog 重绘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8667719/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com