在JList中想选中一个元素,按住鼠标不放,拖拉到这个list的另一个元素上,实现2个元素值的改变,比如选择了元素 A : 2 ,拖拉到C :5 上,放开鼠标后的效果是, A : 5 是一个元素,位置是原来A :2 的位置 ; C : 2则在原来C : 5的位置,就是交换2个元素 : 号 后面的部分,该如何实现呢?然后那个鼠标拖拉过程中,鼠标箭头上可以有东西吗? 就像我们拖动电脑桌面上的文件一样。下面是我写的没有实现的代码,直接运行就可以,那个拖动事件不会写
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.WindowConstants;public class ListFrame extends JDialog{
private JList jList1;
private JButton jButton1;
private JButton jButton2;
private JList jList2;
private DefaultListModel listModel1;
private DefaultListModel listModel2;
private JButton confirmBtn;
private JScrollPane paneA;
private JScrollPane paneB; {
//Set Look & Feel
try {
javax.swing.UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
} catch(Exception e) {
e.printStackTrace();
}
}
/**
* Auto-generated main method to display this JFrame
*/
public static void main(String[] args) {
ListFrame inst = new ListFrame();
inst.setVisible(true);
}
public ListFrame() {
super();
initGUI();
}
private void initGUI() {
try {
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
paneA = new JScrollPane();
paneB = new JScrollPane();
getContentPane().setLayout(null);
getContentPane().add(paneA);
getContentPane().add(paneB);
this.setTitle("光缆熔接");
{
listModel1 = new DefaultListModel();
listModel1.addElement("1");
listModel1.addElement("2");
listModel1.addElement("3");
listModel1.addElement("4");
listModel1.addElement("5");
listModel1.addElement("6");
listModel1.addElement("7");
listModel1.addElement("8");
jList1 = new JList(listModel1);
paneA.setBounds(30, 28, 130, 250);
paneA.setViewportView(jList1);
}
{
listModel2 = new DefaultListModel();
listModel2.addElement("B1 : 你");
listModel2.addElement("B2 : 是");
listModel2.addElement("B3 : 哪");
listModel2.addElement("B4 : 里");
listModel2.addElement("B5 : 人");
jList2 = new JList(listModel2);
jList2.addMouseMotionListener(new MouseMotionListener() {
String exchange1 = "";
String exchange2 = "";
int index1 = -1;
int index2 = -1;
public void mouseMoved(MouseEvent e) {
}
public void mouseDragged(MouseEvent e) {
}
});
paneB.setBounds(330, 28, 130, 250);
paneB.setViewportView(jList2);
}
{
jButton1 = new JButton();
getContentPane().add(jButton1);
jButton1.setText("添加->>");;
jButton1.setBounds(210, 80, 80, 28);
jButton1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
}
{
jButton2 = new JButton();
getContentPane().add(jButton2);
jButton2.setText("<<-移除");
jButton2.setBounds(210, 170, 80, 28);
jButton2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
jButton2ActionPerformed(evt);
}
});
}
{
confirmBtn = new JButton("确定");
getContentPane().add(confirmBtn);
confirmBtn.setBounds(370, 300, 80, 28);
confirmBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
confirmBtnActionPerformed(evt);
}
});
}
pack();
setSize(500, 380);
setModal(true);
setLocationRelativeTo(null);
this.setResizable(false);
} catch (Exception e) {
e.printStackTrace();
}
}
/** jList1移动到jList2*/
private void jButton1ActionPerformed(ActionEvent evt) {
if(jList1.getSelectedIndex()!=-1) {
//将光缆段A的纤芯批量加到光缆段B
Object[] items = jList1.getSelectedValues();
//光缆段B中未建立熔接关系的空闲纤芯数
int freeCount = 0;
int[] freeIndex = new int[items.length];
int n = 0;
for(int i = 0; i<listModel2.size(); i++){
String isOccupied = listModel2.getElementAt(i).toString();
if(isOccupied.contains(" : ") == false){
freeCount++;
//保存光缆段B未被占用的纤芯
freeIndex[n] = i;
n++;
}
if(freeCount == items.length){
break;
}
}
//判断A传送过来的纤芯数,是否大于B端可用纤芯数
if(items.length > freeCount){
JOptionPane.showMessageDialog(this,"没有足够的纤芯可供建立熔接关系");
return;
}
for (int i = 0; i < items.length; i++) {
listModel2.set(freeIndex[i], listModel2.getElementAt(freeIndex[i])+" : "+items[i].toString());
}
//将已建立熔接关系的纤芯移除(因为移除一个后,其余选中未移除的纤芯的index会在原基础上减1,批量删除很容易出现下标越界,建议从后开始删)
int[] index = jList1.getSelectedIndices();
for (int i = index.length -1 ; i >= 0 ; i--) {
listModel1.remove(index[i]);
}
}
} private void jButton2ActionPerformed(ActionEvent evt) {
//批量将解除纤芯的熔接关系
Object[] items = jList2.getSelectedValues();
int[] index = jList2.getSelectedIndices();
for (int i =0 ;i < items.length; i++) {
//如果用户选择了未建立熔接关系的纤芯,则直接跳过,处理下一条选中数据
if(items[i].toString().contains(" : ") == false){
continue;
}
String[] temp = items[i].toString().split(" : ");
//返回光缆段A
listModel1.addElement(temp[1]);
//解除熔接关系
listModel2.set(index[i], temp[0]);
}
//将纤芯升序排列
//获取listModel里的元素值
List temp = new ArrayList();
for (int i = 0; i<listModel1.size(); i++) {
temp.add(listModel1.getElementAt(i));
}
//list排序
Collections.sort(temp);
//清空
listModel1.clear();
//重新为listModel赋上排序后的值
for (Object item : temp) {
listModel1.addElement(item);
}
}
private void confirmBtnActionPerformed(ActionEvent evt){
}
}
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.WindowConstants;public class ListFrame extends JDialog{
private JList jList1;
private JButton jButton1;
private JButton jButton2;
private JList jList2;
private DefaultListModel listModel1;
private DefaultListModel listModel2;
private JButton confirmBtn;
private JScrollPane paneA;
private JScrollPane paneB; {
//Set Look & Feel
try {
javax.swing.UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
} catch(Exception e) {
e.printStackTrace();
}
}
/**
* Auto-generated main method to display this JFrame
*/
public static void main(String[] args) {
ListFrame inst = new ListFrame();
inst.setVisible(true);
}
public ListFrame() {
super();
initGUI();
}
private void initGUI() {
try {
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
paneA = new JScrollPane();
paneB = new JScrollPane();
getContentPane().setLayout(null);
getContentPane().add(paneA);
getContentPane().add(paneB);
this.setTitle("光缆熔接");
{
listModel1 = new DefaultListModel();
listModel1.addElement("1");
listModel1.addElement("2");
listModel1.addElement("3");
listModel1.addElement("4");
listModel1.addElement("5");
listModel1.addElement("6");
listModel1.addElement("7");
listModel1.addElement("8");
jList1 = new JList(listModel1);
paneA.setBounds(30, 28, 130, 250);
paneA.setViewportView(jList1);
}
{
listModel2 = new DefaultListModel();
listModel2.addElement("B1 : 你");
listModel2.addElement("B2 : 是");
listModel2.addElement("B3 : 哪");
listModel2.addElement("B4 : 里");
listModel2.addElement("B5 : 人");
jList2 = new JList(listModel2);
jList2.addMouseMotionListener(new MouseMotionListener() {
String exchange1 = "";
String exchange2 = "";
int index1 = -1;
int index2 = -1;
public void mouseMoved(MouseEvent e) {
}
public void mouseDragged(MouseEvent e) {
}
});
paneB.setBounds(330, 28, 130, 250);
paneB.setViewportView(jList2);
}
{
jButton1 = new JButton();
getContentPane().add(jButton1);
jButton1.setText("添加->>");;
jButton1.setBounds(210, 80, 80, 28);
jButton1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
}
{
jButton2 = new JButton();
getContentPane().add(jButton2);
jButton2.setText("<<-移除");
jButton2.setBounds(210, 170, 80, 28);
jButton2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
jButton2ActionPerformed(evt);
}
});
}
{
confirmBtn = new JButton("确定");
getContentPane().add(confirmBtn);
confirmBtn.setBounds(370, 300, 80, 28);
confirmBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
confirmBtnActionPerformed(evt);
}
});
}
pack();
setSize(500, 380);
setModal(true);
setLocationRelativeTo(null);
this.setResizable(false);
} catch (Exception e) {
e.printStackTrace();
}
}
/** jList1移动到jList2*/
private void jButton1ActionPerformed(ActionEvent evt) {
if(jList1.getSelectedIndex()!=-1) {
//将光缆段A的纤芯批量加到光缆段B
Object[] items = jList1.getSelectedValues();
//光缆段B中未建立熔接关系的空闲纤芯数
int freeCount = 0;
int[] freeIndex = new int[items.length];
int n = 0;
for(int i = 0; i<listModel2.size(); i++){
String isOccupied = listModel2.getElementAt(i).toString();
if(isOccupied.contains(" : ") == false){
freeCount++;
//保存光缆段B未被占用的纤芯
freeIndex[n] = i;
n++;
}
if(freeCount == items.length){
break;
}
}
//判断A传送过来的纤芯数,是否大于B端可用纤芯数
if(items.length > freeCount){
JOptionPane.showMessageDialog(this,"没有足够的纤芯可供建立熔接关系");
return;
}
for (int i = 0; i < items.length; i++) {
listModel2.set(freeIndex[i], listModel2.getElementAt(freeIndex[i])+" : "+items[i].toString());
}
//将已建立熔接关系的纤芯移除(因为移除一个后,其余选中未移除的纤芯的index会在原基础上减1,批量删除很容易出现下标越界,建议从后开始删)
int[] index = jList1.getSelectedIndices();
for (int i = index.length -1 ; i >= 0 ; i--) {
listModel1.remove(index[i]);
}
}
} private void jButton2ActionPerformed(ActionEvent evt) {
//批量将解除纤芯的熔接关系
Object[] items = jList2.getSelectedValues();
int[] index = jList2.getSelectedIndices();
for (int i =0 ;i < items.length; i++) {
//如果用户选择了未建立熔接关系的纤芯,则直接跳过,处理下一条选中数据
if(items[i].toString().contains(" : ") == false){
continue;
}
String[] temp = items[i].toString().split(" : ");
//返回光缆段A
listModel1.addElement(temp[1]);
//解除熔接关系
listModel2.set(index[i], temp[0]);
}
//将纤芯升序排列
//获取listModel里的元素值
List temp = new ArrayList();
for (int i = 0; i<listModel1.size(); i++) {
temp.add(listModel1.getElementAt(i));
}
//list排序
Collections.sort(temp);
//清空
listModel1.clear();
//重新为listModel赋上排序后的值
for (Object item : temp) {
listModel1.addElement(item);
}
}
private void confirmBtnActionPerformed(ActionEvent evt){
}
}
http://note.sdo.com/u/1451175931/n/mvO-X~jqqluMLX01Y001lc