2010-11-19 12 views
1

ボタンを押したときにJListの内容を更新しようとしていました。そこで、リストモデルをクリアした後、リストをクリアして、新しい値をリストに追加しました。ここで取り除かコードです:ボタンプレスで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に何も表示されません。

誰かがこの問題の原因を突き止めるのに役立つでしょうか?おかげさまで

+0

できる場合は、大文字でクラス名を開始してください。これは、ほとんどのJava開発者が使用する規約であり、多くのJava開発者がコードを読みやすくなっています。 –

+0

私にお知らせいただきありがとうございます。私はクラス名を変更します。 – Monk

答えて

3

あなたのコアの問題はおそらく、AWT-EDTではないスレッドからSwing GUIを更新することに関連しています。 (Javaの以前のバージョンで使用するためのJava 6に同梱してもavailable for download):

あなたが読んおよび/またはSwingWorkerを使用してに見たいと思うかもしれませんまた

は、このアプローチを見て

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 
} 
+0

それは私が意図したものにかなり近いです。しかし、私は既存のリストをクリアし、新しく生成されたリストを表示したいと思っていました。あなたのコードでリスト、モデル、配列リストをクリアしようとしましたが、正常にクリアできませんでした。しかし、私は本当にUIの更新を行うために別のスイングワーカーを呼び出す考えが好きです。 – Monk

+0

@Monk新しいデータを入力する前に、リストを消去するようにアプリケーションを更新しました。 –

+0

申し訳ありません。私はちょうどループの上にモデル宣言を移動し、またそれをクリアしました。バターのように働く。ありがとう。私は自分のコードで実装しようとします。 – Monk

1

あなたがやっていることは、新しいスレッドを作成してから、EventDispatchThread以外のGUIコンポーネントを変更することです。これは一般的には良い考えではありません。ボタンイベントがそのスレッドで処理されるので、EDTにあるupdateList()を実行してみてください。

+0

私が気づいたことから、リストは初めて更新されます。この後、スレッド「List Updater」は実際には消滅します。ボタンを押すだけで再起動されます。したがって、スレッドは最初と同じように動作するはずです。また、私があなたを正しく理解していれば、スレッドがなくなった後にJListを更新することを提案しています。もしそうなら、スレッドは同時に実行されているので、どこにコードを置くべきですか?空の配列リストを呼び出すでしょう。ありがとう – Monk

関連する問題