2010-11-21 23 views
0

Lütfen aşağıdaki örneği çalıştırmayı deneyin ve özellikle bir satıra tıklarsanız, yeniden boyamanın neden zaman zaman başarısız olduğunu açıklamama açıklayın. JList, tercih edilen satırların boyutunu unutur gibi görünüyor. Bu kodu sabit intevaller olarak çalıştırırken, JList'in bazı rasgele aralıkları boş kaldığı anlamına gelir.JList nasıl yeniden yüklenir?

import javax.swing.JList; 
import javax.swing.ListCellRenderer; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JFrame; 
import javax.swing.BorderFactory; 
import javax.swing.DefaultListModel; 
import java.awt.Color; 
import java.awt.Component; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 
import java.util.Timer; 
import java.util.TimerTask; 
class ListItem 
{ 
private Color color; 
private String value; 
public ListItem(Color c, String s) 
{ 
    color = c; 
    value = s; 
} 
public Color getColor() 
{ 
    return color; 
} 
public String getValue() 
{ 
    return value; 
} 
} 

class MyCellRenderer extends 
JLabel implements ListCellRenderer 
{ 
public MyCellRenderer() 
{ 
    setOpaque(true); 
} 
public Component getListCellRendererComponent(JList list, 
    Object value, // value to display 
     int index, // cell index 
     boolean iss, // is selected 
     boolean chf) // cell has focus? 
{ 
    System.out.println(" i cell-rendering "+CustomList.tid + " " 
    + CustomList.model.getSize() + " " + index+" "+CustomList.statusList.getValueIsAdjusting() + " "); 
    setText(((ListItem)value).getValue()); 
    setBackground(((ListItem)value).getColor()); 
    if (iss) 
    { 
    setBorder(BorderFactory.createLineBorder(Color.blue, 1)); 
    } 
    else 
    { 
    setBorder(BorderFactory.createLineBorder(list.getBackground(), 1)); 
    } 
    return this; 
} 
} 

public class CustomList 
{ 
public static DefaultListModel model; 
public static JList statusList; 
public static int tid = 0; 

public static void tidUr() 
{ 
    int delay = 1000; 
    int period = 1000; 
    Timer timer = new Timer(); 
    timer.scheduleAtFixedRate(new TimerTask() 
    { 
    public void run() 
    { 
    // model = new DefaultListModel(); 
    // statusList.setModel(model); 
    // statusList.setCellRenderer(new MyCellRenderer()); 
    model.clear(); 
    tid++; 
    ListItem li = new ListItem(Color.cyan, "test line one "+tid); 
    model.addElement(li); 
    li = new ListItem(Color.yellow, "foo foo foo foo foo"); 
    model.addElement(li); 
    li = new ListItem(Color.green, "quick brown fox"); 
    model.addElement(li); 
    } 
    }, delay, period); 
} 

public static void main(String args[]) 
{ 
    JFrame frame = new JFrame("Custom List Demo"); 
    frame.addWindowListener(new WindowAdapter() 
    { 
    public void windowClosing(WindowEvent e) 
    { 
    System.exit(0); 
    } 
    } 
    ); 

    model = new DefaultListModel(); 
    statusList = new JList(model); 
    statusList.setCellRenderer(new MyCellRenderer()); 

    ListItem li = new ListItem(Color.cyan, "test line one"); 
    model.addElement(li); 
    li = new ListItem(Color.yellow, "foo foo foo foo foo"); 
    model.addElement(li); 
    li = new ListItem(Color.green, "quick brown fox"); 
    model.addElement(li); 

    JPanel panel = new JPanel(); 
    panel.add(statusList); 
    frame.getContentPane().add("Center", panel); 
    frame.setLocation(300, 400); 
    frame.setSize(200, 200); 
    //frame.pack(); 
    frame.setVisible(true); 

    // tidUr(); 
    ActionListener actionListener = new ActionListener() { 
     public void actionPerformed(ActionEvent actionEvent) { 
      System.out.println("Hello World Timer"); 
      model.clear(); 
      tid++; 
      ListItem li = new ListItem(Color.cyan, "test line one "+tid); 
      model.addElement(li); 
      li = new ListItem(Color.yellow, "foo foo foo foo foo"); 
      model.addElement(li); 
      li = new ListItem(Color.green, "quick brown fox"); 
      model.addElement(li); 
     } 
     }; 

    javax.swing.Timer t2 = new javax.swing.Timer(1000, actionListener); 
    t2.start(); 

} 
} 

cevap

4

Yeniden boyamak istediğiniz sorunun ne olduğunu tam olarak açıklamaya çalıştığınızdan emin değilsiniz. Ancak, bu soruna hızlı bir şekilde göz atmak, güncellemeleri yapmak için bir Salınım Zamanlayıcısı kullanmanız gerektiğidir. Swing bileşenlerine yapılan tüm değişiklikler, Event Dispatch Thread üzerinde yapılmalıdır. Modeldeki değişiklikler, kendisini güncellemek için Swing bileşenini bilgilendireceğinden, güncellenen model EDT'de yapılmalıdır.

Daha fazla bilgi için, Swing eğiticisinden Concurrency bölümündeki bölümü okuyun.

+0

Teşekkürler! Bu sorunu çözdü ve java.util.Timer öğesinin Swing – Hans

+0

ActionListener actionListener = new ActionListener() { public void actionPerformed (ActionEvent actionEvent) { System.out.println ("Hello World Timer") ile birleştirilmesi için uygun olmadığını öğrendim. ; \t \t \t \t model.clear(); \t \t \t \t tid ++; \t \t \t \t ListItem li = new ListItem (Color.cyan, "test line one" + tid); \t \t \t \t model.addElement (li); \t \t \t li = new ListItem (Color.yellow, "foo foo foo foo foo"); \t \t \t \t model.addElement (li); \t \t \t li = new ListItem (Color.green, "hızlı kahverengi tilki"); \t \t \t \t model.addElement (li); } }; \t \t \t \t javax.swing.Timer t2 = new javax.swing.Timer (1000, actionListener); \t \t t2.start(); – Hans

2

java.util.Timer kullanmak yerine, Swing bileşenleriyle çalışmak üzere tasarlanmış olan javax.swing.Timer'u kullanmalısınız, bu büyük olasılıkla sizin probleminizdir. EDT daha başka bir iş parçacığı GUI güncelleştirir zaman, iyi iş gibi görünebilir

Salıncak bileşenleri sadece Olay Sevk Takip üzerine değiştirilebilir olabilir ve ("zaman zaman") tarif belirtiler normaldir ama sonra aniden bir şey "garip" olur.

+0

JTable hem java.util.Timer hem de javax.swing.Timer ile çalışır. JList javax.swing ile SADECE çalışır: Timer – Hans

+1

Bu java.util.Timer ile iyi çalışıyor gibi görünebilir, ancak Swing tek iş parçacığı politikası ihlal ediyor ve bu nedenle emin olamazsınız. – Uhlen

İlgili konular