Java如何以编程方式选择JTable的行?
该程序向您展示如何以JTable编程方式选择一些行。下面我们演示了如何使用setRowSelectionInterval()方法选择行,如何使用方法删除或清除行选择removeRowSelectionInterval()以及如何使用addRowSelectionInterval()将更多行添加到先前选择的行。
package org.nhooo.example.swing;
import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class JTableRowSelectProgrammatically extends JPanel {
public JTableRowSelectProgrammatically() {
initializePanel();
}
private void initializePanel() {
setLayout(new BorderLayout());
setPreferredSize(new Dimension(475, 250));
final JTable table = new JTable(new MyTableModel());
table.setFillsViewportHeight(true);
JScrollPane pane = new JScrollPane(table);
JLabel label1 = new JLabel("From row: ");
final JTextField field1 = new JTextField(3);
JLabel label2 = new JLabel("To row: ");
final JTextField field2 = new JTextField(3);
JButton select = new JButton("Select");
JButton clear = new JButton("Clear");
JButton add = new JButton("Add another one");
//启用行选择模式并禁用列选择
//模式。
table.setRowSelectionAllowed(true);
table.setColumnSelectionAllowed(false);
//根据输入选择行。
select.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
int index1 = 0;
int index2 = 0;
try {
index1 = Integer.valueOf(field1.getText());
index2 = Integer.valueOf(field2.getText());
} catch (NumberFormatException e) {
e.printStackTrace();
}
if (index1 < 0 || index2 < 0 ||
index1 >= table.getRowCount() ||
index2 >= table.getRowCount()) {
JOptionPane.showMessageDialog(table, "Selection out of range!");
} else {
table.setRowSelectionInterval(index1, index2);
}
}
});
//清除行选择
clear.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
table.removeRowSelectionInterval(0, table.getRowCount() - 1);
field1.setText("");
field2.setText("");
}
});
//在最后选择的行之后再添加一行。
add.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
int index2 = 0;
try {
index2 = Integer.valueOf(field2.getText());
} catch (NumberFormatException e) {
e.printStackTrace();
}
index2 = index2 + 1;
table.addRowSelectionInterval(index2, index2);
field2.setText(String.valueOf(index2));
}
});
JPanel command = new JPanel(new FlowLayout());
command.add(label1);
command.add(field1);
command.add(label2);
command.add(field2);
command.add(select);
command.add(clear);
command.add(add);
add(pane, BorderLayout.CENTER);
add(command, BorderLayout.SOUTH);
}
public static void showFrame() {
JPanel panel = new JTableRowSelectProgrammatically();
panel.setOpaque(true);
JFrame frame = new JFrame("JTable Row Selection");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setContentPane(panel);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JTableRowSelectProgrammatically.showFrame();
}
});
}
public class MyTableModel extends AbstractTableModel {
private String[] columns = {"ID", "NAME", "AGE", "A STUDENT?"};
private Object[][] data = {
{1, "Alice", 20, Boolean.FALSE},
{2, "Bob", 10, Boolean.TRUE},
{3, "Carol", 15, Boolean.TRUE},
{4, "Ignasia", 20, Boolean.TRUE},
{5, "Mallory", 25, Boolean.FALSE}
};
public int getRowCount() {
return data.length;
}
public int getColumnCount() {
return columns.length;
}
public Object getValueAt(int rowIndex, int columnIndex) {
return data[rowIndex][columnIndex];
}
@Override
public String getColumnName(int column) {
return columns[column];
}
//JTable使用此方法定义默认值
//每个单元格的渲染器或编辑器。例如,如果您有
//布尔数据,它将呈现为复选框。一种
//数字值右对齐。
@Override
public Class<?> getColumnClass(int columnIndex) {
return data[0][columnIndex].getClass();
}
}
}下面是该程序的屏幕截图。