1

チェックボックスを含む JTable があります。私のアプリケーションは、エントリが編集されるたびに背景が変化して、エントリが編集状態であることを示すように構築されています。マウスで設定済みですが、KeyListener を追加してキーボードのスペースが押されたときにキャッチすると、キーリリース メソッドはスペースが長く押されたときにのみ起動し、チェックボックスの選択と選択解除がすばやく行われます。

keyTyped および keyPressed メソッドを使用すると、テーブルに入力された新しいデータがキャッチされないため、一歩遅れていることを除いて、すべてうまく機能します。

それで、私の質問は、テーブルでスペースが押されたときにキャッチして、テーブルの現在のすべての値を収集するにはどうすればよいですか?

私は MVC アーキテクチャを使用しています。ここに私のコントロールがあります:

public class UserInternalFrameController {

    UserInternalFrame gui = new UserInternalFrame();

    public UserInternalFrameController(ManagementGUI mainGui) {
        gui.getTableUserTransactionPermissions().addKeyListener(new KeyListener() {

            @Override
            public void keyTyped(KeyEvent e) {
                System.out.println("typed");
                // TODO Auto-generated method stub
                if (e.getKeyChar() == ' ') {
                    if (stateMachine == 2 || stateMachine == 4) {
                        JTable permTable = gui.getTableUserTransactionPermissions();
                        int noOfColumns = gui.getUserTransactionPermissionsHeader().length;
                        permListEdit = false;
                        for (int i = 0; i < permList.length; i++) {
                            for (int j = 0; j < noOfColumns; j++) {
                                if (!permList[i][j].equals(permTable.getValueAt(i, j))) {
                                    System.out.println("row" + i + "; column" + j + "; perList:" + permList[i][j] + "; transList: " + permTable.getValueAt(i, j));
                                    permListEdit = true;
                                }
                            }
                        }
                        if ((employeeCodeEdit || usernameEdit || passwordEdit || userIdEdit || subjectIdEdit || userStatusEdit || userRoleEdit || permListEdit) == false) {
                            gui.getPanelUser().setBackground(defaultBackgroundPanelUser);
                            gui.getTableUserTransactionPermissions().setBackground(Color.WHITE);
                            stateMachine = 2;
                            gui.getBtnSave().setEnabled(false);
                        } else {
                            gui.getPanelUser().setBackground(Color.decode("#f5deb3"));
                            gui.getTableUserTransactionPermissions().setBackground(Color.decode("#f5deb3"));
                            stateMachine = 4;
                            gui.getBtnSave().setEnabled(true);
                        }
                    }
                }
            }
        });
    }
}

同じコード ブロックは、マウスの actionListener でうまく機能し、keyPressed メソッドに追加すると同じ遅延効果があります。keyReleased は、スペースを除く他のすべてのボタンでうまく機能するようです。

私のキーボードは大丈夫です。

どんな助けでも大歓迎です。

4

2 に答える 2

3

この例に示され、このチュートリアルで説明されているように、タイプのテーブル列のデフォルトのレンダラーとエディターBoolean.classJCheckBox. チェック ボックスのデフォルトのマウス ハンドラは正しく機能し、デフォルトのキー バインドspaceキーです。このUIManagerプロパティTable.selectionBackground は、デザイナーが好み、ユーザーが期待する方法で、選択したセルを強調表示します。

示されているアプローチを放棄し、デフォルトを使用することをお勧めします。

于 2012-05-08T01:42:52.017 に答える
1

問題に対する答えはかなり単純なものでした。初心者の間違い。これは、データ取得時にテーブルを更新する方法のスニペットです (MVC パターンのコントローラーから; gui はビュー インスタンスです)。

// update tableUserSearchResult
gui.setUserSearchTableData(tempList); 
gui.setUserSearchResultTableModel(new DefaultTableModel(
    gui.getUserSearchTableData(), gui.getUserSearchTableHeader()));
gui.getTableUserSearchResult().setModel(gui.getUserSearchResultTableModel());

DefaultTableModelテーブルのモデルを定義して新しいインスタンスに設定したため、新しいインスタンスを作成するとこのエラーが発生する理由がよくわかりません。私は...

ただし、 のsetDataVector方法を使用することで、新しいインスタンスを (作成せずに) 正しくDefaultTableModel更新することができ、DefaultTableModel問題なく動作します。

gui.setUserRolePermissionsData(userRolePermissionList);
gui.getUserRolePermissionsTableModel().setDataVector(
    gui.getUserRolePermissionsData(), gui.getUserRolePermissionsHeader());
gui.getTableUserRolePermissions().setModel(gui.getUserRolePermissionsTableModel());

これは、ビューでオブジェクトを宣言する方法です。

public class UserRoleInternalFrame extends JInternalFrame {
DefaultTableModel userRoleDocumentsPermissionsTableModel;
    Object [][] userRoleDocumentsPermissionsData;
    String[] userRoleDocumentsPermissionsHeader = {
        "Document", "Edit", "View", "Process", "Update"
    };
    private JTable tableDocumentPermissions;
    private JScrollPane scrollPaneDocumentPermissions;

...

this.userRolePermissionsTableModel = new DefaultTableModel(
    this.userRolePermissionsData, this.userRolePermissionsHeader);
tableUserRolePermissions = new JTable(this.userRolePermissionsTableModel){
    @Override // in order to render JCheckBox
    public Class getColumnClass(int c) {
        if (c == 1 || c == 2 || c == 3 || c == 4){
            return Boolean.class;
        } else {
            return String.class;
        }
    }
};

scrollPaneEntryTypePermissions.setColumnHeaderView(tableUserRolePermissions);
    scrollPaneEntryTypePermissions.setViewportView(tableUserRolePermissions);
于 2012-05-14T06:48:24.527 に答える