2010-11-13 102 views
3

我正在做一个项目,我需要一些自定义的swing组件。到目前为止,我已经制作了一个带有一系列图像的新按钮(Java Metal外观根本不符合我的UI)。我在这个新组件上实现了MouseListener,这是我的问题出现的地方。我的小工具在悬停时更改图片,点击等,除了我的MouseListener拿起鼠标进入整个GridLayout容器,而不是进入图像。所以我有一个大约200 * 100的图像,周围的容器大约是400 * 200,并且mouseEntered方法在它进入GridLayout部分(甚至它的空白部分)而不是在图像上时被触发。我怎样才能让它在我悬停在图像上时才被解雇?我试着设置大小和边界以及其他属性无济于事。Java swing JComponent“size”

编辑:这是我的问题的演示。正如您所看到的(颜色非常相似),只需输入GridlLayout的部分即可突出显示右下角的按钮。我只想让它突出显示实际图像,而不是GridLayout部分。

alt text

我将不添加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); 

} 

编辑:添加代码段

+0

请发布一个自包含的代码示例...使您更容易看到您正在尝试做什么...并更容易找到问题... – 2010-11-13 00:16:08

+0

'customWidget'的超类是什么?另外,你的'GridLayout容器'在哪里设置? – 2010-11-13 00:36:25

+0

customWidget扩展了JComponent。 GridLayout正在测试程序im中设置,用于测试小部件。将提出一个图像来演示。 – Alex 2010-11-13 00:43:55

回答

3

我假设你的映像只包含4 'customWidget'(在一个2x2网格)的对象。

您的代码正如我所料。你的MouseListener方法响应MouseEvent的'customWidget'(不是'customWidget'中绘制的图像),它的大小占用了图像的1/4,所以它们会在进入放大区域时作出响应。该错误实际上是在您的测试程序中,因为您允许自定义按钮小部件大于图像。

如果你想要一个提供类似于你的图像的测试程序,你应该创建一个更大的网格(比如说4x4),然后只将你的按钮放在其他网格节点中。将空白组件放入空隙中。

+0

你正在我的思路上。有没有一个布局管理器,可以很容易地在屏幕上设置一个部分,比如一个高度为110的钢筋,而不是gridlayout和flowlayout所做的所有比例材料? – Alex 2010-11-13 01:09:28

+0

'BoxLayout'包含这些不可见的填充组件:http://download.oracle.com/javase/tutorial/uiswing/layout/box.html#filler – trashgod 2010-11-13 01:21:32

+0

此外,如果您可以使用垃圾回收的方法,我会高度推荐使用标准方法。 :) – 2010-11-13 01:24:37

0

虽然我不会回答你的特定问题,我希望这有助于:

如果组件只看错也许你应该重用Swing组件和公正写一个自定义Look &感觉或主题。

这肯定有助于确保应用程序的外观是一致的,至少您正在使用正确的工具完成您想要完成的任务。

作为旁注,请注意Java带有多个Look &感觉,包括Look &感觉是为了模仿本机操作系统主题。

参见:http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html

+0

即时消息意识到外观和感觉,但它是一个团队项目,我正在与别人的设计工作,他们用玻璃外观按钮等使它变得光彩照人。所以这是决定采取的道路。无论如何,欢呼! – Alex 2010-11-13 00:35:41

8

作为替代方案,考虑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); 
    } 
}