2012-12-09 60 views
1

所以這是我的情況: 我有一個計時器,它在後臺更新值,直到某個值達到某個點。爲什麼我不能刷新ListWindow的內容

但爲了讓我看到每次更新的值,我現在必須在 「新的ListWindow();」中添加語句在我的for循環中。

import java.awt.event.*; 
import java.awt.*; 
import javax.swing.*; 
/** 
* Write a description of class Timing here. 
* 
* @author (your name) 
* @version (a version number or a date) 
*/ 
public class Timing 
{ 

/** 
* Constructor for objects of class Timing 
*/ 
public static void Timer() 
    { 
    Timer timer = new Timer(250, new TimerListener()); 
    timer.start(); 
    } 

private static class TimerListener implements ActionListener 
    { 
    public void actionPerformed(ActionEvent e) 
    { 
     while(valX != 100) 
     { 
      Timer(); 
      MainProg.valX += 5; 
      // new ListWindow(); //statement goes here. it creates a new window 
           //each time it updates the value. 
     } 
    } 
    } 
} 

我的問題是:我不想要一個新窗口。我想要這個值來自的列表(見下文)來更新它的值並刷新當前窗口中的列表。也許在一個按鈕上單擊。

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

/** 
* Write a description of class ListWindow here. 
* 
* @author (your name) 
* @version (a version number or a date) 
*/ 
public class ListWindow extends JFrame 
{ 
    private JPanel StatsPanel; //holds stats 
    private JPanel ButtonPanel; //holds stats 
    private JList StatList; //inventory 

    private JButton RefreshButton; // a button 

    private String[] Stats = 
       {"Stuff " + Stuff, "Value " + valX, "Test " + per}; 

/** 
* Constructor 
*/ 
public ListWindow() 
{ 
    setTitle("STATS"); 

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    setLayout(new BorderLayout()); 

    buildStatsPanel(); 
    buildButtonPanel(); 
    RefreshButton.addActionListener(new ButtonListener()); 
    add(StatsPanel, BorderLayout.CENTER); 
    add(ButtonPanel, BorderLayout.SOUTH); 

    pack(); 
    setVisible(true); 
} 

public void buildStatsPanel() 
{ 
    StatsPanel = new JPanel(); 

    StatList = new JList(Stats); 

    StatList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 



    StatsPanel.add(StatList); 
} 

public void buildButtonPanel() 
{ 
    ButtonPanel = new JPanel(); 

    RefreshButton = new JButton("Refresh"); 

    ButtonPanel.add(RefreshButton); 

} 
private class ButtonListener 
implements ActionListener 
{ 
    public void actionPerformed(ActionEvent e) 
    { 
     String actionCommand = e.getActionCommand(); 
     if(actionCommand.equals("Refresh")) 
     { 
      pack(); 
      invalidate(); 
      validate(); 
     } 
    } 
} 

public void RunMain(String[] args) 
{ 
    new ListWindow(); 
} 

} 

另外:這是我從中運行的主要方法。你還應該注意到,我在我粘貼的其他兩個片段中有主要方法。我這樣做是爲了讓我可以單獨運行,以便快速調試和將來使用。

/** 
* Write a description of class MainProg here. 
* 
* @author (your name) 
* @version (a version number or a date) 
*/ 
public class MainProg 
{ 
public static int stuff = 100; 
public static int valX = 0; 
public static int per = 100;  
/** 
* Constructor for objects of class Game 
*/ 
public static void main() 
{ 
    new MoveWindow(); 
    new ListWindow(); 
    while (valX != 100) 
    { 
     Timing.Timer(); 
    } 
} 
} 

我對Java很新,我找了其他解決方案,無法找到我認爲我需要的東西。也許我確實找到了它,並沒有認識到它是一種解決方案。

所有的幫助表示讚賞,在此先感謝。

+0

使用新值調用更新列表的函數(默認JList相當不靈活,您可能需要使用不同的ListModel而不是默認值)。 –

回答

0

調用,更新列表的功能(供應對象數組時使用的默認JListListModel是相當不靈活,您可能需要使用不同的ListModel而不是默認的)新值。

+0

我假設你所建議的效果看起來與此類似? [鏈接](http://www.java2s.com/Code/Java/Swing-JFC/JListwithaDefaultListModel.htm的示例) 我後來有什麼類似的效果。 我想在我的代碼中更新valX值的計時器,並在面板中更新它。從我可以看到,雖然這個鏈接中的代碼完全刪除項目,並添加新的項目,而不是改變它們。 –

+0

除非更改ListModel,否則不能更改單個元素。請參閱http://docs.oracle.com/javase/1.4.2/docs/api/javax/swing/JList.html中的示例代碼 「數據的只讀視圖」 –

+0

謝謝!我嘗試了一些東西,看看我能做些什麼。 –