Java-如何为JFrame设置setToolTipText [英] Java- How to set setToolTipText for JFrame
问题描述
我想将鼠标移动到使用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("'> </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屋!