【问题标题】:How to create a custom JButton in java with an image base?如何使用图像库在 java 中创建自定义 JButton?
【发布时间】:2012-01-04 09:06:02
【问题描述】:

我最近阅读了这篇关于通过扩展 JButton 类在 java 中创建自定义按钮的线程 (Creating a custom button in Java),但是该线程上的所有解决方案都使用在 java 中绘制的图形。

我希望我的按钮基于我在 Photoshop 中绘制的按钮图像。所以我尝试将我在该线程中读到的内容应用到这个结果中:

import javax.swing.*;
import java.awt.*;

public class nextButton extends JButton {
    @Override
        protected void paintComponent(Graphics g) {
        Image image = new ImageIcon("nextButton.png").getImage();
        g.drawImage(image,0,0,this);
}

    @Override
    public Dimension getPreferredSize() {
        Dimension size = super.getPreferredSize();
        size.setSize(75, 150);
        return size;
    }
}

当我运行已将此按钮添加到 JPanel 的主程序时,它不会显示。我假设这可能是以下几个原因之一:

a) JButton 的大小与图像不匹配? b) 我没有正确加载图像。在我的讲师给我的笔记中,他只用“imageName.png”写出了显示图像代码,没有文件路径,所以我不知道这是否是正确的方法,或者程序如何知道加载图像. c) 到目前为止我不知道的其他事情。

如果有人知道如何解决这个问题,我将非常感激。

非常感谢!

【问题讨论】:

  • 几个 cmets,或多或少与您的问题无关:a)paintComponent 覆盖是非法的 b)永远不会 更改 getter 中的任何内容 c)特别是, setSize 无论如何都是由 LayoutManager 完成的,在理智的应用程序中没有任何影响 d) 覆盖 getPreferredSize 并返回一个合理的大小提示是正确的,基于组件的内部,这里可能是图像的大小 e)不要在油漆中重新加载图像(在油漆周期中没有繁重的工作!),而是在施工时加载一次
  • 顺便说一句,请学习java命名约定并遵守它们

标签: java image swing jbutton


【解决方案1】:

我之前也问过这个问题。我发现效果最好的解决方案实际上是这样做,而不是绘图。

ImageIcon icon = new ImageIcon("pathOfImageHere.png");
JButton button = new JButton(icon);

这样就将按钮设置为图像。现在我选择做的是使按钮不可见并删除所有边框。所以我接下来做了这个:

button.setOpaque(false);
button.setContentAreaFilled(false);
button.setBorderPainted(false);
button.setFocusPainted(false);

【讨论】:

  • 此外,我们可以定义不同的按钮状态图像(参见:link)。你用这个技巧的解决方案效果很好!
【解决方案2】:

首先,您应该使用ImageIO.read(new File("somefile.png")) 加载Image。请注意,如果没有指定绝对路径,则默认为 工作目录 的相对路径。如果你的 Eclipse 用完了,那就是项目文件夹。在 jar 中,它是 jar 所在的文件夹(除非另有说明)。

请参阅http://docs.oracle.com/javase/tutorial/2d/images/loadimage.html,了解如何正确加载图像(也说明如何在小程序中执行此操作)。

此外,您应该加载图像一次,然后在每次绘制迭代时重复使用它:

BufferedImage image;

public nextButton() {
    try {
        image = ImageIO.read(new File("nextButton.png"));
    } catch (IOException e) {
        e.printStackTrace();
    }
}

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawImage(image, 0, 0, null);
}

@Override
public Dimension getPreferredSize() {
    return new Dimension(image.getWidth(), image.getHeight());
}

让我知道这是否适合您(确保将您的 png 放在工作目录中!)。

【讨论】:

  • a) 不要使用 setXXSize,而是覆盖 getPreferredSize(你已经在子类化,没有理由马虎;-) b)paintComponent 覆盖是非法的,它必须实施以遵守其不透明合同
  • -1 ahhh ... 刚刚看到您的编辑,这是完全错误的:覆盖 getPref 当然 是要走的路。
  • @kleopatra 对不起,我想我错了。通过编辑修复它。我太习惯于一起使用被黑客入侵的 Swing 东西,我会牢记关于 setSize 的内容。缺少super.paintComponent 是我的一个错误,我知道这是不正确的,所以我也修复了它。
【解决方案3】:

为什么不直接使用 JButton 构造函数来获取图像?

http://www.apl.jhu.edu/~hall/java/Swing-Tutorial/Swing-Tutorial-JButton.html

【讨论】:

    猜你喜欢
    • 2010-09-05
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    • 2016-10-01
    • 1970-01-01
    相关资源
    最近更新 更多