拖放到Swing中的订单项

时间:2013-03-11 20:43:29

标签: java swing

我有一个要在Swing中显示的项目列表。为简单起见,假设每个项目只包含一个名称。我希望用户能够通过将它们拖放到彼此上方/下方来订购这些项目。实现这一目标的最佳方法是什么?

或者,这可能是在使用JList时完成的,其中“向上”和“向下”按钮可以在列表中上/下移动所选项目。这需要在每次点击时立即更新图形显示(我不知道该怎么做),并通过以当前顺序获取列表中的项目来保存新订单(我也不知道该怎么做) )。

或者拖放式解决方案是否更可行?

2 个答案:

答案 0 :(得分:2)

使用你提到的JList解决方案可能更容易实现这一点,所以我会给你一些指示(我对D& D不是很有经验)。

基本上,您希望有三个组件:JList和两个(一个向上,向下一个)JButton。您还可能需要自定义列表模型。如果您不熟悉模型或列表模型,请查看this tutorial。否则,请继续阅读。

在列表模型类(例如ReorderableListModel)中,继续并定义两种方法:public void moveUp(int index)public void moveDown(int index)

moveUp的代码如下:

if (index > 0) { // error checking
    // Swap the given index with the previous index.
    // (where `list` is the name of your list variable)
    Collections.swap(list, index, index - 1);
}
// Finally, notify the `JList` that the list structure has changed.
fireContentsChanged(this, index - 1, index);

moveDown类似:

if (index < getSize() - 1) {
    Collections.swap(list, index, index + 1);
}
fireContentsChanged(this, index, index + 1);

现在,我们需要为按钮实现动作侦听器。对于向上按钮,请尝试使用此侦听器代码:

// First, move the item up in the list.
listModel.moveUp(list.getSelectedIndex());

// Now, set the selection index to keep the same item selected.
//
// If you use the default list selection interval, setting the index to -1
// will do nothing (so it's okay, we don't need error checking here).
list.setSelectedIndex(list.getSelectedIndex() - 1);

添加类似的&#34;向下移动&#34;方法,你完成了!

关于&#34;在每次点击时立即更新图形显示,&#34;这是模型类中fireContentsChanged方法的作用。 JList会为您进行更新。

答案 1 :(得分:0)

这是一个很难用摇摆来实现的功能。你听说过JavaFX吗?如果您想在桌面应用程序中实现更多动态功能,那么这是一个很棒的图形框架,请看一下这篇文章:http://docs.oracle.com/javase/tutorial/uiswing/dnd/index.html

在这里,您将能够找到包含更多信息的链接以及一些示例。最好的问候。