首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何将工具提示添加到JavaFX画布的矩形区域

如何将工具提示添加到JavaFX画布的矩形区域
EN

Stack Overflow用户
提问于 2018-12-12 18:20:46
回答 1查看 1.7K关注 0票数 1

在我的JavaFX应用程序中,我有一个包含多列的TableView,其中一列以图形形式显示数据。为此,我创建了一个CanvasCell对象,该对象创建并管理自己的Canvas来处理绘图。绘图部分工作正常。

现在我想把Tooltips放在Canvas/Cell中的一些区域上。每个Cell可能有多个Tooltips (这阻止了我在Cell级别添加Tooltip ),它们应该只在图形的特定区域触发。然而,我根本没办法让它正常工作。我似乎不能很好地理解显示节点层次结构的交互(读作“根本不能”),无法将Tooltip放在它实际工作的任何地方。

JavaFX的文档很少,所以我尝试过的所有搜索结果都是空白的。有没有人知道怎么做这类事情,或者我是不是应该暂时把它写成“没有选择”。

为了获取信息,CanvasCellupdateItem()上调用扩展Canvas对象内的draw()函数。我试图在其中创建Tooltip的代码位于draw()函数内部,如下所示:

代码语言:javascript
复制
    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);

但这些代码更多的是出于希望而编写,并且不会在界面中生成任何有用的东西。

如果有人能为我指明正确的方向,我将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-15 02:59:42

如果您不需要here所示的计时控件,您可以简单地将Tooltip安装在封闭的Canvas上,并利用Shape::contains来调节文本,如下所示。

代码语言:javascript
复制
node.setOnMouseMoved(e -> {
    tooltips.forEach((color, bounds) -> {
        if (bounds.contains(e.getX(), e.getY())) {
            tooltip.setText(color.toString());
        }
    });
});

正如here所建议的,Java9和更高版本通过属性showDelayshowDuration提供了对Tooltip计时的控制。

类似的方法如Swing的here所示。

代码语言:javascript
复制
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);
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53740820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档