Java-如何为JFrame设置setToolTipText [英] Java- How to set setToolTipText for JFrame

查看:135
本文介绍了Java-如何为JFrame设置setToolTipText的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想将鼠标移动到使用g2D.drawRenderedImag在JFrame上绘制的图像上,并在鼠标光标旁边的工具提示文本处显示该像素的x,y。即:

I would like to move the mouse over an image which was plotted on a JFrame using g2D.drawRenderedImag and display the x, y of that pixel at the tooltip text right next to mouse cursor. i.e:

Graphics2D g2D = (Graphics2D)g;
g2D.drawRenderedImage...

我知道怎么读x,y但是不要我不知道如何为JFrame设置setToolTipText。你能帮帮我吗?我的意思是我不能这样做
JFrame.setToolTipText !!!!

I know how to read the x,y but don't know how to set setToolTipText for a JFrame. Can you guys help me please? I mean I can not do like this JFrame.setToolTipText !!!!

推荐答案

您需要利用 JComponent

  • getToolTipText(MouseEvent)
  • getToolTipTextLocation(MouseEvent)

您还需要通过调用 setToolTipText 来注册 ToolTipManager 您的组件具有非 null 值,或使用 ToolTipManager #registerComponent

You will also need to register with the ToolTipManager, either by calling setToolTipText on your component with a non null value, or using ToolTipManager#registerComponent

更新为示例

你似乎在说你直接渲染到 JFrame ,可能是通过覆盖 paint 方法。这是非常不推荐的,除了任何东西,顶级容器不是双缓冲的,所以当你更新屏幕内容时,你最终会有闪烁的可能性。

You seem to be saying that you're rendering directly to a JFrame, presumably by overriding the paint method. This is highly unrecommended, apart from anything, top level containers aren't double buffered, so you're going to end up with the possibility of flickering when you update the screen contents.

使用像 JPanel 这样的东西要好得多,这是双缓冲的,并且有为你工作的好处(当涉及显示工具提示时)。它还使您的组件更具便携性和可重复使用

Much better to use something like JPanel, which is double buffered AND has the benefit of doing the work for you (when it comes to something like displaying tool tips). It also makes your component more portable and re-usable

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.ToolTipManager;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestToolTipImage {

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

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

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new ImagePane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }

        });
    }

    public class ImagePane extends JPanel {

        private BufferedImage img;

        public ImagePane() {
            try {
                img = ImageIO.read(getClass().getResource("/TestToolTipImage.jpg"));
            } catch (IOException ex) {
                ex.printStackTrace();
            }
            ToolTipManager.sharedInstance().registerComponent(this);
        }

        @Override
        public Dimension getPreferredSize() {
            return img == null ? super.getPreferredSize() : new Dimension(img.getWidth(), img.getHeight());
        }

        @Override
        public String getToolTipText(MouseEvent event) {

            String text = super.getToolTipText(event);

            if (img != null) {

                int xOffset = (getWidth() - img.getWidth()) / 2;
                int yOffset = (getHeight() - img.getHeight()) / 2;
                Rectangle bounds = new Rectangle(xOffset, yOffset, img.getWidth(), img.getHeight());

                if (bounds.contains(event.getPoint())) {

                    int x = event.getPoint().x - xOffset;
                    int y = event.getPoint().y - yOffset;
                    int rgb = img.getRGB(x, y);                    
                    String hex = Integer.toHexString(rgb & 0xffffff);

                    StringBuilder sb = new StringBuilder(128);
                    sb.append("<html><table><tr><td>Pixel at ").
                                    append(x).append("x").append(y).
                                    append("</td>");
                    sb.append("<td bgcolor='#").append(hex).append("'>&nbsp;</td>");
                    sb.append("</tr></table><html>");

                    System.out.println(sb.toString());
                    text = sb.toString();

                }

            }

            return text;

        }

        @Override
        public Point getToolTipLocation(MouseEvent event) {
            return event.getPoint();
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            if (img != null) {
                int x = (getWidth() - img.getWidth()) / 2;
                int y = (getHeight() - img.getHeight()) / 2;
                g.drawImage(img, x, y, this);
            }
        }
    }
}

这篇关于Java-如何为JFrame设置setToolTipText的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