5

ユーザーがマウスで選択せずにテーブル内のすべての行を選択するにはどうすればよいですか? たとえば、私は というテーブルにいますInputTableActionListener/を使用TableModelListenerすると、選択した行 (ユーザーがクリックしたとき) をテーブルで次のように取得できます。

int[] rows = inputTable.getSelectedRows();

ここで、入力テーブルのすべての行を選択し、それを次のように割り当てたいと思いますint [] rows1getSelectedRows()ユーザーの操作なしですべての行を選択できるコマンドはありますか? があることは知っていますがSelectAll()、行だけに固有のものが必要です。

4

3 に答える 3

5

の行をプログラム的に選択しようとしていると思います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;
    }
}

ここで魔法が起こります:

    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);
    }

より多くの例については、行と列にonを使用する方法を示していますSelectionModelJTable

于 2012-09-28T13:01:53.683 に答える
1

あなたの質問を正しく理解できれば、以前の (または目的の) 選択が保存されており、その選択を復元したいと考えています。

int[] rowsToSelect = inputTable.getSelectedRows();

この選択は、後で、または別のテーブルに設定または復元できます。

final ListSelectionModel sm = inputTable.getSelectionModel();
sm.clearSelection(); // First clear selection

for ( final int idx : rowsToSelect )
    sm.addSelectionInterval( idx, idx ); // Make this row selected

注: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 );

最後の注意:同じインデックスを何度も選択したい/選択しなければならない場合は、連続した範囲を保存することで、毎回検出する必要がなくなります。基本的にこれは、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 ] );
于 2012-09-28T09:45:23.923 に答える
1

コンストラクターで selectAll() 関数を実行すると、ユーザーの操作なしでホール テーブルが選択されます。

  private void createAndShowUI() {
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    initComponents(frame);
    frame.pack();
    frame.setVisible(true);
    table.selectAll();
}
于 2015-07-23T15:25:34.973 に答える