【问题标题】:Rollover on JLabel which consists of image within grid layout?在由网格布局中的图像组成的 JLabel 上翻转?
【发布时间】:2015-11-13 14:45:23
【问题描述】:

我有一个带有网格布局和两个 JLabel 图像的代码。每次滚动每张图像时,我都不希望出现一些文本。当图像不是 JLabel 时,我很熟悉如何执行此操作,但是已经在整个网络上搜索以找到如何在它是未命名的 JLabel 时执行此操作。我不想拥有的两张带有单独滚动消息的图像是:

ImageIcon(getClass().getResource("giraffe.png"));
            Icon windows = new ImageIcon(getClass().getResource("windows.png"));

这是我的代码:

    public class giraffe implements ActionListener{


        public void actionPerformed(ActionEvent event) {


            JOptionPane.showMessageDialog(null,
                    "Press ok, and see the amazing giraffe outside a window!");

            JDialog giraffewindow = new JDialog();
            Icon giraffe = new ImageIcon(getClass().getResource("giraffe.png"));
            Icon windows = new ImageIcon(getClass().getResource("windows.png"));

            giraffewindow.setLayout(new GridLayout(1, 2, 0, 0));
            giraffewindow.add(new JLabel (windows));
            giraffewindow.add(new JLabel (giraffe));


            giraffewindow.pack();
            giraffewindow.setTitle("GIRAFFE!");
            giraffewindow.setVisible(true);
            giraffewindow.setDefaultCloseOperation(DISPOSE_ON_CLOSE);

            /*
             * I want to have a rollover on EACH IMAGE so that when they rollover the image you see different text.
             */

        }

非常感谢您花时间阅读本文,非常感谢您为帮助其他程序员所做的努力!

【问题讨论】:

  • 我猜你需要MouseListener 来跟踪mouseEnteredmouseExited 事件并相应地更改标签的文本。从How to Write a Mouse Listener开始
  • I am familiar on how to do this when the image is not a JLabel - 你会怎么做?
  • @MadProgrammer 他不是必须创建自己的扩展 JLabel 的类,然后从那里实现 MouseListener 吗?
  • 我会使用 .setRolloverIcon 之类的东西...虽然那将是一个翻转图像,所以我会使用 .setToolTipText 之类的东西。虽然我在这种情况下完全迷失了。
  • @MadProgrammer 这将是我解决他问题的方式,不是最好的吗?

标签: java swing jlabel


【解决方案1】:

首先查看How to Write a Mouse Listener

基本上,您希望将MouseListener 附加到每个标签并监控mouseEnteredmouseExited 事件,根据您的要求更新标签状态

import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            try {
                JLabel left = new JLabel(new ImageIcon(ImageIO.read(...))));
                left.setVerticalTextPosition(JLabel.BOTTOM);
                left.setHorizontalTextPosition(JLabel.CENTER);
                left.setHorizontalAlignment(JLabel.CENTER);
                left.setVerticalAlignment(JLabel.CENTER);
                left.setText(" ");
                JLabel right = new JLabel(new ImageIcon(ImageIO.read(...))));
                right.setVerticalTextPosition(JLabel.BOTTOM);
                right.setHorizontalTextPosition(JLabel.CENTER);
                right.setHorizontalAlignment(JLabel.CENTER);
                right.setVerticalAlignment(JLabel.CENTER);
                right.setText(" ");

                setLayout(new GridLayout(1, 2));

                add(left);
                add(right);

                left.addMouseListener(new MouseAdapter() {
                    @Override
                    public void mouseEntered(MouseEvent e) {
                        left.setText("I'm on the left");
                    }

                    @Override
                    public void mouseExited(MouseEvent e) {
                        left.setText(" ");
                    }
                });
                right.addMouseListener(new MouseAdapter() {
                    @Override
                    public void mouseEntered(MouseEvent e) {
                        right.setText("I'm on the right");
                    }

                    @Override
                    public void mouseExited(MouseEvent e) {
                        right.setText(" ");
                    }
                });
            } catch (IOException exp) {
                exp.printStackTrace();
            }
        }

    }

}

您可能还想看看Reading/Loading an Image

【讨论】:

  • 非常感谢!出于好奇,是否可以根据访问鼠标侦听器的次数让鼠标侦听器具有不同的输出?例如,如果我将鼠标悬停在某个显示“一次”的东西上,如果我将鼠标悬停在它上面两次,它会显示“两次”?
  • 是的,取决于您如何设置鼠标侦听器,基本上您只需要一个递增的计数器。如果您使用的是单个侦听器,那么您可以使用某种类型的 Map
【解决方案2】:

您还可以通过执行以下操作来创建通用侦听器:

ImageIcon giraffe = new ImageIcon(...);
giraffe.setDescription("Giraffe Description");

那么你的听众可能看起来像:

MouseListener ml = new MouseAdapter()
{
    @Override
    public void mouseEntered(MouseEvent e)
    {
        JLabel label = (JLabel)e.getSource();
        ImageIcon icon = (ImageIcon)label;
        label.setText( icon.getDescription() );
    }

    @Override
    public void mouseExited(MouseEvent e)
    {
        JLabel label = (JLabel)e.getSource();
        label.setText(" ");
    }
}

然后将监听器添加到标签中:

JLabel giraffeLabel = new JLabel( giraffe );
giraffe.addMouseListener( ml );

相同的侦听器可用于您的其他 JLabel,因为事件代码知道组件生成事件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-28
    • 2016-08-19
    • 2013-07-12
    • 2020-11-22
    • 2014-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多