4

私はJava GUIに苦労しています - 事前に助けてくれてありがとう! 私はいくつかのコンポーネントを持つJFrameを持っています:アクションリスナーをトリガーするボタン(Jbutton) 、コンポーネントであるcomp JScrollPaneをその中のコンポーネントに置き換えようとしています(コンポーネントのタイプは関係ありません。テキストフィールドである可能性があります。テーブルか何か)。

アクションをトリガーしたい - コンポーネントを削除し、新しいコンポーネントを削除した場所と同じ場所に配置し、ウィンドウを再描画します (これを使用して、さまざまなタイプのテキスト フィールドと JTable を表示しています)。これは私が持っているものです:

JScrollPane sp = new JScrollPane(comp);
this.add(sp, BorderLayout.CENTER);
//this works so far - first time I display this is ok!

private void replace() {
 comp = new Component(...); //name and type of the components is not important
 sp = new JSCrollPane(comp);
 this.remove(sp); //remove old component
 add(sp, BorderLayout.CENTER);
 repaint();
 revalidate();
}

機能が仕事の代わりにならないのはなぜですか? 何もしません(コンポーネントをロジックで変更するため、compのコンテンツにアクセスすると更新されますが、古いものが表示されます)。

コードが非常に長いため、ちょっと象徴的に書きました...助けてくれてありがとう!編集:コードの1行を忘れました..

4

3 に答える 3

6

スクロール ペインを削除しようとする必要はありません。

スクロール ペインに表示されるコンポーネントを変更するには、次の呼び出しを行うだけです。

sp.setViewportView(new Component(...));

その呼び出しの後、古いコンポーネントはビューから削除され、新しいコンポーネントに置き換えられます。

したがって、コードは次のようになります。

JScrollPane sp = new JScrollPane(comp);
this.add(sp, BorderLayout.CENTER);

private void replace() {
    comp = new Component(...); //name and type of the components is not important
    sp.setViewportView(comp);
}
于 2012-12-01T16:30:16.133 に答える
2

コードの外観から、追加した最初のスクロール区画 (this.add) は、削除したもの (this.remove) とは異なります。remove から返されたブール値をテストして、実際に削除されたかどうかを確認します。そうではないことがわかると思います。

于 2012-12-01T16:33:08.000 に答える
1

このボードには解決策があります:

jpanel.remove(component); //remove component from your jpanel in this case i used jpanel 
jpanel.revalidate(); 
jframe.repaint();//repaint a JFrame jframe in this case 

to add: 
jpanel.add(component); //add component to jpanel in this case i used jpanel 
jpanel.revalidate(); 
jframe.repaint();//repaint a JFrame jframe in this case 

これがうまくいくかどうかを確認してください。自分では試していません...

于 2012-12-01T16:33:19.617 に答える