我正在做一个需要一些自定义 Swing 组件的项目。到目前为止,我已经制作了一个带有一系列图像的新按钮(Java Metal 外观根本不适合我的 UI)。我已经在这个新组件上实现了 MouseListener
,这就是我的问题所在。除了我的 MouseListener
将鼠标进入整个 GridLayout
容器而不是图像之外,我的小部件会在悬停、单击等时更改图像。所以我有一个大约 200*100 的图像,周围的容器大约是 400*200,当它进入 GridLayout
部分(甚至是空白部分)时, mouseEntered
方法被触发它)而不是在图像上。我怎样才能让它只在我将鼠标悬停在图像上时触发?我尝试设置大小和边界以及其他属性无济于事。
编辑:这是我的问题的演示。如您所见(某种程度上,颜色非常相似)右下角的按钮通过输入其在 GridlLayout
中的部分而突出显示。我只希望它在实际图像上突出显示,而不是 GridLayout
部分。
我不会添加 MouseListener
方法,因为它们只涉及切换显示的图像。
public customWidget()
{
this.setLayout(new FlowLayout());
try {
imageDef=ImageIO.read(new File("/home/x101/Desktop/buttonDef.png"));
imageClick=ImageIO.read(new File("/home/x101/Desktop/buttonClick.png"));
imageHover=ImageIO.read(new File("/home/x101/Desktop/buttonHover.png"));
current=imageDef;
} catch (IOException e)
{
e.printStackTrace();
}
this.addMouseListener(this);
}
protected void paintComponent(Graphics g)
{
super.paintComponents(g);
g.drawImage(current, 0, 0, current.getWidth(), current.getHeight(), null);
}
编辑:添加代码部分
最佳答案
作为替代方案,请考虑 The Button API ,其中包括方法 setRolloverIcon()
"使按钮在光标经过时显示指定的图标。"
附录:example ,
import java.net.MalformedURLException;
import java.net.URL;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class ButtonIconTest {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
private static void createAndShowGui() {
String base = "http://download.oracle.com/"
+ "javase/tutorial/uiswing/examples/components/"
+ "RadioButtonDemoProject/src/components/images/";
ImageIcon dog = null;
ImageIcon pig = null;
try {
dog = new ImageIcon(new URL(base + "Dog.gif"));
pig = new ImageIcon(new URL(base + "Pig.gif"));
} catch (MalformedURLException ex) {
ex.printStackTrace(System.err);
return;
}
JFrame frame = new JFrame("Rollover Test");
JPanel panel = new JPanel();
panel.add(new JLabel(dog));
panel.add(new JLabel(pig));
JButton button = new JButton(dog);
button.setRolloverIcon(pig);
panel.add(button);
frame.add(panel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
关于Java Swing JComponent "size",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4170134/