Текстът на подсказката на 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 използвайте and= подходящо LayoutManager и извиквайте pack() на JFrame, преди да го настроите видимо (но след като са добавени компоненти).

3) Не разширявайте JFrame ненужно, просто създайте екземпляр и го използвайте.

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

5) Изберете setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);, освен ако не използвате Timers, тъй като това ще позволи на main(..) да продължи, независимо дали GUI е излязъл.

Ето код с горните корекции:

въведете описание на изображението тук

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