Текст всплывающей подсказки JLabel не отображается

Я ожидал, что это будет очень просто и понятно, но всплывающая подсказка не отображается при наведении курсора мыши. Я попытался напечатать текст, и он печатается правильно. Любые комментарии, что я делаю неправильно?

public class gui2 extends JFrame {
private JLabel item1;
public gui2() {
    super("The title bar");
    setLayout(new FlowLayout());
    item1 = new JLabel("label 1");
    item1.setToolTipText("This is a message");
    String str = item1.getToolTipText();
    System.out.println(str);
    add(item1);
}

   class gui {
public static void main(String[] args) {

    gui2 g2 = new gui2();
    g2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    g2.setSize(400, 200);
    g2.setVisible(true);
}

} }


person user1988501    schedule 17.01.2013    source источник


Ответы (2)


Ваш код не компилируется, даже если вы добавите импорт. Вот ваш код исправлен и работает:

import java.awt.FlowLayout;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class Gui {
    public static void main(String[] args) {

        Window window = new Window();
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setSize(400, 200);
        window.setVisible(true);
    }
}

class Window extends JFrame {
    private static final long serialVersionUID = 1L;
    private JLabel jlabel;

    public Window() {
        super("The title bar");
        setLayout(new FlowLayout());
        jlabel = new JLabel("label 1");
        jlabel.setToolTipText("This is a message");
        String str = jlabel.getToolTipText();
        System.out.println(str);
        add(jlabel);
    }
}
person restricteur    schedule 17.01.2013
comment
Спасибо @resticteur. Я не правильно вставил код. Мой код компилировался и показывал метку, за исключением того, что текст всплывающей подсказки не работал. Я буду осторожен, чтобы вставлять код, который компилируется. Спасибо, что нашли время. - person user1988501; 18.01.2013

Как уже упоминалось @restricteur, ваш код не компилируется.

Это связано с тем, что ваш класс gui, содержащий main(..), вложен в другой класс, поэтому объявление метода static не допускается, если только вложенный класс не помечен static. (Я просто переместил/отменил вложенность Gui из Gui2)

Помимо того, что ваш код действительно работает, я думаю, вы поторопились - удерживайте указатель мыши над JLabel примерно 3-4 секунды, и вы должны увидеть ToolTip:

(используя ваш код без ошибок компиляции, конечно): введите здесь описание изображения

Предложения по коду:

1) Пожалуйста, следите за соглашениями об именах java, т.е. имена классов должны начинаться с заглавной буквы, а каждое новое слово после этого также должно, т.е. gui становится Gui или GUI, но я предпочитаю первое.

2) Не вызывайте setSize для JFrame используйте и= подходящее LayoutManager и вызывайте pack() для JFrame до того, как сделаете его видимым (но после добавления компонентов).

3) Не расширяйте JFrame без необходимости, просто создайте экземпляр и используйте его.

4) Всегда создавайте компоненты Swing и управляйте ими в потоке отправки событий. через блок SwingUtilities.invokeLater(Runnable r).

5) Выберите setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);, если не используете Timers, так как это позволит продолжить main(..) независимо от выхода из графического интерфейса.

Вот код с вышеуказанными исправлениями:

введите здесь описание изображения

import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

class Gui2 {

    private JLabel item1;
    private JFrame frame;

    public Gui2() {
        frame = new JFrame("The title bar");
        frame.setLayout(new FlowLayout());
        item1 = new JLabel("label 1");
        item1.setToolTipText("This is a message");
        String str = item1.getToolTipText();
        System.out.println(str);
        frame.add(item1);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }
}

class Gui {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Gui2();
            }
        });
    }
}
person David Kroukamp    schedule 17.01.2013
comment
Спасибо, Дэвид. Вы были почти правы насчет моей поспешности, я не навел указатель мыши на JLabel, как должен был. Я продолжал водить мышью по окну, но не совсем по этикетке. Виноват. Ваши другие комментарии приветствуются, и я буду работать над ними. - person user1988501; 18.01.2013