【问题标题】:Java JList not showing its elementsJava JList 未显示其元素
【发布时间】:2022-01-23 17:15:00
【问题描述】:

我使用 IntelliJ IDEA 的表单设计器制作了一个 GUI,并在 JScrollPane 中添加了一个 JList。问题是,无论何时或如何将元素添加到 JList,它都不会显示它们。我使用了调试工具,可以看到元素在 JList 中,只是没有渲染。

我目前正在使用 DefaultListModel,但我尝试使用 Vector 和数组但没有成功。我还尝试在 JList、JScrollPane 和 JFrame 本身中使用函数 updateUI(),以及在 JList 中使用列表的最后一个索引的函数 ensureIndexIsVisible(),但没有。

这个表单是从另一个表单调用的,我认为不需要主表单的代码,所以我只将错误表单的代码粘贴到这里:

import javax.swing.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class Enviar extends JFrame {
    private JTextField codigoTxt;
    private JButton anadirBtn;
    private JPanel enviar;
    private JLabel errorCodigoLbl;
    private JList<String> companerosLBox;
    private DefaultListModel<String> listaCompas = new DefaultListModel<>();
    private JButton eliminarSelecBtn;
    private JButton eliminarTodoBtn;
    private JTextField xPosTxt;
    private JTextField yPosTxt;
    private JLabel errorClickLbl;
    private JButton clickBtn;
    private JButton atrasBtn;
    private JScrollPane scrollPane;

    public Enviar() {
        setContentPane(enviar);
        setTitle("Remote Clicker - Enviar click");
        setResizable(false);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        pack();
        errorCodigoLbl.setVisible(false);
        errorClickLbl.setVisible(false);
        setVisible(true);
        listaCompas.addElement("sdd");
        listaCompas.addElement("sd2d");
        listaCompas.addElement("sdd3");
        companerosLBox = new JList<>(listaCompas);
        scrollPane = new JScrollPane(companerosLBox);
        anadirBtn.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                super.mouseClicked(e);
                anadirCompa(codigoTxt.getText());
            }
        });
        codigoTxt.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                super.keyPressed(e);
                if (e.getKeyCode() == KeyEvent.VK_ENTER) {
                    anadirCompa(codigoTxt.getText());
                }
            }
        });
    }

    private void anadirCompa(String codigo) {
        if (valido(codigo)) {
            codigoTxt.setText("");
            errorCodigoLbl.setVisible(false);
            listaCompas.addElement(codigo);
            companerosLBox.setModel(listaCompas);
        } else {
            errorCodigoLbl.setVisible(true);
        }
    }

    private boolean valido(String codigo) {
        boolean res = true;
        int i = 0;
        while (res && i < codigo.length())
        {
            res = codigo.charAt(i) >= '0' && codigo.charAt(i) <= '9' || codigo.charAt(i) == '-';
            i++;
        }
        return res && codigo.indexOf('-') > 0 && codigo.indexOf('-') < codigo.length()-1;
    }
}

我还能做什么或者我做错了什么?

编辑:我还要补充一点,如果我通过表单构建器本身填充 JList,我在那里添加的数据会显示出来,但是一旦加载它就不会改变。

【问题讨论】:

  • enviar 从来没有赋值,所以它是空的。
  • 如果我尝试 make enviar = new JPanel(); 现在窗口什么也没有显示,那就更糟了

标签: java swing intellij-idea jlist


【解决方案1】:

您应该只在构造函数中调用一次 jList.setModel()。每次向列表中添加内容时都会调用它。

试试这个:

public class Enviar extends JFrame {
    //...
    private JList<String> companerosLBox = new JList<>();
    private DefaultListModel<String> listaCompas = new DefaultListModel<>();

    public Enviar() {
        //...
        listaCompas.addElement("sdd");
        listaCompas.addElement("sd2d");
        listaCompas.addElement("sdd3");
        companerosLBox.setModel(listaCompas);
    }

    private void anadirCompa(String codigo) {
        if (valido(codigo)) {
            codigoTxt.setText("");
            errorCodigoLbl.setVisible(false);
            listaCompas.addElement(codigo);
        } else {
            errorCodigoLbl.setVisible(true);
        }
    }

}

【讨论】:

  • 我添加第二个只是为了检查是否有必要,但一开始我只做了一次,所以问题不在于
  • 仔细看。每次调用 anadirCompa() 时,都会使用 companerosLBox.setModel(listaCompas) 重置模型。也许这不是导致问题的原因,但这并不正确。
  • 是的,我知道,我只是想看看它是否有帮助后忘记删除它
【解决方案2】:

好的,问题在于 IntelliJ IDEA 的表单设计器与普通 Java 的工作方式不同。

问题是在这种情况下不需要创建新的 JList,所以当我创建 companerosLBox = new JList&lt;&gt;(listaCompas); 时,我将它从表单中解除绑定(我想)。

因此,要使提供的代码正常工作,只需替换它

companerosLBox = new JList<>(listaCompas);

companerosLBox.setModel(listaCompas);

在构造函数中(为了更正,从anadirCompa() 中删除同一行)。

【讨论】:

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