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呢?
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呢?
而JDK6修正了这个Bug,无论是对父类的方法覆盖还是对接口的实现都可以加上@Override
把@Override注释掉还是一样
@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 方法里的内容
}
});