2

JTableデフォルトのコンポーネントで編集可能なものに元に戻す(およびやり直す)機能を実装しようとしています。にJTableは、 と呼ばれるそのプロパティを指定する追加のクラスがありますSpecifiedJTable

そのために、セルがダブルクリックされた瞬間 (つまり、セルが選択され、編集するようにマークされた瞬間) を取得して、セル内の情報とその座標をスタックにプッシュしたいと考えました。

これはMouseListener...少なくともそれが私の考えでした。SpecifiedJTable私はこれを試しました(私のクラスのコンストラクターに立って)

class JTableSpecified extends JTable {
    private static final long serialVersionUID = 1L;
    private int c; // the currently selected column
    private int r; // the currently selected row

    public JTableSpecified(String[][] obj, String[] columnNames) {
        super(obj, columnNames); // constructs the real table
        // makes that you can only select one row at a time
        this.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        // makes that columns are not squeezed
        this.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        // forbids to rearrange the columns
        getTableHeader().setReorderingAllowed(false);
        // adds action listener
        this.getModel().addTableModelListener(new TableModelListener() {
            public void tableChanged(TableModelEvent e) {
                r = getSelectedRow();
                c = getSelectedColumn();
                // get the String at row r and column c
                String s = (String) getValueAt(r, c);
                if (jobDisplayed) jobSwitch(c, s);
                else resSwitch(c, s);
            }
        });    
        this.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                if (e.getClickCount() == 2) {
                    System.out.println("test");
                }
            }
        });
    }
} 

しかし、どういうわけか、clickCounter は 1 より大きい値に達したくありません。

どんな答えや助けもうれしいです。ありがとう。

4

4 に答える 4

2

発生している問題は、 の使用ではmouseClicked()なくの使用に関連していますmousePressed()。この場合、クリック カウンターを増やすのは非常に難しいように見えますが、それでも可能です。クリック カウンターを 1 以上にするには、何度もクリックし、マウスを動かす必要がありました。コード内で自分で試すことができます。カウンターを1以上にするには、マウスをセルからセルへ同時に移動しながら、マウスをすばやく押して離す必要があります(または、幸運にもセル間をクリックしただけでしたか?)。

コードから作成されたこの完全に機能するサンプルでわかるように、mousePressed()メソッドを使用した 2 回のマウスの押下は問題なく検出されています。

public class JTableSpecified extends JTable {
    private static final long serialVersionUID = 1L;

    public JTableSpecified(String[][] obj, String[] columnNames) {
        super(obj, columnNames); // constructs the real table
        // makes that you can only select one row at a time
        this.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        // makes that columns are not squeezed
        this.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        // forbids to rearrange the columns
        getTableHeader().setReorderingAllowed(false);
        // adds action listener
        this.getModel().addTableModelListener(new TableModelListener() {
            @Override
            public void tableChanged(TableModelEvent e) {
            }
       });        
        this.addMouseListener(new MouseAdapter() {

            @Override
            public void mousePressed(MouseEvent e) {
                if (e.getClickCount() == 2) {
                    System.out.println("test");
                }
                System.out.println("e.getClickCount() = " + e.getClickCount());
            }
        });
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                JPanel panel = new JPanel();
                panel.add(new JTableSpecified(new String[][]{{"oi", "oi2"}, {"oi3", "oi4"}}, new String[]{"Col1", "Col2"}));
                JFrame f = new JFrame();
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.setContentPane(panel);
                f.pack();
                f.setVisible(true);
            }
        });
    }
}

結論:実際にそのmousePressed()方法を使用したいのではないでしょうか?

于 2012-06-20T11:56:00.653 に答える
1

この回答は、ボロの回答を拡張したものです。
ユーザーがテーブルを編集できるようにするすべてのケースをキャッチするには、F2 の KeyListener (セルをダブルクリックするのと同じ効果があります) を追加し、任意のキーを押して自動セル編集を無効にする必要があります。
mouseListenerのすぐ後ろのコンストラクターに追加しました(上記を参照)

// キーを叩いて編集を禁止する
this.putClientProperty("JTable.autoStartsEdit", Boolean.FALSE);

// F2 を押したときに反応する keyListener (キーコード 113)
this.addKeyListener(new KeyAdapter(){

public void keyPressed(KeyEvent e) {

if (e.getKeyCode() == 113) System.out.println("テスト");
}
});

于 2012-06-20T22:12:44.587 に答える
1

BasicTableUI は、ダブルクリックされたセルで編集モードに入ることによって、ダブルクリックに応答しています。データを編集できるようにするために JTextField (またはその他のコンポーネント) を作成し、マウス クリック イベントがそれ以上伝播しないようにするなど、多くの複雑な作業が行われます。

テーブルまたはそのテーブル セルが編集可能でない場合、クリック カウント 2、3、4、... でマウス イベントを簡単にキャプチャできます。しかし、テーブルを編集可能にしたいので、別のアプローチが必要です。

1 つのアイデアは、JTable をオーバーライドすることです。editCellAt()

より良いアイデアは、JTable をいじることを忘れて、代わりにテーブル モデル自体のデータ変更をリッスンすることです。

于 2012-06-20T19:04:51.920 に答える
-1

コードのエラーは、最初のクリックが行われるとすぐに mouseClicked メソッドが呼び出されることです。ダブルクリックが発生すると、mouseClicked メソッドが再度呼び出されます。時間を格納する以前のクリック イベントの静的変数 (またはクラス変数) を配置できます (e.getWhen() メソッドを使用)。時差を確認し、それが十分に小さい場合は、アクションを実行します (doubleClick メソッドを呼び出すことをお勧めします)。

静的変数が既存のコードに配置されていない可能性があるため、クラス JTableSpecified にマウス リスナーを実装する必要がある場合があります。

于 2012-06-20T08:12:45.483 に答える