【问题标题】:Java swing JComponent "size"Java swing JComponent“大小”
【发布时间】:2011-05-09 09:08:11
【问题描述】:

我正在做一个需要一些自定义摆动组件的项目。到目前为止,我已经制作了一个带有一系列图像的新按钮(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);

}

编辑:添加代码部分

【问题讨论】:

  • 请发布一个独立的代码示例...让您更容易看到您正在尝试做什么...并且更容易找到问题...
  • 'customWidget' 的超类是什么?另外,您的“GridLayout 容器”在哪里设置?
  • customWidget 扩展了 JComponent。 GridLayout 正在用于测试小部件的测试程序中设置。将放一张图片来演示。

标签: java user-interface swing jcomponent mouselistener


【解决方案1】:

虽然我不会回答你的具体问题,但我希望这会有所帮助:

如果组件看起来不对,也许你应该重用 Swing 组件并编写自定义外观或主题。

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

作为旁注,请注意 Java 带有多种外观,包括模仿原生操作系统主题的外观。

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

【讨论】:

  • 我知道外观和感觉,但它是一个团队项目,我正在为别人的设计工作,他们用玻璃外观按钮等让这一切变得闪亮。所以这是我决定走的路。无论如何都欢呼!
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    我假设您的图像仅包含 4 个“customWidget”对象(在 2x2 网格中)。

    您的代码运行正常。您的 MouseListener 方法正在响应“customWidget”(不是在“customWidget”中绘制的图像)的 MouseEvents,它的大小占图像的 1/4,因此当它进入放大区域时它们会响应。错误实际上是在您的测试程序中,因为您允许自定义按钮小部件大于图像。

    如果您想要一个提供与您的图像相似的图像的测试程序,您应该创建一个更大的网格(例如 4x4),然后只将您的按钮放置在每个其他网格节点中。将一个空组件放入间隙中。

    【讨论】:

    • 你正好在我的思路上。有没有一个布局管理器可以很容易地在屏幕上设置一个部分,比如一个高度为 110 的条,而不是 gridlayout 和 flowlayout 所做的所有比例的东西?
    • BoxLayout 包括这些不可见的填充组件:download.oracle.com/javase/tutorial/uiswing/layout/…
    • 另外,如果你可以使用trashgod的方法,我强烈推荐使用标准方法。 :)
    • MiGLayout 可以做任何事情(不,这不是玩笑,到目前为止我还没有想出 MiGLayout 做不到的东西。而且我的要求有时非常花哨...... )!
    猜你喜欢
    • 2013-10-07
    • 1970-01-01
    • 2013-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多