gpt4 book ai didi

java - 按下按钮时偶尔更新 JList

转载 作者:行者123 更新时间:2023-11-29 03:59:54 24 4
gpt4 key购买 nike

我试图在按下按钮时更新 JList 的内容。因此,我清除了列表模型,然后清除了列表,然后继续向列表添加新值。这是剥离的代码:

testList.java

public class testList extends javax.swing.JFrame {

private Thread t;
public DefaultListModel model;
public boolean first = true;

public testList() {
model = new DefaultListModel();
initComponents();
this.centre(this);
}

public static void centre(javax.swing.JFrame f) {
Dimension us = f.getSize(), them = Toolkit.getDefaultToolkit().getScreenSize();
int newX = (them.width - us.width) / 2;
int newY = (them.height - us.height) / 2;
f.setLocation(newX, newY);
}

class updateList implements Runnable {

public void run() {
tmp.getTheList();
model.clear();
ouputList.removeAll();

for (int i = 0; i < tmp.returnList.size(); i++) {
model.addElement(tmp.returnList.get(i));

}
if (first) {
chList.setModel(model);
}

}
}

private void initComponents() {
// generated by NetBeans 6.9
}

private void buttonActionPerformed(java.awt.event.ActionEvent evt) {
t = new Thread(new updateList(), "List Updater");
t.start();
}

public static void main(String args[]) {

tmp = new aC();

java.awt.EventQueue.invokeLater(new Runnable() {

public void run() {
new chapList().setVisible(true);
}
});
}

static aC tmp;

private javax.swing.JButton button;
public static javax.swing.JList outputList;
private javax.swing.JScrollPane jScrollPane1;
}

ac.java

public class aC extends testList {

ArrayList returnList = new ArrayList();

void getTheList() {
returnList.clear();
generateList();
}

void generateList() {
// populate returnList with random values of random size using returnlist.add()
}
}

我面临的问题是,当第一次创建列表时,它会更新 JList。再次按下按钮时,JList 有时只会更新。如果进一步按下按钮,JList 中不会显示任何内容。

谁能帮我弄清楚是什么导致了这个问题?谢谢。

最佳答案

您的核心问题可能与从不是 AWT-EDT 的线程更新Swing GUI 有关。 .

您可能想阅读和/或研究使用 SwingWorker (Java 6 和 available for download 一起提供,用于早期版本的 Java。)

或者,看看这个方法:

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

public class BackgroundWorkerFrame extends javax.swing.JFrame {
public BackgroundWorkerFrame() {
initComponents();
jList.setModel(new DefaultListModel());
}

private void jButtonGoActionPerformed(ActionEvent evt) {
Thread t = new Thread(new WorkerRunnable());
t.start();
}

public class WorkerRunnable implements Runnable {
public void run() {
System.out.println("Working hard...");
sleep(1000);
ArrayList<Integer> list = new ArrayList();
for (int i = 0; i < 5; i++) {
list.add((int) (Math.random() * 100));
}
System.out.println("Updating GUI...");
SwingUtilities.invokeLater(new UpdateRunnable(list));
}
}

public class UpdateRunnable implements Runnable {
private final ArrayList<Integer> list;
private UpdateRunnable(ArrayList<Integer> list) {
this.list = list;
}
public void run() {
DefaultListModel model = (DefaultListModel) jList.getModel();
model.clear();
for (Integer i : list) {
model.addElement(i);
}
}
}

@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {

jButtonGo = new JButton();
jScrollPane = new JScrollPane();
jList = new JList();

setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

jButtonGo.setText("Go");
jButtonGo.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
jButtonGoActionPerformed(evt);
}
});
getContentPane().add(jButtonGo, BorderLayout.PAGE_START);

jScrollPane.setViewportView(jList);

getContentPane().add(jScrollPane, BorderLayout.CENTER);

Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
setBounds((screenSize.width-309)/2, (screenSize.height-338)/2, 309, 338);
}// </editor-fold>

public static void sleep(long ms) {
try {
Thread.sleep(ms);
} catch (InterruptedException ex) {
ex.printStackTrace();
Thread.currentThread().interrupt();
}
}

public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new BackgroundWorkerFrame().setVisible(true);
}
});
}

// Variables declaration - do not modify
JButton jButtonGo;
JList jList;
JScrollPane jScrollPane;
// End of variables declaration
}

关于java - 按下按钮时偶尔更新 JList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4221274/

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