gpt4 book ai didi

java - 在 Swing Java 中向 JList 添加元素

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:55:58 27 4
gpt4 key购买 nike

我有一个在单击按钮时执行的函数。假设有一个循环将 1 加到 10 到 JList。我将该数据添加到 DefaultListModel。它完美地工作并且数字被添加。然后我在循环中添加了一个 Thread.sleep(1000)。但是输出是不同的。我想每秒添加 1 个元素。但现在它等待 10 秒,并在第 10 秒结束时将所有 1 加到 10。我哪里错了吗?

List processList = listNumbers.getSelectedValuesList();
DefaultListModel resultList = new DefaultListModel();
listResult.setModel(resultList);

for (int i = 0; i < processList.size(); i++) {
resultList.addElement(String.valueOf(i));
try {
Thread.sleep(1000);
}
catch (InterruptedException ex) {
}
}

最佳答案

不要使用,真的不要在EventDispashThread期间使用Thread.sleep(int),因为 sleep 锁定了当前的Thread并且在本例 EventDispashThread,向 GUI 输出非预期的结果,更多信息在 Concurency in Swing 中,

如果你需要一些东西来延迟,然后将 Items wrappend 添加到 Runneble#Thread 中,将输出到 GUI 包装到 invokeLater 中,或者最好的方法是使用 javax.swing.Timer

编辑第一。示例如何使用 Thread.sleep(int) 以编程方式阻止 EDT,因为 othewise 不适用于期望输出到 GUI(代码非常冗长,因为我想编写代码)

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

public class ShakingButtonDemo implements Runnable {

private JButton button;
private JRadioButton radioWholeButton;
private JRadioButton radioTextOnly;

public static void main(String[] args) throws Exception {
SwingUtilities.invokeLater(new ShakingButtonDemo());
}

@Override
public void run() {
radioWholeButton = new JRadioButton("The whole button");
radioTextOnly = new JRadioButton("Button text only");
radioWholeButton.setSelected(true);
ButtonGroup bg = new ButtonGroup();
bg.add(radioWholeButton);
bg.add(radioTextOnly);
button = new JButton(" Shake with this Button ");
button.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
shakeButton(radioWholeButton.isSelected());
}
});
JPanel p1 = new JPanel();
p1.setBorder(BorderFactory.createTitledBorder("Shake Options"));
p1.setLayout(new GridLayout(0, 1));
p1.add(radioWholeButton);
p1.add(radioTextOnly);
JPanel p2 = new JPanel();
p2.setLayout(new GridLayout(0, 1));
p2.add(button);
JFrame frame = new JFrame();
frame.setTitle("Shaking Button Demo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(p1, BorderLayout.NORTH);
frame.add(p2, BorderLayout.SOUTH);
frame.setSize(240, 160);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}

private void shakeButton(final boolean shakeWholeButton) {
final Point point = button.getLocation();
final Insets margin = button.getMargin();
final int delay = 75;
Runnable r = new Runnable() {

@Override
public void run() {
for (int i = 0; i < 30; i++) {
try {
if (shakeWholeButton) {
moveButton(new Point(point.x + 5, point.y));
Thread.sleep(delay);
moveButton(point);
Thread.sleep(delay);
moveButton(new Point(point.x - 5, point.y));
Thread.sleep(delay);
moveButton(point);
Thread.sleep(delay);
} else {// text only
setButtonMargin(new Insets(margin.top, margin.left + 3, margin.bottom, margin.right - 2));
Thread.sleep(delay);
setButtonMargin(margin);
Thread.sleep(delay);
setButtonMargin(new Insets(margin.top, margin.left - 2, margin.bottom, margin.right + 3));
Thread.sleep(delay);
setButtonMargin(margin);
Thread.sleep(delay);
}
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
};
Thread t = new Thread(r);
t.start();
}

private void moveButton(final Point p) {
SwingUtilities.invokeLater(new Runnable() {

@Override
public void run() {
button.setLocation(p);
}
});
}

private void setButtonMargin(final Insets margin) {
SwingUtilities.invokeLater(new Runnable() {

@Override
public void run() {
button.setMargin(margin);
}
});
}
}

编辑第二。与@camickr 的 kind hepl(看起来像 similair)

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

public class ShakeComponents1 {

private JFrame frame = new JFrame();
private final String items[] = {"One", "Two", "Three"};
private Timer timer;
private JPanel panel = new JPanel();
private JPanel buttonPanel = new JPanel();
private JButton button = new JButton(" Exit ");
private boolean repeats = true;
private boolean runs = false;
private Color clr[] = {Color.red, Color.blue, Color.magenta};
private Insets initMargin;

public static void main(String[] args) {

SwingUtilities.invokeLater(new Runnable() {

@Override
public void run() {
new ShakeComponents1().makeUI();
}
});
}

public void makeUI() {
buttonPanel = new JPanel();
buttonPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
buttonPanel.setLayout(new BorderLayout());
button.setPreferredSize(new Dimension(100, 45));
button.setForeground(Color.darkGray);
button.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent event) {
Runnable doRun = new Runnable() {

@Override
public void run() {
System.exit(0);
}
};
SwingUtilities.invokeLater(doRun);
}
});
button.addMouseListener(new java.awt.event.MouseListener() {

@Override
public void mouseClicked(MouseEvent e) {
}

@Override
public void mousePressed(MouseEvent e) {
}

@Override
public void mouseReleased(MouseEvent e) {
}

@Override
public void mouseEntered(MouseEvent e) {
if (runs) {
SwingUtilities.invokeLater(new Runnable() {

@Override
public void run() {
runs = false;
timer.stop();
changePnlBorder(new EmptyBorder(5, 5, 5, 5));
changeBtnForegroung(Color.darkGray);
}
});
}
}

@Override
public void mouseExited(MouseEvent e) {
if (!runs) {
timer.start();
runs = true;
}
}
});
buttonPanel.add(button);
final Insets margin = button.getMargin();
panel.add(buttonPanel);
for (int i = 0; i < 2; i++) {
JComboBox combo = new JComboBox(items);
combo.setMinimumSize(new Dimension(50, 25));
combo.setMaximumSize(new Dimension(150, 25));
combo.setPreferredSize(new Dimension(100, 25));
combo.addActionListener(new ShakeAction());
panel.add(combo);
}
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(panel);
frame.pack();
frame.setLocation(50, 50);
frame.setVisible(true);
timer = new Timer(500, new ShakeAction());
timer.setRepeats(repeats);
initMargin = button.getMargin();
}

