import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;public class SelectionModelDemo1 implements ActionListener,ListSelectionListener{

JTable table = null;
ListSelectionModel selectionMode = null;
JLabel label = null;

public SelectionModelDemo1(){
JFrame jf = new JFrame();
String[] name = {"字段1","字段2","字段3","字段4","字段5"};
String[][] data = new String[5][5];
int value = 1;
for(int i=0;i<data.length;i++){
for(int j=0;j<data[i].length;j++){
data[i][j] = String.valueOf(value++);
}
}
table = new JTable(data,name);
table.setPreferredScrollableViewportSize(new Dimension(550,80));
table.setCellSelectionEnabled(true);//这个地方已经设定可以对Cell进行选择
//table.setRowSelectionAllowed(true);
//table.setColumnSelectionAllowed(true);
selectionMode = table.getSelectionModel();
selectionMode.addListSelectionListener(this);
JScrollPane s = new JScrollPane(table);

JPanel panel = new JPanel();
JButton b = new JButton("單一選擇");
panel.add(b);
b.addActionListener(this);
b = new JButton("連續區間選擇");
panel.add(b);
b.addActionListener(this);
b = new JButton("多重選擇");
panel.add(b);
b.addActionListener(this);

label = new JLabel("您選取:");

Container contentPane = jf.getContentPane();
contentPane.add(panel,BorderLayout.NORTH);
contentPane.add(s,BorderLayout.CENTER);
contentPane.add(label,BorderLayout.SOUTH);

jf.setTitle("SelectionModelDemo1");
jf.pack();
jf.setVisible(true);

jf.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
}//constructor

public static void main(String[] args){
new SelectionModelDemo1();
}

@Override 
public void actionPerformed(ActionEvent e){
if(e.getActionCommand().equals("單一選擇")){
selectionMode.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
}
if(e.getActionCommand().equals("連續區間選擇")){
selectionMode.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
}
if(e.getActionCommand().equals("多重選擇")){
selectionMode.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
}

table.revalidate();
}

@Override
public void valueChanged(ListSelectionEvent e){
String tempString = "";
int[] row = table.getSelectedRows();
int[] col = table.getSelectedColumns();
//System.out.println(row[0]+""+col[0]);
//String tempString = "您選取:";
for(int i=0;i<row.length;i++){
for(int j=0;j<col.length;j++){
tempString += " "+(String)table.getValueAt(row[i], col[j]);
//System.out.println(row[i]+""+col[j]);
}
//System.out.println(row[i]+"");
}
label.setText("您選取:"+tempString);
}
}为什么我在选择同一行中不同列时没有触发ListSelectionListener呢?

解决方案 »

  1.   

    是因为@Override报错的。去掉就可以了。@Override是JDK5就已经有了,但有个小小的Bug,就是不支持对接口的实现,认为这不是Override
    而JDK6修正了这个Bug,无论是对父类的方法覆盖还是对接口的实现都可以加上@Override
      

  2.   

    没有解决
    把@Override注释掉还是一样
      

  3.   

    这样jtable.setColumnSelectionAllowed(true);行不行
      

  4.   

            table.getColumnModel().addColumnModelListener(new TableColumnModelListener(){
                    @Override public void columnAdded(TableColumnModelEvent e){}
                    @Override public void columnMarginChanged(ChangeEvent e){}
                    @Override public void columnMoved(TableColumnModelEvent e){}
                    @Override public void columnRemoved(TableColumnModelEvent e){}
                    @Override public void columnSelectionChanged(ListSelectionEvent e){
                        // 类似 valueChanged 方法里的内容
                    }
                });