Java Swing JLabel缺少字符

Java Swing JLabel缺少字符,java,swing,Java,Swing,所以我遇到了一个特殊的问题 我的接口只是一个标签和一个JSlider 我的代码(已删除): 结果是标签没有出现。如果我将屏幕从右边调整到尽可能小的位置,文本会突然出现,如果我重新调整到原来的大小,文本就会留在那里。我不知道发生了什么,这对我来说真的像个虫子 调整屏幕截图大小之前和之后: 尽管您做出了努力,但在创建JLabel(或JSlider)时,您并不是在EventDispatchThread上。为了测试,我将JLabel子类化,只是查看调用其构造函数时代码是否在EDT上: impo

所以我遇到了一个特殊的问题

我的接口只是一个标签和一个JSlider

我的代码(已删除):

结果是标签没有出现。如果我将屏幕从右边调整到尽可能小的位置,文本会突然出现,如果我重新调整到原来的大小,文本就会留在那里。我不知道发生了什么,这对我来说真的像个虫子

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


尽管您做出了努力,但在创建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();
      }
    });
  }
}

你试过为JPanel设置布局管理器吗?好的。无法在Windows 7上使用某些最新型号的Java 7变体在此处复制。哪个版本的Java显示了问题所在?顺便说一句-机器是否有nVidia图形卡?@andrewhompson Windows 8、Java 8和yes nVidia GeForce GT 635M“nVidia GeForce GT 635M”确保使用最新的驱动程序。我记得听说过(GUI渲染)问题,但事实并非如此。@AndrewThompson更新的驱动程序重新启动后仍然存在问题。在任何情况下,问题都很明显,要么是windows 8、java 8,要么是一些有趣的硬件/驱动程序,谢谢你的帖子(+1),但对我来说仍然不起作用。我怀疑这是Andrew提到的驱动程序问题,还在下载更新的驱动程序
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();
      }
    });
  }
}