Java swing JComponent“大小”
我正在做一个项目,我需要一些自定义摆动组件。到目前为止,我已经制作了一个带有一系列图像的新按钮(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);
}
编辑:添加代码部分
I'm doing a project where i need some custom swing components. So far I have made a new button with a series of images (the Java Metal look doesn't fit with my UI at all). Ive implemented MouseListener
on this new component and this is where my problem arises. My widget changes image on hover, click etc except my MouseListener
picks up mouse entry into a the entire GridLayout
container instead of into the image. So I have an image of about 200*100 and the surrounding container is about 400*200 and the mouseEntered
method is fired when it enters that GridLayout
section (even blank space parts of it) instead of over the image. How can I make it so that it is only fired when I hover over the image? Ive tried setting size and bounds and other attributes to no avail.
EDIT: Here's a demonstration of my issue. As you can see (sort of, colors are very similar) the bottom right button is highlighted just by entering its section of the GridlLayout
. I only want it highlighted when I'm over the image actual, not the GridLayout
section.
I Won't add the MouseListener
methods because they just involve switching the displayed image.
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);
}
EDIT: added code section
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
作为替代方案,请考虑按钮 API ,其中包括方法
setRolloverIcon()
“使按钮在光标经过时显示指定的图标。”附录:对于示例,
As an alternative, consider the The Button API, which includes the method
setRolloverIcon()
"to make the button display the specified icon when the cursor passes over it."Addendum: For example,
我假设您的图像仅包含 4 个“customWidget”对象(在 2x2 网格中)。
您的代码正在按我的预期工作。您的 MouseListener 方法正在响应“customWidget”(不是“customWidget”中绘制的图像)的 MouseEvents,其大小占据图像的 1/4,因此当图像进入放大区域时它们将做出响应。该错误实际上出现在您的测试程序中,因为您允许自定义按钮小部件大于图像。
如果您想要一个提供与您的图像相似的图像的测试程序,您应该创建一个更大的网格(例如 4x4),然后仅将按钮放置在每个其他网格节点中。将空组件放入间隙中。
I assume your image contains ONLY 4 'customWidget' objects (in a 2x2 grid).
Your code is working as I would expect. Your MouseListener methods are responding to MouseEvents for 'customWidget' (not the image drawn in 'customWidget'), which is sized to take up 1/4 of the image, so they will respond when it enters the enlarged area. The error is actually in your Test program, because you are allowing the custom button widget to be larger than the image.
If you want a Test program that provides an image similar to yours, you should create a larger grid (say 4x4), and then only place your buttons in every other grid node. Place an empty component into the gaps.
虽然我不会回答您的特定问题,但我希望这会有所帮助:
如果组件看起来不正确,也许您应该重用 Swing 组件并编写自定义的外观或主题。
这肯定有助于确保应用程序的外观保持一致,并且至少您正在使用正确的工具来完成您想要完成的任务。
作为旁注,请注意 Java 附带多种外观和感觉,包括模仿本机操作系统主题的外观和感觉。
请参阅:http://download.oracle.com/javase/tutorial/uiswing /lookandfeel/plaf.html
Although I won't answer to your particular question, I hope this helps:
If the components just look wrong maybe you should reuse Swing components and just write a custom Look&Feel or theme.
It would certainly help ensuring the look of the application is consistent and at least you are using the right tool for the task you want to accomplish.
As a sidenote, be aware that Java comes with multiple Look&feels, including Look&Feels made to mimic the native OS theme.
See: http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html