Java Swing JComponent "size"

标签 java user-interface swing jcomponent mouselistener

我正在做一个需要一些自定义 Swing 组件的项目。到目前为止,我已经制作了一个带有一系列图像的新按钮(Java Metal 外观根本不适合我的 UI)。我已经在这个新组件上实现了 MouseListener,这就是我的问题所在。除了我的 MouseListener 将鼠标进入整个 GridLayout 容器而不是图像之外,我的小部件会在悬停、单击等时更改图像。所以我有一个大约 200*100 的图像,周围的容器大约是 400*200,当它进入 GridLayout 部分(甚至是空白部分)时, mouseEntered 方法被触发它)而不是在图像上。我怎样才能让它只在我将鼠标悬停在图像上时触发?我尝试设置大小和边界以及其他属性无济于事。

编辑:这是我的问题的演示。如您所见(某种程度上,颜色非常相似)右下角的按钮通过输入其在 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);

}

编辑:添加代码部分

最佳答案

作为替代方案,请考虑 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/

相关文章:

java - 解释器的访问者模式 - 基于实例类型调用方法

java - 真的有人用 POI 阅读过 .doc 文件并用它创建了一个 iText 文档吗?

java - 谷歌应用程序中的rmi错误

python - 使用 Python 创建可直接执行的跨平台 GUI 应用程序

opencv - 使用OpenCV构建UI

java - 我应该在我的主要方法中添加什么

java - 如何取消选择 JButton

java - 我可以使用逻辑或运算符来测试 if 语句中的两个条件吗?

java - 如何每 10 秒更新一次 JFreeChart TimeSeries 图表?

java - 如何制作HQL查询对象而不是db?