java - 组件未出现在 ContentPane 中
问题描述
在我的应用程序中,我有一个 6 列表Jlabels
,它们被添加到contentPane
循环for
中。之后,我添加 2 JButtons
- 一个用于删除所有标签,第二个用于再次添加它们:
public class Test {
private JFrame frame;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Test window = new Test();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public Test() {
initialize();
}
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 960, 620);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.setLocationRelativeTo(null);
frame.getContentPane().setLayout(null);
frame.getContentPane().setBackground(new Color(30, 30, 30));
LinkedList<JLabel> labels = new LinkedList<>();
for(int i = 0 ; i < 6 ; i++) {
labels.get(i).setSize(280, 50);
labels.setBackground(new Color(75, 75, 75));
labels.setOpaque(true);
}
Button buttonAdd = new JButton("Add");
buttonAdd.setBounds(310, 15, 150, 50);
buttonAdd.addMouseListener(new MouseAdapter() {
@Override
public final void mouseClicked(MouseEvent event) {
for(int i = 0 ; i < 6 ; i++) {
labels.get(i).setLocation(15, 15+50*i);
frame.getContentPane().add(labels.get(i));
}
}
});
Button buttonRemove = new JButton("Remove");
buttonRemove.setBounds(310, 15, 150, 50);
buttonRemove.addMouseListener(new MouseAdapter() {
@Override
public final void mouseClicked(MouseEvent event) {
for(int i = 0 ; i < 6 ; i++) {
frame.getContentPane().remove(labels.get(i));
}
}
});
}
}
当我在 linsteners 之外添加 6 个标签时,它们被正确添加到ContentPane
并显示。然而,当我尝试通过按钮执行此操作时,单击时buttonAdd
没有任何反应。它们不会显示。
我尝试弄乱层次结构,手动设置索引但没有任何效果。我怀疑 MouseListeners 但我不知道为什么这不起作用。
解决方案
首先要做的事;
- 任何修改 GUI 的操作都必须在事件调度线程 (EDT) 中完成。您可以从这个答案中阅读更多为什么需要它。
您必须致电:
Test.this.frame.revalidate();
Test.this.frame.repaint();
如下所示:
for ( int i = 0; i < 6; i++ )
{
final JLabel l = labels.get( i );
l.setLocation( 15, 15 + (50 * i) );
Test.this.frame.getContentPane().add( l );
}
Test.this.frame.revalidate();
Test.this.frame.repaint();
除了我在您使用的代码中看到Button
的JButton
,我假设这只是一个打字错误。应该是JButton
。还
for(int i = 0 ; i < 6 ; i++) {
labels.get(i).setSize(280, 50);
labels.setBackground(new Color(75, 75, 75));
labels.setOpaque(true);
}
这段代码是错误的,标签是 alist
不是 a JLabel
。定义局部变量
JLabel labelToAdd = labels.get(i)
labelToAdd.setSize(280, 50);
labelToAdd.setBackground(new Color(75, 75, 75));
labelToAdd.setOpaque(true);
推荐阅读
- java - 我怎样才能获得一个班级的所有班级?
- amazon-web-services - 如何从 Cloudwatch 事件规则将环境变量和值传递给代码构建?
- python - 如何使用画布显示窗口调整 Tkinter 小部件的大小?
- javascript - 线性渐变不适用于在 javascript 中调用函数的 rgb 值
- node.js - 只允许通过 nginx 和 docker 访问 express 应用
- reactjs - 我的下拉样式没有用 reactstrap 导入
- javascript - 当自定义引擎不接受规范时,JSON Parse 和 Stringify for Dates 中是否有解决方法
- firebase - 使用带有 React 和电子邮件链接登录方法的 FirebaseUI 时无法访问“emailForSignIn”
- python - 具有自定义类型类的优先级队列获取 TypeError("'>' 在 'PrioritizedItem' 和 'int' 的实例之间不支持",)?
- javascript - WebExtension:设置选项 UI 的宽度