1

Netbeans (7.0) を使用して Java で GUI を開発しています。

このパネル内に JPanel といくつかの要素を含む JFrame があります。

レイアウトの種類はフリーレイアウトだと思います。

下書き:

-------------------
|JFrame           |
|                 |
| --------------- |
| |JPanel       | |
| |             | |
| | elem1 elem2 | |
| | elem3 elem4 | |
| | elem5 elem6 | |
| |             | |
| |-------------- |
|                 |
-------------------

プログラムの実行中に、setVisible(false) を使用して、1 つの行にあるいくつかの要素 (elem3 と elem4 など) を非表示にしています。

ギャップを除いて、すべてが期待どおりにサイズ変更されます (JFrame および JPanel)。要素が正しく隠されているように見えますが、ギャップが残っているため、elem3 と elem4 を非表示にしている私の例では、行 elem1/elem2 と elem5/6 の間に大きなギャップが残っています。

うまくいけば、私の問題は理解できました:-)

この動作を修正する方法はありますか?

前もって感謝します。

シュテファン

4

3 に答える 3

1

@Steffen Kuehn 発生している「考えられる」問題を示す以下のコードをチェックしてください。つまり、変更されたパネルを再検証して再描画していません。

マウスの左ボタンを使用してパネルをクリックすると、再描画/再検証が行われず、最初は何も起こっていないように見えることに注意してください。フレームのサイズを変更してみてください。操作を呼び出すと、要素 5 と 6 が実際に表示されていることがわかります。したがって、変更をすぐに行いたい場合は、可視性の変更と検証を行う右クリックを使用します。

    import java.awt.Color;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import javax.swing.SwingUtilities;

    public class FlowComponentsTest
    {
        public static void main(String[] args)
        {
            SwingUtilities.invokeLater(new Runnable()
            {
                @Override
                public void run()
                {
                    final JPanel p = new JPanel();
                    for(int i = 1; i <= 20; i++)
                    {
                        JComponent c = new JTextField("I am element no. " + i);
                        //so any textfield will not steal the focus from the panel p
                        c.setFocusable(false);
                        p.add(c);
                        if(i == 5 || i == 6)
                        {
                            c.setForeground(Color.GREEN);
                            c.setVisible(false);
                        }
                    }
                    JFrame f = new JFrame();
                    f.addMouseListener(new MouseAdapter()
                    {
                        @Override
                        public void mousePressed(MouseEvent e)
                        {
                            JComponent c5 = (JComponent) p.getComponent(4);
                            JComponent c6 = (JComponent) p.getComponent(5);
                            c5.setVisible(!c5.isVisible());
                            c6.setVisible(!c6.isVisible());

                        if(e.getButton() == MouseEvent.BUTTON3)
                        {
                            System.out.println("Right click");
                            p.revalidate();
                            p.repaint();
                        }
                    }
                });
                f.setContentPane(p);
                f.setSize(300, 330);
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.setVisible(true);
            }
        });
    }
}
于 2011-05-20T11:23:40.147 に答える
1

非表示にする代わりに jpanel からその要素を削除してみてください。コンポーネントの追加と削除を処理する方法は、レイアウトによって異なります。

于 2011-05-19T08:49:24.793 に答える
1

誤解を避けるために次のようにします。

TopLayoutContainerが一度表示される場合:

1/ 新しい JComponent を追加するには呼び出す必要がrevalidate()あり、プログラムで設定された複合 JComponents fe の場合は JComboBox の項目も呼び出す必要がありrepaint()ます

2/ JCmponent を削除した後、revalidate()plusを呼び出す必要がありますrepaint()

3/ たとえば、JComponents を削除 -> 新しい JComponents を追加 ->revalidate()プラスrepaint()

@Steffen Kuehnには、考えられる問題がたくさんあります。説明した問題を説明するコードを送信することをお勧めします

于 2011-05-19T09:54:49.707 に答える