隐藏JLabel工具提示文本

时间:2015-04-12 15:58:30

标签: java swing tooltip jlabel

我正在向JLabel添加JPanel个对象。每个标签都有一个不同的工具提示文本,我用它来识别每个标签后,问题是工具提示总是在悬停时显示,我需要它始终被隐藏。

每个标签都有不同的图像图标,这就是我无法使用标签文字的原因。

我在标签API上找不到任何关于某些功能的文档,例如.hidetooltip

修改

JLabel上的许多GridLayout个对象中的每一个都拥有Image。我需要知道每个图像的行和列。

3 个答案:

答案 0 :(得分:1)

将工具提示文本隐藏为null

myComponent.setToolTipText(null);

这在API for this method:“param - 要显示的字符串中描述;如果文本为null,则此组件的工具提示已关闭”

编辑:为了回答您在其中一条评论中描述的实际问题,有多种方式将关联信息与JLabel相关联。您可以a)扩展类并保留定义网格值的实例变量b)使用JLabel的Map键和行/列的值c)使用JLabel的名称

答案 1 :(得分:1)

  

JLabel上的许多GridLayout个对象中的每一个都拥有Image。我需要知道每个图像的行和列。

实现此目的的一种方法是存储BufferedImage[][]以检查图像。 E.G。

enter image description here

import java.awt.*;
import java.awt.image.BufferedImage;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.net.URL;
import java.util.Random;
import javax.imageio.ImageIO;

public final class ImageArray {

    int r = 8;
    int c = 8;

    // The images in the chess board, used to check which 
    // image was chosen for this place on the board.
    final private BufferedImage[][] chessBoardImages = new BufferedImage[r][c];

    private final int rowSprite = 2;
    private final int colSprite = 6;

    // Holds the tile sheet images
    private final BufferedImage[] chessPieceImages = 
            new BufferedImage[colSprite * rowSprite];

    private JComponent ui = null;
    private final BufferedImage chessSpriteSheet;

    ImageArray(BufferedImage chessSpriteSheet) {
        this.chessSpriteSheet = chessSpriteSheet;
        initUI();
    }

    private int getImageIndex(Image img) {
        for (int i = 0; i < chessPieceImages.length; i++) {
            if (chessPieceImages[i].equals(img)) {
                return i;
            }
        }
        return -1;
    }

    public void initUI() {
        if (ui != null) {
            return;
        }

        ui = new JPanel(new BorderLayout(4, 4));
        ui.setBorder(new EmptyBorder(4, 4, 4, 4));

        int w = chessSpriteSheet.getWidth();
        int h = chessSpriteSheet.getHeight() / rowSprite;
        int wStep = chessSpriteSheet.getWidth() / colSprite;
        int hStep = chessSpriteSheet.getHeight() / rowSprite;

        for (int x = 0; x < colSprite; x++) {
            for (int y = 0; y < rowSprite; y++) {
                chessPieceImages[x + (y * colSprite)]
                        = chessSpriteSheet.getSubimage(
                                x * wStep, y * hStep, wStep, h);
            }
        }
        JPanel grid = new JPanel(new GridLayout(r, c));
        ui.add(grid, BorderLayout.CENTER);
        Random rand = new Random();
        for (int x = 0; x < r; x++) {
            boolean oddRow = x % 2 == 0;
            for (int y = 0; y < c; y++) {
                boolean oddCol = y % 2 == 0;
                BufferedImage img = chessPieceImages[
                        rand.nextInt(colSprite * rowSprite)];
                JLabel l = new JLabel(new ImageIcon(img));
                chessBoardImages[x][y] = img;
                l.setOpaque(true);
                if ((oddRow && oddCol) || (!oddRow && !oddCol)) {
                    l.setBackground(Color.WHITE);
                } else {
                    l.setBackground(Color.LIGHT_GRAY);
                }
                grid.add(l);
            }
        }
        JLabel htmlLabel = new JLabel(getHtml());
        htmlLabel.setHorizontalTextPosition(SwingConstants.CENTER);
        htmlLabel.setVerticalTextPosition(SwingConstants.BOTTOM);
        ui.add(htmlLabel,
                BorderLayout.LINE_END);
    }

    private String getHtml() {
        String style = "<style type='text/css'>"
                + "body {"
                + "font-size: 36px;"
                + "}"
                + ".white {"
                + "background-color: #FFFFFF;"
                + "}"
                + ".black {"
                + "background-color: #BBBBBB;"
                + "}"
                + "</style>";
        String pre = "<html><head>%1s</head><body><table border=1 cellspacing=0>";
        StringBuilder sb = new StringBuilder(String.format(pre, style));
        for (int y = 0; y < r; y++) {
            sb.append("<tr>");
            for (int x = 0; x < c; x++) {
                Image img = chessBoardImages[y][x];
                final int index = getImageIndex(img);
                // hack to convert index to unicode codepoint..
                int unicodeOffset = ((index/colSprite)*colSprite)==0 ? colSprite : -colSprite;
                int unicodeIndexOffset;
                switch (index) {
                    case 3:
                        unicodeIndexOffset = 4;
                        break;
                    case 4:
                        unicodeIndexOffset = 3;
                        break;
                    case 9:
                        unicodeIndexOffset = 10;
                        break;
                    case 10:
                        unicodeIndexOffset = 9;
                        break;
                    default:
                        unicodeIndexOffset = index;
                }
                int unicode = 9812 + unicodeIndexOffset + unicodeOffset;
                // end: hack to convert index to unicode index..
                String cssClass;
                boolean oddCol = x%2==1;
                boolean oddRow = y%2==1;
                if ((oddRow && oddCol) || (!oddRow && !oddCol)) {
                    cssClass = "white";
                } else {
                    cssClass = "black";
                }
                sb.append(String.format(
                        "<td class='%1s'>&#%2s;</td>", cssClass, unicode));
            }
            sb.append("</tr>");
        }
        sb.append("</table></body></html>");
        return sb.toString();
    }

    public JComponent getUI() {
        return ui;
    }

    public static void main(String[] args) throws Exception {
        String urlString = "http://i.stack.imgur.com/memI0.png";
        final BufferedImage img = ImageIO.read(new URL(urlString));
        Runnable r = new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception useDefault) {
                }
                ImageArray o = new ImageArray(img);

                JFrame f = new JFrame("Image Array");
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                f.setLocationByPlatform(true);

                f.setContentPane(o.getUI());
                f.pack();
                f.setMinimumSize(f.getSize());

                f.setVisible(true);
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

答案 2 :(得分:0)

您应该考虑将信息存储在其他地方。一种方法是创建一个从JLabel派生的类,目的是存储行和列信息。然后使用此子类的实例而不是使用JLabel实例。它们将作为常规JLabel呈现,但您可以以不在工具提示中弹出该信息的方式检索行和列信息。