如何在没有用户使用鼠标选择表的情况下选择表中的所有行?例如,我在一张叫做的桌子上InputTable.使用ActionListener/ TableModelListener,我可以通过这种方式在表中获取所选行(当用户点击它们时):
int[] rows = inputTable.getSelectedRows();
Run Code Online (Sandbox Code Playgroud)
我现在想要选择Input表中的所有行并将其指定为,int [] rows1.是否有一个命令getSelectedRows(),我可以在没有用户交互的情况下选择所有行?我知道有一个,SelectAll()但我想要一些特定于行的东西.
我想你想progamatically选择行的JTable.
这JTable只是一种展示机制.您不必选择表中的行(视图),而是选择行中的行SelectionModel,所以看看我做的这个小例子:

import java.util.ArrayList;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
public class Test extends JFrame {
public static void main(String[] args) throws Exception {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Test().createAndShowUI();
}
});
}
private void createAndShowUI() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
initComponents(frame);
frame.pack();
frame.setVisible(true);
}
private void initComponents(JFrame frame) {
String data[][] = {
{"1", "2", "3"},
{"4", "5", "6"},
{"7", "8", "9"},
{"10", "11", "12"}
};
String col[] = {"Col 1", "Col 2", "Col 3"};
DefaultTableModel model = new DefaultTableModel(data, col);
JTable table = new JTable(model);
//call method to select rows (select all rows)
selectRows(table, 0, table.getRowCount());
//call method to return values of selected rows
ArrayList<Integer> values = getSelectedRowValues(table);
//prints out each values of the selected rows
for (Integer integer : values) {
System.out.println(integer);
}
frame.getContentPane().add(new JScrollPane(table));
}
private void selectRows(JTable table, int start, int end) {
// Use this mode to demonstrate the following examples
table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
// Needs to be set or rows cannot be selected
table.setRowSelectionAllowed(true);
// Select rows from start to end if start is 0 we change to 1 or leave it (used to preserve coloums headers)
table.setRowSelectionInterval(start, end - 1);
}
/**
* Will return all selected rows values
*
* @param table
* @return ArrayList<Intger> values of each selected row for all coloumns
*/
private ArrayList<Integer> getSelectedRowValues(JTable table) {
ArrayList<Integer> values = new ArrayList<>();
int[] vals = table.getSelectedRows();
for (int i = 0; i < vals.length; i++) {
for (int x = 0; x < table.getColumnCount(); x++) {
System.out.println(table.getValueAt(i, x));
values.add(Integer.parseInt((String) table.getValueAt(i, x)));
}
}
return values;
}
}
Run Code Online (Sandbox Code Playgroud)
魔术发生在这里:
private void selectRows(JTable table, int start, int end) {
// Use this mode to demonstrate the following examples
table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
// Needs to be set or rows cannot be selected
table.setRowSelectionAllowed(true);
// Select rows from start to end if start is 0 we change to 1 or leave it (used to preserve coloums headers)
table.setRowSelectionInterval(start, end - 1);
}
Run Code Online (Sandbox Code Playgroud)
有关更多示例,请在此处了解如何使用SelectionModelon JTablefor rows和colomns
如果我正确理解您的问题,则您存储了以前的(或所需的)选择,并且您想要恢复该选择:
int[] rowsToSelect = inputTable.getSelectedRows();
Run Code Online (Sandbox Code Playgroud)
您可以稍后设置或恢复此选择或恢复到另一个表:
final ListSelectionModel sm = inputTable.getSelectionModel();
sm.clearSelection(); // First clear selection
for ( final int idx : rowsToSelect )
sm.addSelectionInterval( idx, idx ); // Make this row selected
Run Code Online (Sandbox Code Playgroud)
注意:如果首先对索引进行排序,然后addSelectionInterval()使用连续索引范围进行调用,则可以提高性能:
Arrays.sort( rowsToSelect ); // You only have to sort if it is not yet sorted
final ListSelectionModel sm = inputTable.getSelectionModel();
sm.clearSelection(); // First clear selection
int rangeFirst = -1, previous = -1;
for ( final int idx : rowsToSelect ) {
if ( rangeFirst < 0 )
previous = rangeFirst = idx; // Start an index range
else if ( idx != previous + 1 ) {
// A continuous index range ends here, make it selected
sm.addSelectionInterval( rangeFirst, previous );
previous = rangeFirst = idx; // Start a new index range
}
else
previous = idx; // Index range is continuous, proceed to the next index
}
// Add the last range which is not handled by the for loop:
if ( rangeFirst >= 0 )
sm.addSelectionInterval( rangeFirst, previous );
Run Code Online (Sandbox Code Playgroud)
最后注意:如果您想要/必须多次选择相同的索引,那么存储连续范围是有利的,这样您就不必每次都检测它们。基本上,这意味着存储传递给sm.addSelectionInterval()上面代码示例中的方法的范围:
Arrays.sort( rowsToSelect ); // You only have to sort if it is not yet sorted
// Detect and store continuous index ranges:
final List< int[] > idxRangeList = new ArrayList< int[] >();
int rangeFirst = -1, previous = -1;
for ( final int idx : rowsToSelect ) {
if ( rangeFirst < 0 )
previous = rangeFirst = idx; // Start an index range
else if ( idx != previous + 1 ) {
// A continuous index range ends here, store it
idxRangeList.add( new int[] { rangeFirst, previous } );
previous = rangeFirst = idx; // Start a new index range
}
else
previous = idx; // Index range is continuous, proceed to the next index
}
// Add the last range which is not handled by the for loop:
if ( rangeFirst >= 0 )
idxRangeList.add( new int[] { rangeFirst, previous } );
// And now if you want those ranges selected:
final ListSelectionModel sm = inputTable.getSelectionModel();
sm.clearSelection(); // First clear selection
for ( final int[] range : idxRangeList )
sm.addSelectionInterval( range[ 0 ], range[ 1 ] );
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8086 次 |
| 最近记录: |