【问题标题】:Update JList after removing items删除项目后更新 JList
【发布时间】:2019-05-12 12:26:24
【问题描述】:

我的 JList 有问题。每当我从中删除项目时,列表不会更新它的外观,因此项目会保留在那里并且变得不可检查。

代码如下:

DefaultListModel listModel = new DefaultListModel();

JList figureListBox = new JList(listModel);
figureListBox.setBounds(5, 20, 240, 300);
figureListBox.setBackground(Color.WHITE);
figureListBox.setBorder(BorderFactory.createLineBorder(Color.BLACK));
figureListBox.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
figureListBox.setLayoutOrientation(JList.VERTICAL);
figureListBox.setVisibleRowCount(10);

JButton deleteFigureButton = new JButton("Delete");
deleteFigureButton.setBounds(5, 305, 240, 25);
deleteFigureButton.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent actionEvent) {
        if(currentFigure != -1) {
            listModel.remove(currentFigure);
            currentFigure = -1;
        }
    }
});`

重绘和重新验证不起作用,还有 updateUI()

Here is a screenshot of how it looks like

【问题讨论】:

  • 您是否曾经将 currentFigure 更新为 >= 0 的值?而整个repaint 的东西不应该是必要的
  • currentFigure = 选中的列表框索引。关键是我忘了提到该列表在移动窗口后会更新,并且应该删除的选定项目删除。
  • 这段代码是否在 AWT 事件调度线程中运行?见javax.swing 和docs.oracle.com/javase/tutorial/uiswing/concurrency。
  • 然后尝试使用SwingUtilities.invokeLater 虽然我不明白为什么它不适合你。对我来说,它按预期工作
  • 我在main() 方法中使用invokeLater 运行我的应用程序。

标签: java swing user-interface jlist


【解决方案1】:

这是 NetBeans 代码 -->

//设置数据到jlist

 public void setList() {

    String[] listData = {"list1", "list2", "list3", "list3", "list3", "list3", "list3", "list3"};
    jList1.setListData(listData);

}

//从jlist中删除数据

public String[] delList() {

    ListModel<String> beforDeleteDataList = jList1.getModel();
    String[] newDataList = new String[beforDeleteDataList.getSize() - 1];  
    int beforDeleteDataListIndex = 1;
    try {
        for (int i = 0; i < (beforDeleteDataList.getSize()); i++) {

            newDataList[i] = 
            beforDeleteDataList.getElementAt(beforDeleteDataListIndex);
            beforDeleteDataListIndex++;
        }

    } catch (Exception e) {
         e.printStackTrace();
    }
return newDataList;}

//删除按钮动作

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         

    jList1.setListData(delList());

}  

【讨论】:

    【解决方案2】:

    来自您的评论:

    移动窗口后列表会更新。

    验证是否在将组件添加到 JPanel 后调用 setVisible()(如果使用它)。

    如果它与您的问题有关,请勾选此项。 JPanel doesn't update until resize Jframe

    同时发布您的完整代码。

    【讨论】:

      猜你喜欢
      • 2016-07-07
      • 2011-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-13
      相关资源
      最近更新 更多