在我的JavaFX应用程序中,我有一个包含多列的TableView
,其中一列以图形形式显示数据。为此,我创建了一个CanvasCell
对象,该对象创建并管理自己的Canvas
来处理绘图。绘图部分工作正常。
现在我想把Tooltips
放在Canvas
/Cell
中的一些区域上。每个Cell
可能有多个Tooltips
(这阻止了我在Cell
级别添加Tooltip
),它们应该只在图形的特定区域触发。然而,我根本没办法让它正常工作。我似乎不能很好地理解显示节点层次结构的交互(读作“根本不能”),无法将Tooltip
放在它实际工作的任何地方。
JavaFX的文档很少,所以我尝试过的所有搜索结果都是空白的。有没有人知道怎么做这类事情,或者我是不是应该暂时把它写成“没有选择”。
为了获取信息,CanvasCell
在updateItem()
上调用扩展Canvas
对象内的draw()
函数。我试图在其中创建Tooltip
的代码位于draw()
函数内部,如下所示:
Rectangle rect = new Rectangle(leftVal, topVal, width, height);
gc.fillRect(rect.getX(), rect.getY(), rect.getWidth(), rect.getHeight());
Tooltip tooltip = new Tooltip("Tooltip Text");
Tooltip.install(rect, tooltip);
但这些代码更多的是出于希望而编写,并且不会在界面中生成任何有用的东西。
如果有人能为我指明正确的方向,我将不胜感激。
发布于 2018-12-15 02:59:42
如果您不需要here所示的计时控件,您可以简单地将Tooltip
安装在封闭的Canvas
上,并利用Shape::contains
来调节文本,如下所示。
node.setOnMouseMoved(e -> {
tooltips.forEach((color, bounds) -> {
if (bounds.contains(e.getX(), e.getY())) {
tooltip.setText(color.toString());
}
});
});
正如here所建议的,Java9和更高版本通过属性showDelay
和showDuration
提供了对Tooltip
计时的控制。
类似的方法如Swing的here所示。
import javafx.application.Application;
import javafx.scene.shape.Rectangle;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.paint.Color;
import javafx.scene.control.Tooltip;
import javafx.scene.layout.StackPane;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.stage.Stage;
import java.util.HashMap;
import java.util.Map;
/**
* @see https://stackoverflow.com/a/53785468/230513
* @see https://stackoverflow.com/a/53753537/230513
*/
public class CanvasTooltipDemo extends Application {
@Override
public void start(Stage stage) throws Exception {
StackPane root = new StackPane();
Scene sc = new Scene(root, 400, 400);
stage.setScene(sc);
Canvas canvas = new Canvas(200, 200);
root.getChildren().add(canvas);
Map<Color, Rectangle> tooltips = new HashMap<>();
tooltips.put(Color.RED, new Rectangle(0, 0, 100, 100));
tooltips.put(Color.BLUE, new Rectangle(100, 0, 100, 100));
tooltips.put(Color.YELLOW, new Rectangle(0, 100, 100, 100));
tooltips.put(Color.GREEN, new Rectangle(100, 100, 100, 100));
GraphicsContext gc = canvas.getGraphicsContext2D();
tooltips.forEach((color, bounds) -> {
gc.setFill(color);
gc.fillRect(bounds.getX(), bounds.getY(), bounds.getWidth(), bounds.getHeight());
});
setToolTips(canvas, tooltips);
stage.show();
}
private void setToolTips(Node node, Map<Color, Rectangle> tooltips) {
Tooltip tooltip = new Tooltip();
Tooltip.install(node, tooltip);
node.setOnMouseMoved(e -> {
tooltips.forEach((color, bounds) -> {
if (bounds.contains(e.getX(), e.getY())) {
tooltip.setText(color.toString());
}
});
});
node.setOnMouseExited(e -> {
tooltip.hide();
});
}
public static void main(String[] args) {
Application.launch(args);
}
}
https://stackoverflow.com/questions/53740820
复制相似问题