2

タブを押すと、フォーカスが次のセルに移動します。この動作を変更して、特定の列がタブキーナビゲーションから除外されるようにします。テーブルが5つの列で構成されているとすると、ナビゲーションでは列1と3のみを考慮する必要があります。私が読んだものからFocusTraversalPolicy、この目的のために使用されます。ただし、列と行の指標が提供されていないため、この動作の実装はかなり複雑に見えます。では、正しいコンポーネントを返すにはどうすればよいですか?

public class Table extends JTable{
int columnCount = 5;
int[] tab = { 1, 3 };  
    public Table(){
        ...
        this.setFocusTraversalPolicy(new FocusTraversalPolicy() {

        @Override
        public Component getLastComponent(Container arg0) {
             return null;
        }

        @Override
        public Component getFirstComponent(Container arg0) {
            return null;
        }

        @Override
        public Component getDefaultComponent(Container arg0) {
            return null;
        }

        @Override
        public Component getComponentBefore(Container arg0, Component arg1) {
            return null;
        }

        @Override
        public Component getComponentAfter(Container arg0, Component arg1) {
            return null;
        }
    }); 
    } 
}
4

2 に答える 2

5

私が読んだことから、この目的のために FocusTraversalPolicy が使用されます

テーブルの列は実際のコンポーネントではないため、テーブルがフォーカスを取得すると、FocusTraversalPolicy は意味を持ちません。JTable は、セルからセルへ移動するアクションを提供します。

Table Tabbingにある概念を使用できる場合があります。例えば:

public class SkipColumnAction extends WrappedAction
{
    private JTable table;
    private Set columnsToSkip;

    /*
     *  Specify the component and KeyStroke for the Action we want to wrap
     */
    public SkipColumnAction(JTable table, KeyStroke keyStroke, Set columnsToSkip)
    {
        super(table, keyStroke);
        this.table = table;
        this.columnsToSkip = columnsToSkip;
    }

    /*
     *  Provide the custom behaviour of the Action
     */
    public void actionPerformed(ActionEvent e)
    {
        TableColumnModel tcm = table.getColumnModel();
        String header;

        do
        {
            invokeOriginalAction( e );

            int column = table.getSelectedColumn();
            header = tcm.getColumn( column ).getHeaderValue().toString();
        }
        while (columnsToSkip.contains( header ));
    }
}

クラスを使用するには、次のようにします。

Set<String> columnsToSkip = new HashSet<String>();
columnsToSkip.add("Column Name ?");
columnsToSkip.add("Column Name ?");
new SkipColumnAction(table, KeyStroke.getKeyStroke("TAB"), columnsToSkip);
new SkipColumnAction(table, KeyStroke.getKeyStroke("shift TAB"), columnsToSkip);

重要な点は、テーブルのデフォルトのタブ アクションを独自のものに置き換える必要があるということです。

于 2013-03-15T00:56:00.787 に答える