java - 如何在不使用 CardLayouts 的情况下重新加载面板?
问题描述
TLDR;:
我正在寻找一种重新加载 JPanels 及其组件的方法。
我想实现一个动态变化的 JComboBox。情况是这样的:
有一个按钮,它在后台生成数据(“生成内容”)这里只是一些随机数。生成数据后,应该可以在 JComboBox 中选择此数据。
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panel = new JPanel();
frame.getContentPane().add(panel, BorderLayout.CENTER);
panel.setLayout(null);
comboBox = new JComboBox<String>();
comboBox.setBounds(39, 63, 144, 20);
panel.add(comboBox);
btnGenerateContent = new JButton("generate content");
btnGenerateContent.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
comboContent = fillrandoms();
comboBox = new JComboBox<>(fillrandoms());
}
});
btnGenerateContent.setBounds(39, 11, 117, 23);
panel.add(btnGenerateContent);
}
private static String[] fillrandoms() {
String[] array = new String[10];
for (int i = 0; i < 10; i++) {
array[i] = "" + Math.random() * 100;
}
return array;
}
现在当我执行程序时,它会在有数据显示之前声明并初始化组合框。我现在的想法是,当我点击“生成内容”按钮时,这也会更新面板或 ComboBox 的 UI。但是当我插入panel.updateUI()
或comboBox.updateUI()
没有任何反应时。
经过研究,我发现了一些使用 CardLayouts 的方法,但我没有将它们用于我的 JComboBox,所以我可能需要另一种方法。我什至不知道这是常见的方法还是有其他更好的方法。
解决方案
更新 UI 使用方法panel.revalidate()
, panel.repaint()
, 或revalidate()
. revalidate() 和 repaint() 方法是反映 UI 更新任务的正确方法。
推荐阅读
- python-3.x - 获取节点的二、三阶邻居
- python - Kivy on_press 与 on_touch_down
- react-native - react-native-video TypeError:未定义不是对象
- c# - 在插入或更新数据库之前修改任何 SQL 命令字符串以删除特定列
- java - 与存储在 Assets 文件夹中的预填充加密 SQLite 数据库一起使用的 Android 应用程序
- python - 将 PIP_EXTRA_INDEX_URL 传递给 docker build
- ruby - 将特定 URL 添加到 BASE PATH 以使用 Nokogiri 抓取网页
- javascript - 不懂 javascript 的元音计数代码?
- visual-studio - Visual Studio 中的“发布”如何工作?
- ruby-on-rails - Rails 更改长 if/else 语句