Java JList 未显示其元素
Java JList not showing its elements
我使用 IntelliJ IDEA 的表单设计器制作了一个 GUI,并在 JScrollPane 中添加了一个 JList。问题是无论我何时或如何将元素添加到 JList,它都不会显示它们。我使用了调试工具,我可以看到元素在 JList 中,只是没有被渲染。
我目前正在使用 DefaultListModel,但我尝试使用 Vector 和数组但没有成功。我也尝试过在 JList、JScrollPane 和 JFrame 本身中使用函数 updateUI(),以及函数 ensureIndexIsVisible() 和 JList 中列表的最后一个索引,但没有。
这个表单是从另一个表单调用的,我认为不需要主表单的代码,所以我只在这里粘贴错误表单的代码:
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,则会显示我添加的数据,但一旦加载就不会显示改变。
您应该只在构造函数中调用一次 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);
}
}
}
好的,问题是 IntelliJ IDEA 的表单设计器的工作方式与普通 Java 不同。
问题是在这种情况下不需要创建一个新的 JList,所以当我这样做时 companerosLBox = new JList<>(listaCompas);
我将它从表单中解除绑定(我想)。
因此,要使提供的代码正常工作,只需替换
companerosLBox = new JList<>(listaCompas);
与
companerosLBox.setModel(listaCompas);
在构造函数中(为了更正,从 anadirCompa()
中删除同一行)。
我使用 IntelliJ IDEA 的表单设计器制作了一个 GUI,并在 JScrollPane 中添加了一个 JList。问题是无论我何时或如何将元素添加到 JList,它都不会显示它们。我使用了调试工具,我可以看到元素在 JList 中,只是没有被渲染。
我目前正在使用 DefaultListModel,但我尝试使用 Vector 和数组但没有成功。我也尝试过在 JList、JScrollPane 和 JFrame 本身中使用函数 updateUI(),以及函数 ensureIndexIsVisible() 和 JList 中列表的最后一个索引,但没有。
这个表单是从另一个表单调用的,我认为不需要主表单的代码,所以我只在这里粘贴错误表单的代码:
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,则会显示我添加的数据,但一旦加载就不会显示改变。
您应该只在构造函数中调用一次 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);
}
}
}
好的,问题是 IntelliJ IDEA 的表单设计器的工作方式与普通 Java 不同。
问题是在这种情况下不需要创建一个新的 JList,所以当我这样做时 companerosLBox = new JList<>(listaCompas);
我将它从表单中解除绑定(我想)。
因此,要使提供的代码正常工作,只需替换
companerosLBox = new JList<>(listaCompas);
与
companerosLBox.setModel(listaCompas);
在构造函数中(为了更正,从 anadirCompa()
中删除同一行)。