java - Swing JLabel 缺少字符

标签 java swing

所以我遇到了一个奇怪的问题。

我的界面只是一个标签和一个 JSlider。

我的代码(已删除):

import javax.swing.*;
import java.awt.*;

public class Broken {
    JLabel value = new JLabel();
    JSlider slider = new JSlider(0, 255, 0);
    public Broken() {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JPanel panel = new JPanel();
                value.setText("Some Value");
                panel.add(value);
                JFrame frame = new JFrame("Frame Name");
                frame.setLayout(new GridLayout(2, 1));
                frame.add(panel);
                frame.add(slider);
                frame.pack();
                frame.setVisible(true);
            }
        });
    }

    public static void main(String[] args) {
        new Broken();
    }
}

发生的情况是标签没有显示。如果我将屏幕大小从右侧调整到尽可能最小,文本会突然出现,并且如果我将大小调整回原来的样子,文本也会保留在那里。我不知道发生了什么,这对我来说确实像是一个错误。

调整屏幕截图大小之前和之后:

before after

最佳答案

尽管您付出了努力,但在创建 JLabel(或 JSlider)时,您并未处于 EventDispatchThread 上。为了测试,我对 JLabel 进行了子类化,只是在调用其构造函数时查看代码是否位于 EDT 上:

    import java.awt.*;
    import javax.swing.*;

    public class Broken {
      JLabel value = new XLabel();  // called before constructor, so not on EDT
      JSlider slider = new JSlider(0, 255, 0);  // same here

      public Broken() {
        SwingUtilities.invokeLater(new Runnable() {
          public void run() {
            JPanel panel = new JPanel();
            value.setText("Some Value");
            panel.add(value);
            JFrame frame = new JFrame("Frame Name");
            frame.setLayout(new GridLayout(2, 1));
            frame.add(panel);
            frame.add(slider);
            frame.pack();
            frame.setVisible(true);
          }
        });
      }

      public static void main(String[] args) {
        new Broken();
      }

      class XLabel extends JLabel {
        public XLabel() {
          super();
          System.out.println("EDT? " + SwingUtilities.isEventDispatchThread());
        }
      }
    }

要修复此问题,请将 invokeLater 调用放在 main 中,以便将类的整个构造包装到 EDT 上:

import java.awt.*;
import javax.swing.*;

public class Broken2 {
  JLabel value = new JLabel();
  JSlider slider = new JSlider(0, 255, 0);

  public Broken2() {
    JPanel panel = new JPanel();
    value.setText("Some Value");
    panel.add(value);
    JFrame frame = new JFrame("Frame Name2");
    frame.setLayout(new GridLayout(2, 1));
    frame.add(panel);
    frame.add(slider);
    frame.pack();
    frame.setVisible(true);
  }

  public static void main(String[] args) {

    // Generally the proper way. Create Whole app on EDT
    SwingUtilities.invokeLater(new Runnable() {
      public void run() {
        new Broken2();
      }
    });
  }
}

关于java - Swing JLabel 缺少字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25860165/

相关文章:

java - 绘图到按钮单击

java - Eclipse 可以很好地运行我的程序,但是 JAR 文件不能

java - 树形图获取与每个键关联的值的最大值

java - 滚动条未显示在 JTextArea 中

java - 在存储桶中查找数字的最快方法是什么?

java - 通过拖放项目制作类似列表的小部件的最简单方法?

java - JTrees 的 Bean 绑定(bind)

java - Spring @Transactional 只读模式回滚行为

java - 以较低的特​​异性解析 ISO 日期

java - 将 JFreeChart 添加到 JPanel