5

私は Eclipse を使用していますが、JXTreeTables について質問があります。ノードがダブルクリックされたときに、ノードに関する情報を表示するウィンドウがポップアップするようにします。クリックがノード上で直接行われなかった場合、JXTreeTable または null のダブルクリックされたノードを取得することは可能ですか?

4

2 に答える 2

4

kleopatra が言及したスレッドで回答を受け取りました。これは完全に正常に機能し、より単純です。コードは次のとおりです。

treeTable.addMouseListener(new MouseAdapter() {
    @Override
    public void mouseClicked(final MouseEvent e) {
        if (e.getClickCount() != 2) {
            return;
        }

        final int rowIndex = treeTable.rowAtPoint(e.getPoint());

        if (rowIndex < 0) {
            return;
        }

        final TreeTableNode selectedNode = (TreeTableNode)treeTable.getPathForRow(rowIndex).getLastPathComponent();
    }
});
于 2012-02-03T23:40:04.300 に答える
2

tree.getRowForLocation(...): there is no api on the treeTable の動作を意味すると仮定すると、不足している api にヒットし、swingx 課題トラッカーに改善課題を提出することを検討するかもしれません :-)

それが利用可能になるまでは、それぞれのツリー メソッドに委譲するカスタム MouseListener で自分で行う必要があります。階層列のレンダラーを JTree に型キャストする際に少し (咳..) 汚れます。

    MouseListener l = new MouseAdapter() {

        @Override
        public void mouseClicked(MouseEvent e) {
            if (e.getClickCount() != 2) return;
            int column = treeTable.columnAtPoint(e.getPoint());
            if (!treeTable.isHierarchical(column)) return;
            Rectangle cell = treeTable.getCellRect(0, column, false);
            JXTree tree = (JXTree) treeTable.getCellRenderer(0, column);
            // translate x to tree coordinates
            int translatedX = e.getX() - cell.x;
            int row = tree.getRowForLocation(translatedX, e.getY());
            LOG.info("row " + row);
        }

    };
    treeTable.addMouseListener(l);

記録として、java.net の Swinglabs フォーラムに並列スレッドがあります。

編集

仮定の問題 ;-)

OP 独自の回答を使用すると、リスナーは、ノード (別名: そのテキスト) の真上だけでなく、ノードを含むテーブル セル内の任意の場所でダブルクリックすると起動します。したがって、要件は、想定される tree.getRowForLocation(..) よりも、tree.getClosestRowForLocation(..) の行に沿っていることがわかります。

于 2012-02-02T13:10:21.760 に答える