我想在使用g2D.drawRenderedImage绘制在JFrame上的图像上移动鼠标,并在鼠标指针旁边的工具提示文本中显示该像素的x,y坐标。
Graphics2D g2D = (Graphics2D)g;
g2D.drawRenderedImage...
我知道如何读取x和y,但不知道如何为JFrame设置setToolTipText。你们可以帮助我吗?我的意思是我无法像这样做:JFrame.setToolTipText !!!
由于JFrame
没有继承JComponent
,因此它没有setToolTipText
方法。尝试从JFrame
中获取JLayeredPane
并调用其提示信息方法:
getLayeredPane().setToolTipText("text");
你可以使用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);
}
}
JComponent
提供的getToolTip
方法。
您还需要使用ToolTipManager
进行注册,可以通过在组件上调用具有非null
值的setToolTipText
或使用ToolTipManager#registerComponent来实现。
更新示例
您似乎在直接渲染到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("'> </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);
}
}
}
}
JPanel
或JComponent
来渲染图像,这将使您可以访问底层的工具提示方法。 - MadProgrammernull
,那么Java无法找到您要加载的资源 - 需要花些时间诊断问题 - 通过解压缩Jar文件并检查文件是否位于预期位置来开始验证资源是否可用。 - MadProgrammer