Java- 如何为JFrame设置setToolTipText

3

我想在使用g2D.drawRenderedImage绘制在JFrame上的图像上移动鼠标,并在鼠标指针旁边的工具提示文本中显示该像素的x,y坐标。

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

我知道如何读取x和y,但不知道如何为JFrame设置setToolTipText。你们可以帮助我吗?我的意思是我无法像这样做:JFrame.setToolTipText !!!

3个回答

4

由于JFrame没有继承JComponent,因此它没有setToolTipText方法。尝试从JFrame中获取JLayeredPane并调用其提示信息方法:

getLayeredPane().setToolTipText("text");

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);
   }
}

darrylbu.util.SwingUtils ?? - 3xCh1_23

2
您需要利用JComponent提供的getToolTip方法。 您还需要使用ToolTipManager进行注册,可以通过在组件上调用具有非null值的setToolTipText或使用ToolTipManager#registerComponent来实现。 更新示例 您似乎在直接渲染到JFrame,可能是通过覆盖paint方法来实现。这是非常不推荐的,因为顶级容器没有双缓冲,所以在更新屏幕内容时可能会出现闪烁的情况。
更好的方法是使用JPanel等组件,它是双缓冲的,并且在显示工具提示方面也非常有用。它还使您的组件更具可移植性和可重用性。 enter image description here
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);
            }
        }
    }
}

关于获取xy位置没有问题,我只是不知道如何在JFrame中激活工具提示,如果是JPanel,我会使用JPanel.setToolTipText(..但我不知道如何在JFrame中实现它。 - C graphics
1
因此,您可以使用JPanelJComponent来渲染图像,这将使您可以访问底层的工具提示方法。 - MadProgrammer
即使在java.desktop/javax.imageio.ImageIO.read(ImageIO.java:1400)提供了完整路径,仍然出现异常。线程"AWT-EventQueue-0"中的java.lang.IllegalArgumentException: input == null! - 3xCh1_23
如果输入为null,那么Java无法找到您要加载的资源 - 需要花些时间诊断问题 - 通过解压缩Jar文件并检查文件是否位于预期位置来开始验证资源是否可用。 - MadProgrammer
@DamirOlejar 哦,顺便说一下,如果你正在使用我的示例,我正在使用存储在Jar根位置的自己的图像。 - MadProgrammer
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接