Java- How to set setToolTipText for JFrame

不羁的心 提交于 2019-12-02 09:42:29

问题


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...

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 !!!!


回答1:


you can do componentName.setToolTipText("context"); for more information, you can check http://docs.oracle.com/javase/tutorial/uiswing/components/tooltip.html lots of useful information about the Swing API

I see now you want to do it for a JFrame not a component, this works for a JFrame's title, maybe it helps

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



回答2:


Since JFrame doesn't inherit from JComponent, it doesn't have setToolTipText method. Try getting JLayeredPane from JFrame and invoke it's tooltip method:

getLayeredPane().setToolTipText("text");



回答3:


You need to take advantage of the getToolTip methods provided by JComponent

  • getToolTipText(MouseEvent)
  • getToolTipTextLocation(MouseEvent)

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

Updated with example

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.

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


来源:https://stackoverflow.com/questions/17497757/java-how-to-set-settooltiptext-for-jframe

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!