2011-09-16 119 views
10

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

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) { 
    } 
} 

回答

4

你应该在一个单独的线程中更新你的列表,否则你最终会阻塞事件分派线程。

尝试以下操作:

final DefaultListModel model = new DefaultListModel(); 
final JList list = new JList(model); 

//another thread to update the model 
final Thread updater = new Thread() { 
    /* (non-Javadoc) 
    * @see java.lang.Thread#run() 
    */ 
    @Override 
    public void run() { 
     for (int i = 0; i < 10; i++) { 
      model.addElement(i); 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       throw new RuntimeException(e); 
      } 
     } 
    } 
}; 
updater.start(); 
+1

我仍然认为'model.addElement(我)'必须被包裹成'invokeLater',请确实更新您的文章 – mKorbel

+0

@mKorbel?我正在更新模型,该模型将依次将事件触发到将在列表中调用“repaint”的处理程序。我相信这个'repaint'调用将排队请求事件分派线程调用​​'paint',所以它应该是安全的。 – dogbane

+3

事实上,EDT上没有更新,所有都是在Thread.sleep(1000)之后完成的,因为所有fireXxxXxx都不在EDT – mKorbel

7

不使用,真正在EventDispashThread不使用Thread.sleep(int),因为睡眠锁定当前Thread在这种情况下EventDispashThread,与联合国厚望输出到图形用户界面,更在Concurency in Swing

,如果你需要的东西dealay,然后将项目添加到wrappend Runneble#Thread,与输出到GUI包裹成invokeLater,或最好的办法是使用javax.swing.Timer

编辑第一。例如如何编程阻止EDT用了Thread.sleep(INT),因为othewise不与预期输出到GUI作品(代码非常loonnnger因为我想代码)

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); 
      } 
     }); 
    } 
} 

EDIT 2日。与@camickr样的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不工作

+0

+2伟大的提示和-1的一些错别字(只是开玩笑)。 – asgs

+0

hmmm是的我的英语和德语的语言有问题:-), – mKorbel

1

此代码介绍了如何从Java中的结果集插入在Swing JList的值。根据您的要求进行更改。希望这会帮助你。

try 
    { 
     CreateConnection(); 
     st=con.prepareStatement(QueryString); 
     rs=st.executeQuery(); 
     int i = 0; 
     rs.last(); 
     final String[] strings = new String[rs.getRow()]; 
     rs.first(); 
     strings[i]="Send to All";i++; 
     while (rs.next()) { 
      strings[i] = rs.getString(1); i++; 
     } 
     ToBeFilled.setModel(new javax.swing.AbstractListModel() { 

     public int getSize() { return strings.length; } 
     public Object getElementAt(int i) { return strings[i]; } 
     }); 
     con.close(); 
    } 
    catch(Exception ex) 
    {  
     JOptionPane.showMessageDialog(null, ex.toString()); 
    } 

或者只是简单的代码中插入值

jList1.setModel(new javax.swing.AbstractListModel() { 
String[] strings = { "Send to All", "ABC", "DEF" }; 
public int getSize() { return strings.length; } 
public Object getElementAt(int i) { return strings[i]; } 

});

请记住在页面顶部的initComponents()之后添加此代码。

+0

而不是'rs.first();'你必须使用'rs.beforeFirst();'。否则,你会错过第一个记录。 –

-1
final DefaultListModel model = new DefaultListModel(); 


    final Thread updater = new Thread() { 

     @Override 
     public void run() { 
      for (int i = 0; i < 10; i++) { 
       model.addElement(i); 
       listData.setModel(model); 
       try { 
        Thread.sleep(1000); 
       } catch (InterruptedException e) { 
        throw new RuntimeException(e); 
       } 
      } 
     } 
    }; 
    updater.start(); 
+0

不,这是错误的:你**不能**从摆脱EDT的摆动组件。你为什么基本上复制了接受的(虽然不正确的)答案?在每次插入后重新设置模型完全改善..没有什么基本的错误。 – kleopatra