3

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

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

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

4

3 回答 3

3

由于JFrame不继承自JComponent,因此它没有setToolTipText方法。尝试JLayeredPan从中获取 eJFrame并调用它的工具提示方法:

getLayeredPane().setToolTipText("text");
于 2013-07-05T23:19:52.443 回答
2

你可以做 componentName.setToolTipText("context"); 有关更多信息,您可以查看http://docs.oracle.com/javase/tutorial/uiswing/components/tooltip.html很多关于 Swing API 的有用信息

我现在看到你想为 JFrame 而不是组件做这件事,这适用于 JFrame 的标题,也许它有帮助

 import darrylbu.util.SwingUtils;
import javax.swing.*;

public class FrameTitleToolTip {

   public static void main(String[] args) {
      JFrame.setDefaultLookAndFeelDecorated(true);
      SwingUtilities.invokeLater(new Runnable() {

         @Override
         public void run() {
            new FrameTitleToolTip().makeUI();
         }
      });
   }

   public void makeUI() {
      JFrame frame = new JFrame();
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setSize(400, 400);
      for (JComponent component : SwingUtils.getDescendantsOfType(JComponent.class,
            frame)) {
         if (component.getClass().getName().contains("MetalTitlePane")) {
            component.setToolTipText("Tooltip for frame title bar");
            break;
         }
      }
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }
}
于 2013-07-05T22:48:07.190 回答
2

您需要利用getToolTip提供的方法JComponent

您还需要通过使用非值ToolTipManager调用组件或使用ToolTipManager#registerComponent来注册setToolTipTextnull

更新了示例

您似乎是在说您正在直接渲染到 a JFrame,大概是通过覆盖该paint方法。这是非常不推荐的,除此之外,顶级容器不是双缓冲的,因此当您更新屏幕内容时,您最终可能会出现闪烁。

使用类似的东西要好得多JPanel,它是双缓冲的,并且可以为您完成工作(当涉及到显示工具提示之类的东西时)。它还使您的组件更便携和可重复使用

在此处输入图像描述

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);
            }
        }
    }
}
于 2013-07-05T22:52:21.833 回答