1

サーバーアクションを提供するようにJTableHeaderをカスタマイズしたいと思います(たとえば、そのうちの1つが列をソートし、2番目にこの列のプロパティを表示する2つのボタンなど)。残念ながら、JTableHeader に CellEditor を設定することはできないため、マウス アダプターの使用に固執しています。しかし、この特定の JTableHeader コンポーネントからイベントをディスパッチすることは可能で、必要なすべてのオプションを含むポップアップ メニューが表示され、並べ替え以外のオプションが選択された場合はイベントがディスパッチされます。このようにして、標準の JTable ソート操作が私の操作と一緒に利用可能になり、適切な視覚的外観が維持されます。だから私の質問は - それは可能ですか、それはどのように行われるべきですか?


Trushgod のコメントに応えて - defaultheader を通常のコンポーネントとして扱い、「追加」機能を使用してコンポーネントを追加することを意味していることを理解しています。JTableHeader ではうまく機能しません。Trashgod の例を読んだ後、私はこれを書きました:

private class mouseList extends MouseAdapter {

    @Override
    public void mouseClicked(MouseEvent e) {

        TableColumnModel thisColumnModel = thisTable.getColumnModel();
        int xCor = e.getX();
        //int Cols = thisColumnModel.getColumnCount();
        int thisColNum = thisColumnModel.getColumnIndexAtX(xCor);
        int prevWidth=0;
        for(int i = 0 ;i<thisColNum;i++)
        {
            prevWidth+=thisColumnModel.getColumn(i).getWidth();
        }

        int width = xCor-prevWidth;
        /////////////////////////////////////////////////////////////////////////////////////

       customHeader thisHeader =  (customHeader)((JTableHeader)e.getSource()).getDefaultRenderer();
       System.out.println(thisHeader.mainB.getText() + " text of thisHeader");
       //////////////////////////////////////////////////
       test thisTest = new test(null,false,thisHeader);
       thisTest.setVisible(true);
       ///////////////////////////////////////////////////////////////
       //System.out.println(width + " width of the header");
       Object thisComp = thisHeader.getComponentAt(width, e.getY());
       System.out.println(thisComp + "\n" + width + " + " + e.getY() +"\n" + thisHeader.getMainButton().getText());

       ((JTableHeader)e.getSource()).repaint();
       if(thisComp instanceof JButton)
       {
           //System.out.println("sdfdsf");
           String name = ((JButton)thisComp).getName();
           if(name.equals("mainB"))
           {
               System.out.println("its working on main");
               ((JButton)thisComp).doClick(1000);
           }else{
               System.out.println("its working on menu");
               ((JButton)thisComp).doClick(1000);
           }
       }
       ((JTableHeader)e.getSource()).repaint();
    }
}

MouseListener は JTableHeader に適用されます。HeaderRender は、2 つの JButton を含む JPanel の拡張です。ラインで奇妙なことが起こる

 Object thisComp = thisHeader.getComponentAt(width, e.getY());

行を残したとき

test thisTest = new test(null,false,thisHeader);
       thisTest.setVisible(true);
(This dialog shows selected component)

コメントを外すと、関数「getComponentAt」はほとんど問題なく動作するようです (ほとんどの場合、マウスが 2 番目のボタンをターゲットにしている場合でも、else 条件にはなりません。また、クリックされたボタンを再描画しません [不思議なことに、テスト ダイアログ ウィンドウでボタンを再描画します])、それ以外の場合は常にnull オブジェクトを返します。

重要かどうかはわかりませんが、JTableHeader で「setDefaultRenderer」を呼び出してヘッダー レンダラーをグローバルに設定します。

アイデアがほとんど不足しているので、助けていただければ幸いです。

4

1 に答える 1

1

このは基本的なインフラストラクチャを示していますが、この回答は使いやすさに関するいくつかの重要な警告を提供しています。このRowFilterは、 を動的に変更する方法を示していますが、 の変更RowSorterも同様です。どちらの例もJToggleButton2 つの状態を管理するためJComboBoxに使用されますが、より多くの選択肢の中から選択するために使用できます。

于 2012-06-02T14:48:50.283 に答える