4

I'm not understanding Java GUI's as well as I thought. In my paint method for a frame, I'd like to wipe all of the current buttons, and add new ones. (The overall goal is to have an interface where the user can see characters and click on the buttons to download documents related to the character. Since every character is different, when the user selects a new user from my list, a new set of documents and buttons will be available to them.)

This is a test frame that I just wrote that shows where things go sideways. It has the similar paradigms that I use in my actual program, without too much clutter:

public class GUITest extends JFrame
{

/**
 * @param args
 */
public static void main(String[] args)
{
    Container gui_test = new GUITest();

}

private JComponent content = null;

public GUITest()
{
    super();

    setVisible(true);
}

public void paint(Graphics g)
{
    this.removeAll();

    content = new JPanel();

    JComponent test_button = new JButton("New Button 1");
    JComponent button = new JButton("New Button 2");

    content.add(button);
    content.add(test_button);

    this.add(content);

    super.paint(g);
}

}

Without the call to removeAll(), buttons will continue to be thrown on top of the JPanel, but with the call, nothing shows up. I don't know why this is, as I'm adding the components appropriately, right?

Edit
Got it, let me give you a more detailed breakdown. A client is navigating my program by looking at a list of characters in a game on a west panel. They can select a row from the list which will show char details on the east panel. The details are an image and description. Recently, I added relevant documents for that particular char, which will show on the bottom of the east panel. I created key listener's, so the client can quickly view the document by pressing a num key, but I also want to give them the ability to click on the button to launch a pdf view and see the contents of the document.

Since every char has different related docs and different number of docs, I repainted the buttons every time, to reflect the amount of related docs and the appropriate titles for the docs. This is where the repaint is acting strange. You gave me a good explanation of what's going wrong, but I don't know how to give the client access to the docs now, aside from painting a description of the doc along with the hot key needed to launch it. Does that make sense?

4

2 に答える 2

7

GUI にコンポーネントを追加したり、paint または paintComponent メソッドのコンポーネントを削除したりしないでください。やらないでください。これまで。限目。

これらのメソッドは描画のみを目的としており、できるだけ高速である必要があります。そうしないと、プログラムが応答しなくなります。それだけでなく、これらのメソッドがいつ呼び出されるか、または呼び出されるかどうかを完全に制御することはできないため、プログラムのロジックと構造をこれらのメソッドに入れないでください。

代わりに、ActionListeners、ListSelectionListeners などのイベント リスナー、またはキー バインディングを使用して、ユーザー イベントに反応します。

編集
について

わかりました、もう少し詳しい内訳を教えてください。クライアントは、西側のパネルでゲームのキャラクターのリストを見て、私のプログラムをナビゲートしています。リストから行を選択すると、東のパネルに文字の詳細が表示されます。詳細は画像と説明です。最近、その特定の文字に関連するドキュメントを追加しました。これは、東のパネルの下部に表示されます。キーリスナーを作成したので、クライアントは num キーを押すことでドキュメントをすばやく表示できますが、ボタンをクリックして PDF ビューを起動し、ドキュメントの内容を表示できるようにしたいと考えています。

JList を使用して左側に選択可能な情報のリストを保持し、ListSelectionListener でそれに反応します。リスナーでは、関連する表示情報を変更します。また、Swing で KeyListeners を使用することは避けますが、代わりに Key Bindings に引き寄せられます。

それにかんする

すべての文字には異なる関連ドキュメントと異なる数のドキュメントがあるため、関連ドキュメントの量とドキュメントの適切なタイトルを反映するために、ボタンを毎回塗り直しました。これは、再描画が奇妙な動作をしている場所です。あなたは何がうまくいかないのかについて良い説明をしてくれましたが、ドキュメントの説明とそれを起動するために必要なホットキーをペイントする以外に、クライアントにドキュメントへのアクセスを今すぐ許可する方法がわかりません. それは理にかなっていますか?

ここで何をしているのか、何をしようとしているのかわかりません。

于 2012-07-14T00:29:19.723 に答える
3

すべての文字には異なる関連ドキュメントと異なる数のドキュメントがあるため、関連ドキュメントの量とドキュメントの適切なタイトルを反映するために、毎回ボタンを塗り直しました。これは、塗り直しが奇妙に機能しているところです。何が問題になっているのかについての良い説明をくれましたが、ドキュメントの説明と起動に必要なホットキーをペイントする以外に、クライアントにドキュメントへのアクセスを許可する方法がわかりません。それは理にかなっていますか?

したがって、ボタンを「ペイント」するのではなく、テキストを変更してみませんか(setText(...))。

ユーザーが「char」を選択したとき。画面の一部を再構築する必要があります。リストモデルを変更し(上記のように)、ドキュメントコンテナで必要なボタンを削除/追加します。

于 2012-07-14T02:10:26.650 に答える