1

アプリにフォントサイズの切り替えを実装する必要があります。しかし、フォントのサイズを大きくしても、ラジオボタンは同じサイズのままで、高解像度の小さな画面では、顧客は簡単にヒットできません。L&Fに掘り下げてアイコンを手動で再描画せずに、プログラムでRadioButtonの丸いもののサイズを変更する方法はありますか(アプリは異なるUIを持つ複数のプラットフォームを対象とし、それぞれに7つのアイコンが必要なため複雑です)。

完璧なソリューションは次のようになります。

  1. ネイティブUIアイコンの抽出。
  2. サイズ変更
  3. サイズ変更されたアイコンをコンポーネントのアイコンとして設定します。

ステップ1を実装する方法は?出来ますか?

編集:これは私がこれまでに試したことです

public class IconImageSaver extends JFrame{

    public IconImageSaver() {

        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setBounds(0,0,100,100);
        setVisible(true);

        JRadioButton rad1 = new JRadioButton();
        rad1.setBounds(10,10,40,40);
        add(rad1);

        Icon icon = UIManager.getIcon("RadioButton.icon");//(1) trying to get icon

        int w = icon.getIconWidth(),h = icon.getIconHeight();
        Image i = rad1.createImage(w, h);
        Image i2 = rad1.createImage(w,h);
        Graphics g = i.getGraphics();
        Graphics g2 = i2.getGraphics();


        g.setColor(Color.CYAN);
        g.fillRect(0, 0, w, h);
        rad1.setIcon(new ImageIcon(i));//setting icons
        g2.setColor(Color.RED);
        g2.fillRect(0, 0, w, h);
        rad1.setPressedIcon(new ImageIcon(i2));//setting icons
    }

    public static void main(String[] args) {
        new IconImageSaver();
    }

}

位置(1)でアイコン画像を取得しようとしていますが、背景色のみが返されます。理由がわかりません。さまざまな状態のアイコンの設定は、意図したとおりに機能します。

4

3 に答える 3

3

一部のL&F(NimbusAquaなど)は、コンポーネントのサイズ変更クライアントプロパティの使用で説明されているように、大規模 なをサポートしています。JComponent.sizeVariant

補遺:純粋なネイティブL&Fを使用する必要があります

aのレンダリングは、関連するデリゲートJRadioButtonによって決定されます。ButtonUIネイティブL&Fによって提供されるデリゲートの内部には、通常アクセスできず、ホストプラットフォームAPIに依存しています。ユーザーが選択したL&Fの利用可能な機能を使用するか、独自の機能を提供する必要があります。根本的な問題についてもっと説明できれば、より良い代替案を提案するのに役立つかもしれません。

補遺:完全なL&Fの開発がない場合、ラジオボタンの親であるを操作できる可能性がありますJToggleButtonこのようなボタンは、ここButtonGroupに示すようにでうまく機能し、ここで概説するように任意に装飾することができます。

于 2012-10-18T17:14:10.687 に答える
1

非常L&F sensitiveに、デフォルトでできます

  • 適切なL&Fを使用します(Nimbusのみがauto_whateverを実装しています)が、カスタムL&Fについて話します

  • UIManagerのキーをオーバーライドしますが、これらのキーは、別のL&Fと比較して、(提示または値付きで)または欠落している可能性があります。

  • 独自の(J)コンポーネントを作成して、重要なメソッドを上書きし、

    a)UIMangerに配置します(1つの定義はJVMインスタンス全体に有効です)

    b)表示されているGUIで、選択した、必要な、または(J)コンポーネントの一部にei....を追加します。

  • ()の通知I need to implement font size switching in my appフォントまたはFontUIResourcesを変更する必要があるかどうかをテストすることが非常に重要です。これは、(J)Componentsの一部の実装メソッドの一部でFontと必要なFontUIResourcesをかなり無視します。逆も

于 2012-10-18T11:18:04.243 に答える
1

