web-dev-qa-db-ja.com

JButtonフォーカス境界を無効にする

JavaのJButtonに問題があります。基本的に、ボタンの境界線を無効にします(ボタンはJDesktopPaneに追加されます)。

ここに私のコードがあります:

 JButton j = new JButton("BUTTON");
 j.setIcon(icon1); //icon1 : icon//
 j.setFocusable(true);
 j.setContentAreaFilled(false);
 j.setBounds(90, 20, 130, 30);
 dtp.add(j); //dtp : JDesktopPane//

次の画像のように境界線を非表示にすることができます。

enter image description here

しかし、マウスがボタン内でクリックされた(移動されない)場合、次のようにボタンの周りに「ドット」境界線があります。

enter image description here

そのため、マウスをボタン領域の周りに動かさない場合でも、最初の画像のように設定されるようにボタンを設定するにはどうすればよいでしょうか?青い背景)?

29
Cocc Cocc

それは国境ではありません。焦点です。以下を使用して削除できます。

jButton1.setFocusPainted(false);
100
zari

これは古いスレッドかもしれませんが、button.setFocusable(false)で解決しました

まだ答えを探している人たちに役立つことを願っています。乾杯。

6
ralphgabb

掘った後、私はより良い解決策を思いつきました。これは、Windows上のGTKアプリケーションの一般的なUIバグでもあり、そのうちの1つはGIMPです。それは非常に悩ましいので、すべてのコントロールに手動で設定するよりも、より良い修正グローバル修正を見つけたいと思いました。

回避策は、発生するはずのないすべての一般的なコントロールのフォーカスの色を透明に設定します。私は、Visual StudioのWindowsフォームで広範囲にテストしました。ツールバーのボタンとトグルボタンは、フォーカスがあっても点線の境界線を持つことはありません。ツールバーはsetFocusable(false)であると想定されています。 Windowsの場合と同様にデフォルトで。 Swingの場合と同様に、他のすべてのコントロールには点線の境界線が必要ですが、フォーカスが循環している場合のみです。

        // Removes the dotted border around controls which is not consistent with Windows
        UIManager.put("Button.focus", new ColorUIResource(new Color(0, 0, 0, 0)));
        UIManager.put("ToggleButton.focus", new ColorUIResource(new Color(0, 0, 0, 0)));

        // ways to remove it from other controls...
        UIManager.put("CheckBox.focus", new ColorUIResource(new Color(0, 0, 0, 0)));
        UIManager.put("TabbedPane.focus", new ColorUIResource(new Color(0, 0, 0, 0)));
        UIManager.put("RadioButton.focus", new ColorUIResource(new Color(0, 0, 0, 0)));
        UIManager.put("Slider.focus", new ColorUIResource(new Color(0, 0, 0, 0)));

        // figure out combobox
        UIManager.put("ComboBox.focus", new ColorUIResource(new Color(0, 0, 0, 0)));
2
Goombert

通常のJButtonでこれを行うのは良い考えだとは思いません。何もない場合、異なるプラットフォームでこのボタンを表示する予定がある場合、異なるプラットフォーム(MacおよびLinux)で同様に表示されません。実用的な目的のために、button.setFocusPainted(false);は現在の要件を処理する必要があります。

振る舞いの違いを避けるために、振る舞いのようなボタン(アクションリスナー)で拡張JLabelを使用することを検討してください。

1
ring bearer

これがあなたを助けることができるかどうかを確認してください 境界線を削除する

または多分これ

Border emptyBorder = BorderFactory.createEmptyBorder();
yourButton.setBorder(emptyBorder);
0
Rbn