Java swing JComponent“size”
我正在做一个项目,我需要一些自定义的swing组件。到目前为止,我已经制作了一个带有一系列图像的新按钮(Java Metal外观根本不符合我的UI)。我在这个新组件上实现了MouseListener
,这是我的问题出现的地方。我的小工具在悬停时更改图片,点击等,除了我的MouseListener
拿起鼠标进入整个GridLayout
容器,而不是进入图像。所以我有一个大约200 * 100的图像,周围的容器大约是400 * 200,并且mouseEntered
方法在它进入GridLayout
部分(甚至它的空白部分)而不是在图像上时被触发。我怎样才能让它在我悬停在图像上时才被解雇?我试着设置大小和边界以及其他属性无济于事。Java swing JComponent“size”
编辑:这是我的问题的演示。正如您所看到的(颜色非常相似),只需输入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);
}
编辑:添加代码段
我假设你的映像只包含4 'customWidget'(在一个2x2网格)的对象。
您的代码正如我所料。你的MouseListener方法响应MouseEvent的'customWidget'(不是'customWidget'中绘制的图像),它的大小占用了图像的1/4,所以它们会在进入放大区域时作出响应。该错误实际上是在您的测试程序中,因为您允许自定义按钮小部件大于图像。
如果你想要一个提供类似于你的图像的测试程序,你应该创建一个更大的网格(比如说4x4),然后只将你的按钮放在其他网格节点中。将空白组件放入空隙中。
你正在我的思路上。有没有一个布局管理器,可以很容易地在屏幕上设置一个部分,比如一个高度为110的钢筋,而不是gridlayout和flowlayout所做的所有比例材料? – Alex 2010-11-13 01:09:28
'BoxLayout'包含这些不可见的填充组件:http://download.oracle.com/javase/tutorial/uiswing/layout/box.html#filler – trashgod 2010-11-13 01:21:32
此外,如果您可以使用垃圾回收的方法,我会高度推荐使用标准方法。 :) – 2010-11-13 01:24:37
虽然我不会回答你的特定问题,我希望这有助于:
如果组件只看错也许你应该重用Swing组件和公正写一个自定义Look &感觉或主题。
这肯定有助于确保应用程序的外观是一致的,至少您正在使用正确的工具完成您想要完成的任务。
作为旁注,请注意Java带有多个Look &感觉,包括Look &感觉是为了模仿本机操作系统主题。
参见:http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
即时消息意识到外观和感觉,但它是一个团队项目,我正在与别人的设计工作,他们用玻璃外观按钮等使它变得光彩照人。所以这是决定采取的道路。无论如何,欢呼! – Alex 2010-11-13 00:35:41
作为替代方案,考虑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);
}
}
请发布一个自包含的代码示例...使您更容易看到您正在尝试做什么...并更容易找到问题... – 2010-11-13 00:16:08
'customWidget'的超类是什么?另外,你的'GridLayout容器'在哪里设置? – 2010-11-13 00:36:25
customWidget扩展了JComponent。 GridLayout正在测试程序im中设置,用于测试小部件。将提出一个图像来演示。 – Alex 2010-11-13 00:43:55