问题
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("'> </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