gpt4 book ai didi

java - Swing JLabel 缺少字符

转载 作者:行者123 更新时间:2023-11-30 03:45:27 25 4
gpt4 key购买 nike

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

我的界面只是一个标签和一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com