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

时间:2016-01-27 14:56:27

标签: java swing tooltip jlabel

所以我正在开发一些可以在屏幕上找到Jlabels位置的东西,这样我就可以使用这些位置在这些位置生成数据,具体取决于它的点类型。

为了跟踪特定点,我已将重要标签的工具提示设置为特定文本,以便我可以将它们添加到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;
    }
}

Tooltip showing on JPanel

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

1 个答案:

答案 0 :(得分:0)

我建议你创建一个扩展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;
    }
}

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