java-JList包装问题
作者:互联网
当我在运行时向其中添加元素时,似乎无法正确更新包装.重新验证框架后,它将继续在最后一行渲染新项目(甚至保留旧的换行),但不会继续并换行到新行.
仅在调整框架大小时才能重新包装列表(无效,验证和重新绘制不起作用).
final JFrame frame = new JFrame();
final Vector<String> strings = new Vector<String>();
JList list = new JList(strings);
list.setLayoutOrientation(JList.HORIZONTAL_WRAP);
list.setVisibleRowCount(-1);
strings.add(" ------------------ add ------------------");
strings.add(" ------------------ add ------------------");
JButton button = new JButton("add");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
strings.add(" ------------------ add ------------------");
//frame.invalidate();
//frame.validate();
//frame.repaint();
}
});
JPanel panel = new JPanel(new BorderLayout());
panel.add(list, BorderLayout.CENTER);
panel.add(button,BorderLayout.SOUTH);
frame.setSize(400,400);
frame.add(panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
解决方法:
使用ListModel
,例如DefaultListModel
.它将向JList
触发正确的事件“触发”,以便在将对象添加到模型或从模型中删除对象时更新.
public static void main(String[] args) {
JFrame frame = new JFrame("Test");
final DefaultListModel model = new DefaultListModel();
model.addElement("---added---");
model.addElement("---added---");
frame.add(new JList(model), BorderLayout.CENTER);
frame.add(new JButton(new AbstractAction("Add") {
@Override
public void actionPerformed(ActionEvent arg0) {
model.addElement("---added again---");
}
}), BorderLayout.SOUTH);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(200, 150);
frame.setVisible(true);
}
对于“包装问题”,只需使用JList(ListModel)
构造函数,它将使用JList.VERTICAL
属性来呈现所需的列表.
标签:jlist,swing,defaultlistmodel,java 来源: https://codeday.me/bug/20191101/1986873.html