0

My Swing-Applicationは、を介してJFrameのサイズを設定し、GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds()すべての要素はこの値を基準にしているため、基本的にアプリケーションは画面の解像度に適応します。

カスタムボタンに問題があります。今のところ、3つの異なるImageIcon(通常、ロールオーバー、および押された)を作成し、それらをボタンに追加します。しかし、当然、1920x1080(私のデフォルト)とは異なる解像度でアプリケーションを実行すると、ボタンが大きすぎます。

私はこの質問(http://stackoverflow.com/questions/8234726/auto-resizing-jbutton-icon)を見つけ、アイコンを作成してJlabelに配置し、ボタンにラベルを追加することで解決策を試しましたが、何もありません表示されます。また、ウィンドウのサイズを変更する必要はありません。

このトピックの最速かつ解決策は何ですか?オプションは、解像度ごとにすべてのカスタム画像を個別に作成し、画像名の最後に解像度のx値を追加し、どの画像をロードするかを確認するためのスイッチケースを作成することですが、これは非常に高価で時間のかかるソリューション。ロードされた画像を画面解像度に相対的な証明書サイズに自動的にサイズ変更する効率的な方法はありますか?

4

1 に答える 1

2

がある場合は、Image呼び出しgetScaledInstanceてサイズ変更された画像を取得できます。

がある場合はImageIcon、それを呼び出しgetImage()て を取得し、Image上記の解決策を使用できます。

getScaledInstanceは を返します。Imageこれは にラップして、またはImageIconに設定できます。JButtonJLabel

したがって、可能な限り最高の解像度で画像を作成し、適切な解像度に縮小します。

これは小さなスニペットです(あなたが始めた @mKorbel ソリューションから着想を得ています):

import java.awt.BorderLayout;
import java.awt.Image;
import java.net.MalformedURLException;
import java.net.URL;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;

public class ResizeIconInButton extends JFrame {

    private static final long serialVersionUID = 1L;
    private static final String IMAGE_PATH = "http://duke.kenai.com/misc/Bullfight.jpg";
    private JButton myButton = new JButton();

    public ResizeIconInButton() throws MalformedURLException {
        myButton.setIcon(new ImageIcon(new ImageIcon(new URL(IMAGE_PATH)).getImage().getScaledInstance(600, 400, Image.SCALE_SMOOTH)));
        add(myButton, BorderLayout.CENTER);
        setTitle("Resize Icon In Button");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setVisible(true);
    }

    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                try {
                    ResizeIconInButton main = new ResizeIconInButton();
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

小さいメモ: JFrame を拡張することはお勧めしませんが、元のコードにできるだけ近づけるようにしました。

于 2012-09-17T12:03:33.233 に答える