1

私が作ったプログラム選択ツールがあります。17個のボタンでJFrameを開き、そのうち15個はカスタマイズ可能で、C:ドライブにある.txtドキュメントからテキストを取得します。割り当てボタンをクリックすると、JFileChooserが開き、ボタンをクリックしたときに開くファイルを選択します。次に、変更するボタンを選択し、ボタンで表示するテキストを入力します。その後、プログラムは.txtファイルを書き換え、ボタンを更新します。更新するためのコードは次のとおりです。

public static void restart() {
    start.assignButtonActions();
    start.assignButtonText();
    start.paint(graphics);
}
public void assignButtonActions() {
    /**
     * assign button actions
     */
    for (int i = 0; i < buttonAction.length; i++) {
        buttonAction[i] = io.readSpecificFromHD("C:\\ButtonActions.txt", i
                + 1 + actionButton.length);
    }
}

public void assignButtonText() {
    for (int i = 0; i < actionButton.length; i++) {
        /**
         * set button text
         */
        actionButton[i].setText(io.readSpecificFromHD(
                "C:\\ButtonActions.txt", i + 1));
    }

}
public void paint(Graphics g) {
    g.drawImage(getImage("files/background.png"), 0, 0, FRAMEWIDTH,
            FRAMEHEIGHT, null);
    refresh();
}

public void refresh() {
    graphics.drawImage(getImage("files/background.png"), 0, 0, FRAMEWIDTH,
            FRAMEHEIGHT, null);
    for (int i = 0; i < actionButton.length; i++) {
        actionButton[i].repaint();
    }
    assignButton.repaint();
    helpButton.repaint();
}

これが、私が信じるこの質問に必要なすべてのコードです。問題は、メソッドrestart()が呼び出された後、背景がそこにあり、ボタンの周りに白い四角があり、四角の内側が白であるということです。それほど大きな問題ではありませんが、本当に信じられないほど迷惑で、かなり専門的ではありません。最初は、背景がペイントされた後にボタンのサイズが変更されていると思ったので、呼び出されるたびに更新が2回実行されるようにしました。1ビット助けませんでした。

編集:私は問題を修正しました。私はホバークラフトの答えを受け取り、学んだことを少し修正しました。私がしなければならなかったのは、restart()メソッドを次のように変更することだけでした。

public static void restart() {
    start.assignButtonActions();
    start.assignButtonText();
    start.repaint();
}

repaint();ホバークラフトが言ったことだったコンポーネント全体を塗り直したからです。みなさん、ありがとうございました!これが将来の質問に役立つことを願っています。

4

1 に答える 1

4

直接呼び出して、JComponentのメソッドpaint(...)の外部でGraphicsオブジェクトを使用しようとすると、Swingグラフィックが正しく処理されていないようです。paintComponent(...)すべてのSwingグラフィックチュートリアルで説明されているように、これを行わないでください(まだいくつかを経験していない場合は、すぐにこれを実行することをお勧めします)。代わりに、JComponent(JPanelなど)内のすべてのグラフィックを実行し、paintComponent(...)最初にsuperのメソッドを呼び出し、JVMによって提供されるGraphicsオブジェクトをpaintComponentのメソッドパラメーターで使用します。


チュートリアルリンクの編集:

グラフィックコードのほとんどを書き直さなければならないと思います。行う必要のある変更:

  • JFrameまたはその他のトップレベルウィンドウではなく、JPanelまたはその他のJComponentから派生したクラスでのみ描画します。
  • paintComponent(...)クラスのメソッドを描画します。
  • メソッドのすぐ上に@Overrideアノテーションを配置paintComponent(...)して、実際にスーパーメソッドをオーバーライドしていることを確認します。
  • オーバーライドメソッドpaintComponent(...)の最初の行(通常)としてスーパーを呼び出します。paintComponent(...)
  • JVMによってこのメソッドに渡されたGraphicsオブジェクトを使用します。
  • コンポーネントを呼び出して取得したGraphicsオブジェクトを使用しないでくださいgetGraphics()(まれな例外を除く)。
  • クラスにGraphicsフィールドを与えて、その中にGraphicsオブジェクトを格納しようとしないでください。JVMによって指定されたGraphicsオブジェクトは永続化されず、すぐにnullまたは使用できなくなります。
  • paint(...)自分で電話したり直接電話したりしないpaintComponent(...)でください(まれな例外がありますが、現在のコードは例外の1つとして適格ではありません、私を信じてください)。
  • repaint()JButtonを呼び出す必要はないでしょう。
于 2012-08-08T21:16:49.337 に答える