我想要一个只显示图标(或图像,真的)的JButton。我喜欢有正常的按钮边框,以便用户确认它是一个他可以点击的按钮。此按钮应具有固定高度,但会根据其图标的宽高比调整其宽度。
是否有可以执行此操作的自定义JButton类?如果没有,我将如何实施?
编辑 BTW,我可以从外面重新调整图标,但我更喜欢按钮来执行此操作。
编辑2:对我来说,最大的问题是:何时以及如何确定和设置所需的按钮大小?缩放图像以进行绘图不是问题。
答案 0 :(得分:4)
是否有可以执行此操作的自定义JButton类?
不是我知道的。
如果没有,我将如何实施?
我会通过扩展ImageIcon
来扩展图像。
import java.awt.*;
import java.awt.event.*;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.*;
class ScaledImageIcon extends ImageIcon {
ScaledImageIcon(Image image, int height) {
super(image.getScaledInstance(-1, height, Image.SCALE_SMOOTH));
}
}
public class ScalableIcons {
public static void main(String[] args) throws Exception {
final Image img1 = ImageIO.read(
new URL("http://i.stack.imgur.com/gJmeJ.png"));
final Image img2 = ImageIO.read(
new URL("http://i.stack.imgur.com/ET1EH.png"));
Runnable r = new Runnable() {
@Override
public void run() {
JPanel gui = new JPanel(new BorderLayout(5,5));
final JLabel display = new JLabel();
display.setPreferredSize(new Dimension(410,200));
ActionListener al = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String s = e.getActionCommand();
switch (s) {
case "1":
display.setIcon(new ImageIcon(img1));
break;
case "2":
display.setIcon(new ImageIcon(img2));
break;
}
}
};
JPanel imageButtons = new JPanel(
new FlowLayout(FlowLayout.CENTER,5,5));
JButton b1 = new JButton( "1", new ScaledImageIcon(img1,40));
b1.addActionListener(al);
imageButtons.add(b1);
JButton b2 = new JButton( "2", new ScaledImageIcon(img2,40));
b2.addActionListener(al);
imageButtons.add(b2);
gui.add(imageButtons, BorderLayout.NORTH);
gui.add(display, BorderLayout.CENTER);
JOptionPane.showMessageDialog(null, gui);
}
};
// Swing GUIs should be created and updated on the EDT
// http://docs.oracle.com/javase/tutorial/uiswing/concurrency
SwingUtilities.invokeLater(r);
}
}
答案 1 :(得分:0)
不确定我完全理解用户界面或要求,但Darryl的Stretch Icon可能会帮助你。它会根据组件大小自动调整图标大小,并可选择保持宽高比。