4

最近、swingx を見つけて、JXCollapsiblePane を試してみたいと思いました。しかし、私はそれを機能させることができません。私はこのコードを見つけました:

   Action toggleAction = collapsiblePane.getActionMap().
   get(JXCollapsiblePane.TOGGLE_ACTION);
   toggleButton.setAction(toggleAction);

しかし、ボタンをクリックしても何も起こりません。最初にペインが折りたたまれているように設定した場合、ボタンをクリックすると、アニメーションなしでペインが閉じ、その後のクリックは何もしません。プログラミングが苦手で、アドバイスをお願いします。

編集 IDE Netbeans を使用して、コンポーネントをフレームにドラッグアンドドロップします

collapsiblePane = new org.jdesktop.swingx.JXCollapsiblePane();
collapsiblePane.setCollapsed(true);

EDIT2 問題は、それが上にトグルするように設定されていたことですが、折りたたむ場所がありませんでした.RIGHTに変更しましたが、アニメーションはまだありません. フレームとペインを手動で作成しようとしましたが、問題なく動作します。問題は、GUI プラグインが折りたたみ可能なペインをフレームに追加する方法にあると思います。

おそらく、JXCollapsiblePane と Netbeans の操作に経験のある人が助けてくれるでしょう

EDIT3 ここに画像の説明を入力

ここに画像の説明を入力

collapsiblePane が開いているとき、フレーム上の他のものは動いていません。GUIビルダーからペインを作成し、そこにJPanelを配置し、パネルにいくつかのボタンとテキストフィールドを配置します。コードからのラベルとボタン:

initComponents();
        setLayout(new BorderLayout());            
         add(new JLabel("JLabelFromCode", JLabel.CENTER)); 
         JPanel buttonPanel = new JPanel(); 
         add(buttonPanel, BorderLayout.SOUTH); 
         collapsingButtonFromCode = new JButton(); 
         collapsingButtonFromCode.setText("toggleButtonFromCode"); 
         buttonPanel.add(collapsingButtonFromCode);                     
         buttonFromCode.addActionListener(collapsiblePane.getActionMap().get( 
                JXCollapsiblePane.TOGGLE_ACTION));
         collapsingButtonFromCode.addActionListener(collapsiblePane.getActionMap().get( 
                JXCollapsiblePane.TOGGLE_ACTION));
         setVisible(true);

initComponents () は、レイアウトを定義する IDE によって作成されたメソッドです。編集できません。このメソッドが問題だと思います。

java.awt.GridBagConstraints gridBagConstraints;

        buttonFromCode = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();
        collapsiblePane = new org.jdesktop.swingx.JXCollapsiblePane();
        jPanel1 = new javax.swing.JPanel();
        jButton1 = new javax.swing.JButton();
        jLabel2 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        jTextField1 = new javax.swing.JTextField();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        buttonFromCode.setText("CollapseButtonFromGuiBuilder");

        jLabel1.setText("jLabel1");

        jPanel1.setBackground(new java.awt.Color(102, 102, 102));
        jPanel1.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.LOWERED));

        jButton1.setText("jButton1");

        jLabel2.setText("jLabel2");

        jLabel3.setText("jLabel3");

        jTextField1.setText("jTextField1");

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGap(34, 34, 34)
                .addComponent(jButton1)
                .addGap(76, 76, 76)
                .addComponent(jLabel2)
                .addGap(186, 186, 186)
                .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(193, Short.MAX_VALUE))
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
                .addContainerGap(337, Short.MAX_VALUE)
                .addComponent(jLabel3)
                .addGap(296, 296, 296))
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGap(30, 30, 30)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jButton1)
                    .addComponent(jLabel2)
                    .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jLabel3)
                .addContainerGap(22, Short.MAX_VALUE))
        );

        collapsiblePane.getContentPane().add(jPanel1);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addGap(10, 10, 10)
                        .addComponent(jLabel1)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(buttonFromCode, javax.swing.GroupLayout.PREFERRED_SIZE, 249, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(44, 44, 44))
                    .addComponent(collapsiblePane, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 661, javax.swing.GroupLayout.PREFERRED_SIZE)))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(collapsiblePane, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(buttonFromCode)
                    .addComponent(jLabel1))
                .addContainerGap(22, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>
4

2 に答える 2

4

問題をシミュレートする可能性のあるコード スニペットを次に示します (何らかの理由で GroupLayout に触れないでください): 折りたたみ可能なものは、BoxLayout を使用してコンテナー内に配置されます (最大値に達するまで、コンポーネント間の余分な高さを分散します)。結果として、設定サイズがゼロのコンポーネントのサイズを - 折りたたまれた折りたたみ可能なものとして - それにもかかわらず、予測しにくい動作につながる何かにサイズ変更します。オーバーライドのコメントを外すと、適切に動作します。グループ的に似てるかも。

または、折りたたみ可能なものを、常に優先サイズに合わせたレイアウトに配置します。これは、アニメーションが常に優先サイズに合わせられることに多かれ少なかれ依存しているため、おそらく最も安全なオプションです。

    JXCollapsiblePane top = new JXCollapsiblePane() {

//            @Override
//            public Dimension getMaximumSize() {
//                return getPreferredSize();
//            }

    };
    top.add(new JLabel("some random label"));
    top.add(new JLabel("and another"));
    top.add(new JButton(top.getActionMap().get(JXCollapsiblePane.TOGGLE_ACTION)));
    top.setCollapsed(true);
    JXFrame frame = new JXFrame("collapsible in top", true);
    frame.setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.PAGE_AXIS));
    frame.add(top, BorderLayout.NORTH);
    frame.add(new JScrollPane(new JXTable(50, 4)));
    frame.add(new JButton(top.getActionMap().get(JXCollapsiblePane.TOGGLE_ACTION)), BorderLayout.SOUTH);
    frame.pack();
    frame.setVisible(true);

編集

関連する「問題」を示す可能性がある SwingX で未解決の問題があります。ただし、今考えてみると、それは実際にはバグではないと思います: 常に (展開/折りたたみまたはアニメーション中に) 折りたたみ可能なサイズを変更すると、prefSize を尊重する LayoutManager が提供されます。バインドされていても、それほど重要ではありません-とにかく好きなサイズに自由に設定できます)。そうでなければ、アニメーションとゼロの折りたたみサイズの両方を持つ信頼できる方法を考えることはできません。アイデア歓迎 :-)

于 2011-12-12T11:34:05.167 に答える
3

あなたが投稿したコードは javadoc からの単なるコピーであるためJXCollapsiblePane、問題はないように見えます。問題はおそらく別の場所にあります。

アニメーションについては、折りたたみ可能なペインのアニメーションが実際にアクティブになっていることを確認しました (「 」を参照isAnimated)。呼び出すことでアニメーションに設定できます

collapsiblePane.setAnimated( true );

ボタンはペインを折りたたむように機能し、折りたたみ/展開を担当するアクションの実装はかなり単純であるため (ソースコードを参照)、問題は別の場所にあると思います。パネルを UI に追加する場所にコードを投稿できますか。おそらく、親コンテナーは、コンポーネントが折りたたまれた後に展開することを許可しません。

于 2011-12-08T21:01:13.533 に答える