如何对JList中的模型显示进行更改
问题描述:
我试图创建一个简单的程序,它接受JTextArea中的输入,然后将其放入JList(当按下焦点的JTextArea时按下)。问题是当文本被保存在Model类的ArrayList中时,它在JList中不可见。一个修复将不胜感激。如何对JList中的模型显示进行更改
主要类:
public class Main {
public static void main(String[] args) {
Model model = new Model();
JFrame frame = new JFrame();
JPanel panel = new JPanel(new BorderLayout());
JTextField text = new JTextField();
JList list = new JList(model);
JScrollPane scroll = new JScrollPane(list);
frame.setSize(300, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.add(panel);
panel.add(scroll, BorderLayout.CENTER);
panel.add(text, BorderLayout.PAGE_END);
text.setText("Enter Text");
frame.setVisible(true);
text.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
model.add(text.getText());
}
});
模型类:
public class Model extends AbstractListModel{
List<String> list = new ArrayList<>();
@Override
public int getSize() {
return list.size();
}
@Override
public Object getElementAt(int index) {
return list.get(index);
}
@Override
public void addListDataListener(ListDataListener l) { }
@Override
public void removeListDataListener(ListDataListener l) { }
public void add(String x){
int size = list.size();
list.add(size, x);
fireIntervalAdded(this, size, size);
}
void remove(int index) {
list.remove(index);
fireIntervalRemoved(this, index, index);
}
我听说使用fireIntervalAdded和fireIntervalRemoved方法会解决我的问题,但事实并非如此。也许我没有正确使用它们?
答
你拍摄自己的脚,此代码:
@Override
public void addListDataListener(ListDataListener l) { }
@Override
public void removeListDataListener(ListDataListener l) { }
AbstractListModel上已经有了这些方法,并通过重写它们,你要阻止视图(您的JList)从倾听和响应模型中的变化。删除这些空方法,或从它们中调用super的方法,并且您的代码应该工作。
..................您好吗?请让我们知道,如果答案帮助/解决了您的问题。 –
你为什么要创建一个自定义ListModel?只需使用DefaultListModel。 – camickr