Pedro Pereira
Pedro Pereira

Reputation: 55

Hide a JLabel tooltip text

I am adding JLabel objects to a JPanel. Each label has a different tool tip text that I use to identify each label afterwards, the problem is that the tool tip is always showing on hover and I need it to always be hidden.

Each label has a different image icon that's why I can't use the label text.

I can't find any documentation on the label API for some function like .hidetooltip.

Edit

Each of many JLabel objects on a GridLayout holds an Image. I need to know the line and column of each image.

Upvotes: 1

Views: 2610

Answers (3)

Andrew Thompson
Andrew Thompson

Reputation: 168825

Each of many JLabel objects on a GridLayout holds an Image. I need to know the line and column of each image.

One way to achieve this is to store a BufferedImage[][] to check images against. 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 = "https://i.sstatic.net/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);
    }
}

Upvotes: 1

copeg
copeg

Reputation: 8348

To hide the tool tip text to null

myComponent.setToolTipText(null);

This is described in the API for this method: "param - the string to display; if the text is null, the tool tip is turned off for this component"

EDIT: In response to your actual issue that you describe in one of your comments, there are a variety of ways association information with a JLabel. You could a) extend the class and keep instance variables defining the grid values b) use a Map key'd with the JLabel and value'd with the row/col c) use the Name of the JLabel

Upvotes: 2

TT.
TT.

Reputation: 16137

You should consider storing the information elsewhere. One way would be to make a class deriving from JLabel with the purpose of storing the line and column information. Then use instances of this subclass rather than use JLabel instances. They will render as a regular JLabel would, but you can retrieve the line and column information in a way that does not pop up that information in a tooltip.

Upvotes: 0

Related Questions