重要な注意:これは、デフォルトの「メタル」ルックアンドフィールでのみテストされました。これが他のルックアンドフィールで機能することを保証するものではありません。また、それは確かにちょっとしたハックなので、それがどのように機能するのか完全にはわかりません。

私はこれを少し違った方法で解決することができました。

UIManagerのデフォルトを使用してフォントをグローバルに拡大縮小していたので、ラジオボタンをフォントに合わせて拡大縮小したかったのです。

UIManagerからラジオボタンのアイコンを抽出し、それらをバッファリングし、サイズを変更してから、バッファリングされたアイコンのグラフィックから新しいアイコンを取得することで、これを実行できることがわかりました。

私はこの関数に行き着きました:

public static void scaleRadioButtonIcon(JRadioButton rb){
    boolean previousState = rb.isSelected();
    rb.setSelected(false);
    FontMetrics boxFontMetrics =  rb.getFontMetrics(rb.getFont());
    Icon radioIcon = UIManager.getIcon("RadioButton.icon");
    BufferedImage radioImage = new BufferedImage(
        radioIcon.getIconWidth(), radioIcon.getIconHeight(),BufferedImage.TYPE_INT_ARGB
    );
    Graphics graphics = radioImage.createGraphics();
    try{
        radioIcon.paintIcon(rb, graphics, 0, 0);
    }finally{
        graphics.dispose();
    }
    ImageIcon newRadioImage = new ImageIcon(radioImage);
    Image finalRadioImage = newRadioImage.getImage().getScaledInstance(
        boxFontMetrics.getHeight(), boxFontMetrics.getHeight(), Image.SCALE_SMOOTH
    );

    rb.setSelected(true);
    Icon selectedRadioIcon = UIManager.getIcon("RadioButton.icon");
    BufferedImage selectedRadioImage = new BufferedImage(
            selectedRadioIcon.getIconWidth(), selectedRadioIcon.getIconHeight(),BufferedImage.TYPE_INT_ARGB
    );
    Graphics selectedGraphics = selectedRadioImage.createGraphics();
    try{
        selectedRadioIcon.paintIcon(rb, selectedGraphics, 0, 0);
    }finally{
        selectedGraphics.dispose();
    }
    ImageIcon newSelectedRadioImage = new ImageIcon(selectedRadioImage);
    Image selectedFinalRadioImage = newSelectedRadioImage.getImage().getScaledInstance(
        boxFontMetrics.getHeight(), boxFontMetrics.getHeight(), Image.SCALE_SMOOTH
    );
    rb.setSelected(previousState);
    rb.setIcon(new ImageIcon(finalRadioImage));
    rb.setSelectedIcon(new ImageIcon(selectedFinalRadioImage));
}

ラジオボタンのフォントメトリックからフォントのサイズを取得します。これらのメトリックを使用して、「ルックアンドフィール」にあるアイコンに基づいて新しいアイコンを導き出し、フォントの高さに合わせてサイズを変更します。

説明できないことの1つは、両方のアイコンを取得するために同じプロパティにアクセスしているときに、UIManagerから出てくるラジオボタンのアイコンが「選択済み」アイコンにどのように変化するかです。

コントロールの状態を保存することから始めて、最後に復元できるようにします。これが行われるのは、アイコンを正しく設定するために、最初にUIManagerからアイコンを要求するときに状態をオフにし、次にアイコンを2回要求するときに状態をチェックして'を選択する必要があるためです。 'アイコン。

繰り返しになりますが、UIManagerがどのように機能するのか、または1つのラジオボタンの「選択済み」値を設定するだけで同じプロパティを呼び出すとアイコンが変わる理由は完全にはわかりませんが、両方の必要なアイコンを取得するには、それが必要です。

フォントを使用してコントロールのサイズを変更したくない場合は、高さと幅をパラメーターとして渡すだけで、バッファーに入れられた画像のサイズを設定するときに、フォントの高さの代わりにそれらを使用できます。

これと同じ方法論がチェックボックスで機能することを言及するかもしれません

于 2014-11-18T13:09:32.483 に答える