JLabel getToolTipText() 不返回已设置的工具提示

JLabel getToolTipText() not returning tooltips that have been set

所以我正在研究可以在屏幕上找到 Jlabel 位置的东西,这样我就可以使用这些位置在这些点生成数据,具体取决于它是什么类型的点。

为了跟踪特定点,我将重要标签的工具提示设置为特定文本,以便我可以将它们添加到 Map<String, Rectangle>。矩形将给出它在屏幕上的位置,以及标签的大小。这将用于为我的数据点生成定位。

现在的问题是我没有得到我使用 JLabel 上的 getToolTipText() 设置的任何字符串。

public Map<String, Rectangle> positions() {        
    Map<String, Rectangle> ioPoints = new HashMap<>();
    return positions(mainPanel, ioPoints);
}

// Runs through each component starting from the mainPanel which contains everything
// Only labels have tooltips
public Map<String, Rectangle> positions(Container p1, Map<String, Rectangle> ioPoints) {

    for (Component p : p1.getComponents()) {

        if (p instanceof JLabel) {

            try {

                if (((JLabel) p).getToolTipText() != null) {
                    // Never hit at all???
                    System.out.println("Has a tooltip:" + ((JLabel) p).getToolTipText());
                    Rectangle r = p.getBounds();
                    Component par = p;
                    while (par.getParent() != mainPanel) {
                        par = par.getParent();
                    }
                    r = SwingUtilities.convertRectangle(par, r, mainPanel);
                    //Point spot = ((JLabel) p).getLocation();
                    ((JLabel) p).setText("x=" + r.getX() + ", y=" + r.getY());
                    Rectangle oldRect = ioPoints.put(((JLabel) p).getToolTipText(), r);
                    if (oldRect != null) {
                        System.out.println("Replaced " + ((JLabel) p).getToolTipText()
                                + ".\nOld rectangle " + oldRect.toString()
                                + "\nNew rectangle: " + r.toString());
                    }
                    //System.out.println("Position: " + spot.toString() + "\tr: " + r.toString());
                }
            } catch (NullPointerException | IllegalComponentStateException e) {
                System.out.println("Error with " + ((JLabel) p).getName());
            }
        } else {
            if (p instanceof JPanel) {
                return positions((Container) p, ioPoints);
            }
        }
    }

    return ioPoints;

}

设置工具提示的示例代码。

tooltip = new String[]{"Comp Amps Temp " + rack.getName() + " `%sgname` `%compname`"};

for (int i = 0; i < numSg; i++) {
    for (int j = 0; j < comp[i]; j++) {
        label = new JLabel("");
        label.setToolTipText(tooltip[0]
                .replace("`%sgname`", rack.getSuctionGroupNameIndex(i))
                .replace("`%compname`", rack.getSuctionGroupIndex(i).getCompressorNameIndex(j)));
        label.setFont(font);
        label.setOpaque(true);
        label.setBorder(border);
        label.setBackground(Colours.BlueLight.getCol());
        panel.add(label, c);
        c.gridx += 1;
    }
}

为什么 jlabel.getToolTipText(); 不会给我明确设置的工具提示的任何值。

我建议您创建一个 class 来扩展 JLabel,如下所示:

public class ToolTippedJLabelOrWhateverYouWantToCallIt extends JLabel {
    String tooltip = null;
    @Override
    public void setToolTipText(String text) {
        tooltip = text;
        super.setToolTipText(text);
    }
    @Override
    public String getToolTipText() {
        return tooltip;
    }
}

可能还有另一种获取工具提示文本的方法,但这只是一种简单的方法。