动态GUI上的自定义按钮

时间:2012-09-17 11:45:44

标签: swing jbutton custom-component

My Swing-Application通过GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds()设置JFrame的大小,并且所有Elements都与此值相关,因此应用程序基本上适应屏幕分辨率。

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

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

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

1 个答案:

答案 0 :(得分: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,但我尽量保持与原始代码尽可能接近。