Java JLabel tooltiptext未显示

Java JLabel tooltiptext未显示,java,swing,user-interface,tooltip,jlabel,Java,Swing,User Interface,Tooltip,Jlabel,我希望这是非常简单和直接的,但鼠标悬停在tooltiptext上时不会显示。我试着打印文本,结果打印正确。有什么评论我做错了什么 public class gui2 extends JFrame { private JLabel item1; public gui2() { super("The title bar"); setLayout(new FlowLayout()); item1 = new JLabel("label 1"); item1.setToo

我希望这是非常简单和直接的,但鼠标悬停在tooltiptext上时不会显示。我试着打印文本,结果打印正确。有什么评论我做错了什么

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);
}
}
}

即使添加导入,代码也不会编译。以下是您的代码已更正并正常工作:

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);
    }
}

即使添加导入,代码也不会编译。以下是您的代码已更正并正常工作:

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);
    }
}

正如@restricteur所提到的,您的代码无法编译

这是因为您的类
gui
包含
main(..)
嵌套在另一个类中,因此不允许
static
方法声明,除非嵌套类标记为
static
。(我只是从
Gui2
中移出/取消嵌套
Gui

除此之外,您的代码确实有效,我认为您太仓促了-将鼠标悬停在标签上3-4秒,您应该会看到
工具提示出现:

(当然,使用没有编译错误的代码):

关于代码的建议:

1) 请注意java命名约定,即类名应以大写字母开头,其后的每个新词也应如此,即
gui
变成
gui
gui
,但我更喜欢前者

2) 在将其设置为可见之前(但在添加组件之后),不要在
JFrame
上调用
setSize
,使用并=适当的
LayoutManager
并在
JFrame
上调用
pack()

3) 不要不必要地扩展
JFrame
,只需创建一个实例并使用它即可

4) 始终通过
SwingUtilities.invokeLater(Runnable r)
block在上创建和操作Swing组件

5) 选择
setDefaultCloseOperation(JFrame.DISPOSE\u ON\u CLOSE)除非使用
Timer
s,否则无论GUI是否退出,这将允许
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();
            }
        });
    }
}


正如@restricteur所提到的,您的代码无法编译

这是因为您的类
gui
包含
main(..)
嵌套在另一个类中,因此不允许
static
方法声明,除非嵌套类标记为
static
。(我只是从
Gui2
中移出/取消嵌套
Gui

除此之外,您的代码确实有效,我认为您太仓促了-将鼠标悬停在标签上3-4秒,您应该会看到
工具提示出现:

(当然,使用没有编译错误的代码):

关于代码的建议:

1) 请注意java命名约定,即类名应以大写字母开头,其后的每个新词也应如此,即
gui
变成
gui
gui
,但我更喜欢前者

2) 在将其设置为可见之前(但在添加组件之后),不要在
JFrame
上调用
setSize
,使用并=适当的
LayoutManager
并在
JFrame
上调用
pack()

3) 不要不必要地扩展
JFrame
,只需创建一个实例并使用它即可

4) 始终通过
SwingUtilities.invokeLater(Runnable r)
block在上创建和操作Swing组件

5) 选择
setDefaultCloseOperation(JFrame.DISPOSE\u ON\u CLOSE)除非使用
Timer
s,否则无论GUI是否退出,这将允许
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();
            }
        });
    }
}


谢谢@restictur。我没有正确粘贴代码。我的代码正在编译并显示标签,但工具提示文本不起作用。我会小心地粘贴编译的代码。谢谢你抽出时间。谢谢@restictur。我没有正确粘贴代码。我的代码正在编译并显示标签,但工具提示文本不起作用。我会小心地粘贴编译的代码。谢谢你抽出时间。谢谢大卫。你对我仓促行事的看法几乎是对的,我并没有像我应该做的那样将鼠标悬停在JLabel上。我不停地把鼠标移到窗口上,但不完全在标签上。我的错。非常感谢您的其他评论,我将继续努力。谢谢David。你对我仓促行事的看法几乎是对的,我并没有像我应该做的那样将鼠标悬停在JLabel上。我不停地把鼠标移到窗口上,但不完全在标签上。我的错。非常感谢您的其他评论,我将继续努力。