2

かなりの数JDialogsJFileChoosersと を含む他のコンポーネントを含むプログラムがありJButtonsます。

JButtonからフォーカスを非表示JButtonに設定できることはわかって.focusPainted(false)いますが、問題は、「自動的に」作成されたコンポーネント (事前定義された JDialogs、JFileChoosers) がたくさんあり、それらの JButton にアクセスできないことです。サブコンポーネントを制御できるようにするには、コンポーネント全体を手動で作成する必要があります (そして、最初から fileChooser を作成するのは難しいはずです)...

しかし、私には考えがあります。JButton が作成されるたびに、デフォルトfocusPaintedで に設定さtrueれます。元の JButton コンストラクターを含む Java ライブラリを見つけて、メソッドをfalseそこにあるように変更し、それをデフォルトにする方法はありますか?

編集: src.zip を見つけて、AbstractButton.java を抽出しました。編集して再コンパイルするにはどうすればよいですか?

実際、問題は、Java 標準ライブラリをどのように編集するかということです。

PSそれは良い習慣ではないと言っている皆さん、この特定の例で何がうまくいかない可能性がありますか(JSLのすべては、フォーカスがJbuttonに描かれているかどうかに依存するとは思いません)?また、元のライブラリを使用するプロジェクトと編集済みのライブラリを使用するプロジェクトの 2 つのプロジェクトを同時に作業することもできます。 一方ではエラーが発生し、もう一方ではエラーが発生しない場合、どこに問題があるかがわかります。

4

2 に答える 2

0

使用するコンストラクターで設定したJButton独自の Button クラスから継承して使用するにはどうすればよいでしょうか。標準の Java コードを変更したくありません。focusPaintedfalse

public class MyButton extends JButton{

  public MyButton() {
    super();
    setFocusPainted(false);
  }

}

しかし、これは FileChooser ボタンのフォーカスを変更しません。

于 2012-09-12T11:27:20.797 に答える
0

現在使用しているルック アンド フィールをサブクラス化して、カスタム ルック アンド フィールを作成します。ルック アンド フィール自体とボタン UI デリゲートの 2 つのクラスを定義するだけで十分です。ルック アンド フィールは、元のボタン デリゲートを置き換えて、ボタン デリゲートを共通テーブルに配置する必要があります。デリゲートは、フォーカス四角形が描画されないように、空のメソッドでフォーカス四角形を描画するメソッドをオーバーライドする必要があります。また、デリゲート インスタンスを作成するデリゲートの静的メソッドをオーバーライドする必要があります。

public class MyLookAndFeel extends WindowsLookAndFeel {

    protected void initClassDefaults(UIDefaults table){
        super.initClassDefaults(table);
        table.put("ButtonUI","package1.package2.MyButtonUI");
    }

}

public class MyButtonUI extends WindowsButtonUI {

    private static MyButtonUI thiz;

    public static ComponentUI createUI(JComponent c) {
        if(thiz==null) thiz=new MyButtonUI();
        return thiz;
    }

    protected void paintFocus(Graphics g, AbstractButton b, Rectangle viewRect, Rectangle textRect, Rectangle iconRect){}

}

アプリケーションが起動したら、カスタマイズしたルック アンド フィールを有効にします。

UIManager.setLookAndFeel("package1.package2.MyLookAndFeel");

これにより、手動で作成したボタンだけでなく、JOptionPane、ファイル ダイアログなどのボタンからもフォーカス四角形が削除されます。

于 2012-09-13T10:59:26.563 に答える