在这个程序中,我想将List1中的项目随机复制到List2,反之亦然。然而 而不是选择元素,它将不同的元素移动到相对的JList。最初,当我从list1复制到list2时,它运行良好。但是,当我再次从List2复制到List1时,它无法正常工作。有人可以帮我理解这里有什么问题吗?
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
class MyFrame extends JFrame{
private JLabel lTitle;
private JList list1;
private JButton btAdd1;
private JButton btAdd2;
private JPanel buttonpane;
private JList list2;
private JPanel titlePane;
private JPanel listPane;
private DefaultListModel dlm2;
private String data1[];
private String data2[];
private DefaultListModel dlm1;
MyFrame(){
setSize(200,300);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
lTitle=new JLabel("Subject List");
lTitle.setFont(new Font("",1,30));
data1=new String[]{"A1","A2","A3","A4","A5"};
data2=new String[]{"B1","B2","B3","B4","B5"};
dlm1=new DefaultListModel();
list1=new JList(dlm1);
dlm2=new DefaultListModel();
list2=new JList(dlm2);
for(int i=0;i<data1.length;i++){
dlm1.add(i,data1[i]);
}
for(int i=0;i<data2.length;i++){
dlm2.add(i,data2[i]);
}
btAdd1=new JButton(">>");
btAdd1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
int x[]=list1.getSelectedIndices();
for(int i=0;i<x.length;i++){
dlm2.add(i,data1[x[i]]);
}
}
});
btAdd2=new JButton("<<");
btAdd2.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
int x[]=list2.getSelectedIndices();
for(int i=0;i<x.length;i++){
dlm1.add(i,data2[x[i]]);
}
}
});
buttonpane=new JPanel(new GridLayout(2,1,10,10));
buttonpane.add(btAdd1);
buttonpane.add(btAdd2);
titlePane=new JPanel( );
titlePane.add(lTitle);
listPane=new JPanel();
listPane.add(list1);
listPane.add(buttonpane);
listPane.add(list2);
add("North",titlePane);
add("Center",listPane);
}
}
class Demo{
public static void main(String args[]){
new MyFrame().setVisible(true);
}
}
答案 0 :(得分:2)
这是因为您尝试从字符串的原始data1和data2数组中获取要复制的值,但是在复制新值时这些数组不会更新,因此您不能再使用它们(如果要保留它们)这个设计)。
相反,您可以通过DefaultListModel对象访问数据:使用新复制的值更新它们。基本上你必须修改两个监听器,第一个按钮:
btAdd1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
int x[]=list1.getSelectedIndices();
for(int i=0;i<x.length;i++){
dlm2.add(i,dlm1.get(x[i]));
}
}
});
还有第二个按钮:
btAdd2.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
int x[]=list2.getSelectedIndices();
for(int i=0;i<x.length;i++){
dlm1.add(i,dlm2.get(x[i]));
}
}
});
我希望这会对你有所帮助。