1

JFrameを作成し、いくつかのコンポーネントを追加しているときに、JFrameを表示してからボタンを追加するまでの間にJComboBoxのインスタンスを作成すると、ボタンが消えることに気付きました。

まず、JFrameを作成します。

JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(200, 200);

次に、フレームを表示するように設定し、JButtonを追加します。

frame.setVisible(true);
frame.add(new JButton("text"));

期待どおりに機能し、1つの大きなボタンが表示されます。

ボタン付きのJFrame

ただし、これらの行の間にJComboBoxのインスタンスを1つ作成すると、次のようになります。

frame.setVisible(true);
new JComboBox();
frame.add(new JButton("text"));

そして今、ボタンはなくなっています。

ボタンのないJFrame

インスタンスを作成するだけで、何にも割り当てないので、まったく変更はないと思います。
ボタンが消えるのはなぜですか?

また、new JComboBox();上に移動するframe.setVisible(true);と、ボタンが再び表示されます。

4

3 に答える 3

3

UIを表示したら、EDT以外のスレッドから変更しないでください。最初のケースでは、「運」があり、うまくいきました。2番目のケースでは、おそらくJComboBoxの作成時間が十分に長く、EDTではないスレッドからUIを変更できませんでした。

あなたがすべきことは、EDTでそのコードを呼び出すことです:

SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(200, 200);
        frame.add(new JButton("text"));
        frame.setVisible(true);
    }
})
于 2012-11-05T11:07:17.860 に答える
1

setSize();にコンポーネントを追加する前に、呼び出してsetVisible(true);いるメソッドに問題があることがわかりましたJFrame。したがって、答えは単純で、呼び出しsetSize();setVisible(true)コードの最後に(またはさらに良いのは、pack();代わりに呼び出してsetSize())、すべてが正常に機能するはずです。

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;


public class Fnatte {

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        new JComboBox();
        frame.add(new JButton("Text"));
        //frame.setSize(200,200);
        frame.pack();
        frame.setVisible(true);
    }
}
于 2012-11-05T11:20:00.993 に答える
0

add()メソッドのJavaDocから:

If the container has already been
displayed, the hierarchy must be 
validated thereafter in order to
display the added component.

変化する:

frame.setVisible(true);
new JComboBox();
frame.add(new JButton("text"));

に:

frame.setVisible(true);
new JComboBox();
frame.add(new JButton("text"));
frame.validate();

あなたが遭遇した奇妙なことは、「new JComboBox();」の追加ではないと思います。しかし、「frame.add(new JButton( "text"));」を呼び出すという事実 「frame.setVisible(true);」を呼び出した後 「frame.validate();」を呼び出さずに機能しました。

于 2012-11-05T11:28:41.793 に答える