4

「LoadingWindow」という比較的小さなクラスがあります。このクラスには、Initialize関数を呼び出してフレームをセットアップするコンストラクターがあります。なぜ更新されないのかを解決するために、いくつかのことをテストしていませんでした。テスト中に「this.removeAll();」を追加しました initializeメソッドの先頭に。結局、その後は何も追加できません。私が追加したものは、単に表示されません。

これは、クラスのわずかに縮小されたバージョンです。

public class LoadingWindow extends JFrame{

public JPanel panel;

public JProgressBar bar;

private JLabel label;

public LoadingWindow()
{

    this.Initialize();

}

public void Initialize()
{
    this.removeAll();

    this.setSize(300, 150);

    panel = new JPanel(new BorderLayout());
    bar = new JProgressBar(0,100);
    label = new JLabel("Please remain calm, we're just loading...");

    panel.add(bar,BorderLayout.CENTER);
    panel.add(label,BorderLayout.SOUTH);

    this.add(panel);

    this.validate();
    this.repaint();
    this.setVisible(true);
}
}

ウィンドウ自体は、タイトルとともに適切にポップアップします。ただし、ウィンドウ自体は完全に空白です。

このクラスを静的に実装して、他の4つのオブジェクトがEditorPanelクラスでアクセスできるようにします。その定義:

public static LoadingWindow loadingWindow;

コンストラクターで次のように初期化されます。

loadingWindow = new LoadingWindow();

次に、それを使用する関数内で、それが非表示になっているかどうかを表示するためのダブルチェックがあります。

if(!EditorPanel.loadingWindow.isVisible()){EditorPanel.loadingWindow.Initialize();}

全体的に、コンテンツが表示されない理由について少し混乱しています。質問があれば非常に興味があり、必要な情報を提供したいと思っています。グーグルは全部を提供しませんでした、そして私が見つけたすべての答えはすでに「塗り直しや検証など」を実装していました。

あなたからの便りを楽しみにしています!

〜トラビス

4

2 に答える 2

14

removeAll()@TomHawtintackline(彼に+1)が言ったように、JFrames contentPaneには転送されません; のようadd()に、remove()またはsetLayout()です。

したがって、これを行うと、のルートペインJFrame#removeAll()削除されます。興味深い読み物については、ルートペインの使用方法を参照してください。これは、将来の取り組みに役立つ可能性があります。JFrame

やったほうがいい:

getContentPane()。removeAll();//contentPaneからすべてのコンポーネントを確実に削除します

  • JFrameまた、(現在の機能を超える機能を追加しない限り)不必要に拡張しないでください。インスタンスを作成しJFrameて使用するだけです。

  • 呼び出すのではなく、図面に適合する寸法setSizeの適切なLayoutManagerおよび/またはオーバーライドgetPreferredSize()を使用して返すので、表示するように設定する前に呼び出すことができます。JPanelpack()JFrame

  • validate()必要はないと思いますrepaint()。これらは、コンポーネントが表示されているコンテナに追加されたときにのみ呼び出す必要があります。コンポーネントを追加および削除するために機能するのではなく、それを実行revalidate()します(順番に呼び出しますvalidate()

于 2013-01-11T17:52:02.560 に答える
3

removeAllルートペインが削除されると思います。

JFrameはコンテナであり、フレームと見なされるものの一部であるいくつかのコンポーネントが含まれています。JFrame(および)にハックが導入されたJAppletため、一部のメソッドはフレーム自体ではなくコンテンツペインに作用します。別の方法を使用するか、転送が有効になっていない場合は特別な方法の1つを使用すると、失敗します。

についてはAPIドキュメントを参照し、オーバーライドされないJFrame.removeことに注意してください。removeAll

最も安全な解決策は、「役立つ」転送を無視し、コンテンツペイン自体を操作することです(またはを介してgetContentPane、または場合によっては独自JPanelに作成して使用することをお勧めしますsetContentPane)。(また、やなどのクラスを不必要に拡張しJFrameたりThread、標準のコーディング規則に従ったりしないでください。)

于 2013-01-11T17:50:37.503 に答える