1

私は次MyTableの拡張機能を持っていJXTableます:

public class MyTable extends JXTable{...}

期待どおりに動作します。ここで、ポップアップ メニューの要素をクリックした後も DefaultColumnControlPopup メニューを開いたままにして、ユーザーが ColumnControlButton を煩わしくクリックすることなく複数回クリックできるようにしたいと考えています。

誰かがそれを行う方法を知っていますか?

このチュートリアルに基づいて解決しようとしていましたが、成功しませんでした。

4

1 に答える 1

0

いくつかの精巧さの後、それを行う方法を知っていれば簡単です-明らかなように...

他の人のための全体的な解決策:

JXTable を使用しているクラスがあります。

JXTable myTable = new JXTable(new MyTableModel())
...use_table_as_usually...

テーブルのクラス:

public class MyTable extends JXTable{
    public MyTable(AbstractTableModel model){
        super(model);
        //remove items for horizontal scrollbar, pack and packall
        this.getActionMap().remove("column.horizontalScroll");
        this.getActionMap().remove("column.packAll");
        this.getActionMap().remove("column.packSelected");
        //first two columns should be shown permanently
        ColumnControlButton controlButton = new ColumnControlButton(this){
            @Override
            protected ColumnControlPopup createColumnControlPopup(){
                return (new NFColumnControlPopup());
            }

            class NFColumnControlPopup extends DefaultColumnControlPopup{
                @Override
                public void addVisibilityActionItems(List<? extends AbstractActionExt> actions){
                    for(int i = 0; i < actions.size(); i++){
                        AbstractActionExt action = actions.get(i);
                        JCheckBoxMenuItem chk = new JCheckBoxMenuItem(action);
                        chk.setUI(new KeepOpenCheckBox());
                        //disable first two items but they will be still shown greyed
                        if(i == 0 || i == 1){
                            chk.setEnabled(false);
                            chk.setSelected(false);
                        }
                        else{
                            chk.setEnabled(true);
                            chk.setSelected(true);
                        }
                        chk.addItemListener(action);
                        super.addItem(chk);
                    }
                }
            }
        };
        this.setColumnControl(controlButton);
    }
}

最後に、開いたままにするカスタムクラスColumnControlPopup:

public class KeepOpenCheckBox extends BasicCheckBoxMenuItemUI{
    public static ComponentUI createUI(JComponent c){
        return new KeepOpenCheckBox();
    }

    protected void doClick(MenuSelectionManager msm){
        menuItem.doClick(0);
    }
}

それで全部です。この例では、3 つのことが混在しています。 - 水平スクロールバー、パック、およびパックオールの不要なアイテムを削除する方法 -一部の列コントロールを無効にColumnControlPopupして、グレーでチェックマークなしで表示したままにする方法; -ColumnControlPopupクリックした後も開いたままにする方法JCheckBoxMenuItem;

解決策は、インターネット上で見つけたいくつかのリソースに基づいていますが、一部の情報は古いか機能してJMenuいませんでした (ポップアップ メニューでは機能しますが、機能しません)。

于 2013-10-03T17:06:26.480 に答える