2011-11-23 70 views
6

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

我想让我的按钮基于我在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)迄今为止我还不了解的其他东西。

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

非常感谢!

+0

一对夫妇的意见,或多或少无关你的问题:一)的paintComponent越权非法B)永不永远_change_特别是在吸气Ç任何东西),的setSize完成通过LayoutManager无论如何都不会影响一个理智的应用程序d)重写getPreferredSize并根据组件的内部结果返回合理的尺寸提示是正确的,这里可能是图像的大小e)将图像加载到绘画中(在绘画循环中不会有繁重的工作!),而不是在施工时加载一次 – kleopatra

+0

btw,请学习java命名约定并坚持使用它们 – kleopatra

回答

4

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

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

此外,您应该加载图像一次,然后再用它每一涂料迭代:

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工作目录! )。

+0

a)不要使用setXXSize,而要重写getPreferredSize(你已经继承了子类,没有理由马虎;-) b) paintComponent覆盖是非法的,它必须遵守其不透明合同 – kleopatra

+0

-1 ahhh ...只是看到了你的编辑,这是错误的:覆盖getPref _certainly_是要走的路。 – kleopatra

+0

@kleopatra啊对不起,我想我错了。修复它与编辑。我太习惯于一起使用黑客入侵Swing的东西,我会记住关于setSize的事情。缺少'super.paintComponent'是我的一个错误,我知道这是错误的,所以我也修正了这个错误。 – jli

5

我问这个问题早为好。我发现最好的解决方案实际上是这样做的,而不是绘图。

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

因此,将按钮设置为图像。现在我选择做的是使按钮不可见并删除所有边框。所以,我没有这下:

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

更多的,我们可以定义不同的按钮状态图像(参见:[链接](http://www.leepoint.net/notes-java/GUI/components/20bu​​ttons/23buttonicons.html))。这个技巧的解决方案非常完美! – Alexxx

相关问题