0

我的 Swing-Application 通过 设置 JFrame 的大小GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds(),所有元素都与这个值相关,所以基本上应用程序会适应屏幕分辨率。

现在我的自定义按钮有问题。现在,我创建了三个不同的 ImageIcon(正常、翻转和按下)并将它们添加到按钮中。但很自然,如果我以不同于 1920x1080(这是我的默认设置)的分辨率运行应用程序,按钮就会太大。

我发现了这个问题(http://stackoverflow.com/questions/8234726/auto-resizing-jbutton-icon)并通过创建一个图标尝试了解决方案,将其放在Jlabel上并将标签添加到按钮,但什么都没有显示。另外,我不需要调整窗口大小。

这个主题的最快和解决方案是什么?一个选项是为每个分辨率单独创建所有自定义图像,在图像名称的末尾添加分辨率的 x 值,并让我们说一个 switch case 来检查应该加载哪个图像,但我认为这是一个非常昂贵且耗时的解决方案。是否有一种有效的方法可以将加载的图像自动调整为相对于屏幕分辨率的特定大小?

4

1 回答 1

2

如果您有Image,您可以调用getScaledInstance来检索调整大小的图像。

如果你有一个ImageIcon,你可以调用getImage()它,检索一个Image,然后使用上面建议的解决方案。

getScaledInstance返回 an Image,您可以将其包装回 anImageIcon并设置在 aJButton或 a上JLabel

所以,我会创建尽可能高分辨率的图像,然后将它们缩小到适当的分辨率。

这是一个小片段(灵感来自您开始的@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 回答