private class ShakeAction extends AbstractAction {

private static final long serialVersionUID = 1L;
private int noColor = 0;
private Border border;
private int count = 0;

@Override
public void actionPerformed(ActionEvent e) {
timer.start();
if (count > 5) {
new Thread(new Runnable() {

@Override
public void run() {
try {
Thread.sleep(750);
changeBtnForegroung(Color.darkGray);
Thread.sleep(750);
count = 0;
Thread.sleep(750);
} catch (Exception e) {
System.out.println(e);
}
}
}).start();
} else {
new Thread(new Runnable() {

@Override
public void run() {
try {
runs = true;
if (noColor < 2) {
noColor++;
changeBtnForegroung(clr[noColor]);
} else {
noColor = 0;
changeBtnForegroung(clr[noColor]);
}
changeBtnMargin(new Insets(initMargin.top, initMargin.left + 10, initMargin.bottom, initMargin.right - 10));
border = new EmptyBorder(0, 5, 10, 5);
changePnlBorder(border);
Thread.sleep(100);
changeBtnMargin(new Insets(initMargin.top, initMargin.left - 10, initMargin.bottom, initMargin.right + 10));
border = new EmptyBorder(0, 0, 10, 10);
changePnlBorder(border);
Thread.sleep(100);
changeBtnMargin(new Insets(initMargin.top, initMargin.left + 10, initMargin.bottom, initMargin.right - 10));
border = new EmptyBorder(5, 10, 5, 0);
changePnlBorder(border);
Thread.sleep(100);
changeBtnMargin(new Insets(initMargin.top, initMargin.left - 10, initMargin.bottom, initMargin.right + 10));
border = new EmptyBorder(10, 10, 0, 0);
changePnlBorder(border);
Thread.sleep(100);
changeBtnMargin(new Insets(initMargin.top, initMargin.left, initMargin.bottom, initMargin.right));
border = new EmptyBorder(5, 5, 5, 5);
changePnlBorder(border);
Thread.sleep(100);
count++;
} catch (Exception e) {
System.out.println(e);
}
}
}).start();
}
}
}

private void changePnlBorder(final Border b) {
SwingUtilities.invokeLater(new Runnable() {

@Override
public void run() {
buttonPanel.setBorder(b);
buttonPanel.revalidate();
buttonPanel.repaint();
}
});
}

private void changeBtnForegroung(final Color c) {
SwingUtilities.invokeLater(new Runnable() {

@Override
public void run() {
button.setForeground(c);
}
});
}

private void changeBtnMargin(final Insets margin) {
SwingUtilities.invokeLater(new Runnable() {

@Override
public void run() {
button.setMargin(margin);
}
});
}
}

编辑第三。

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

public class DelayedComboBoxTest extends JFrame {

private static final long serialVersionUID = 1L;
private JCheckBox chkA = new JCheckBox("A");
private JCheckBox chkB = new JCheckBox("B");
private JCheckBox chkC = new JCheckBox("C");
private JComboBox cboItems = new JComboBox();

public DelayedComboBoxTest() {
super("Delayed ComboBox Test");
setDefaultCloseOperation(EXIT_ON_CLOSE);
JPanel p = new JPanel();
p.add(chkA);
p.add(chkB);
p.add(chkC);
p.add(cboItems);
Container c = getContentPane();
c.setLayout(new BorderLayout());
c.add(p);
pack();
cboItems.addPopupMenuListener(new MyPopupMenuListener());
}

private void rebuildList() {
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
Vector<String> items = new Vector<String>();
if (chkA.isSelected()) {
items.add("A");
}
if (chkB.isSelected()) {
items.add("B");
}
if (chkC.isSelected()) {
items.add("C");
}
cboItems.setModel(new DefaultComboBoxModel(items));
try {
new Thread().sleep(2500); // simulate a long transaction
} catch (InterruptedException ex) {
}
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}

public static void main(String[] args) {
JFrame f = new DelayedComboBoxTest();
f.setVisible(true);
}

private class MyPopupMenuListener implements PopupMenuListener {

@Override
public void popupMenuCanceled(PopupMenuEvent e) {
}

@Override
public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
}

@Override
public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
int items = cboItems.getItemCount();
rebuildList();

if (items != cboItems.getItemCount()) {
cboItems.hidePopup();
cboItems.showPopup();
}
}
}
}

但对于所有示例,必须存在 EDT 并且 EventQueue 中有 Events,否则简单不起作用

关于java - 在 Swing Java 中向 JList 添加元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7442310/

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