2015-05-10 28 views
0

for循环中设置JLabel的文本时出现问题。该loopMessage()方法只需设置列表的第一个指标,但是当我打印出来,我可以看到所有的索引:在'for'循环中设置JLabel的文本

MEEP春天
meep2冬季

我想要的标签奥斯陆设置全列出窗口

public class ControllerMessage { 
    private ModelMessage mm; 
    private ViewMessage vm; 

    public ControllerMessage(ModelMessage mm, ViewMessage vm) { 
     this.mm = mm; 
     this.vm = vm; 
     loopMessage(); 
     addMessage(); 
     loopMessage(); 
    } 

    public void loopMessage() { 
     for (Message s : mm.getAllMessages()) { 
      System.out.println(s.getName() + " " + s.getDate()); 
      vm.setLabel(s.getName() + " " + s.getDate()); 
     } 
    } 

    public Message addMessage() { 
     return this.mm.addMessage(new Message(2, "meep2", "winter")); 
    } 
} 

视图类:

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class ViewMessage extends JFrame{ 

private JLabel additionLabel = new JLabel(); 

public ViewMessage() { 

    JPanel calcPanel = new JPanel(); 

    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    this.setSize(600, 600); 


    calcPanel.add(additionLabel); 

    this.add(calcPanel); 
} 

public void setLabel(String m){ 
    additionLabel.setText(m); 
} 
} 
+0

哪里的JLabel你提到? – Suspended

+1

请勿在注释中张贴代码,因为它丢失了格式使其无法读取。相反,通过[编辑您的问题](http://stackoverflow.com/posts/30156879/edit)将任何新代码发布到原始问题的底部。 –

回答

-1

由于没有延迟,JLabel正在更改所有消息,但速度非常快以至于不可见。为了解决这个问题,创建一个线程并让线程与Thread.sleep(time)一起睡觉。


如果要打印信息的整个列表以改变的JLabel做到这一点: label.setText(label.getText()+ “” + messageYouWantToAdd);

我不知道你在查看消息类是如何让你的代码添加文本到你的标签。

+0

在美国东部时间睡觉是不可取的,因为它会阻止UI被更新。如果我们假设op正在更新EDT之外的标签状态,那么它们违反了单线程摆动规则。在这两种情况下,都不可取 – MadProgrammer

3

JLabel只能容纳一个字符串,通常是一行文本。如果您想在循环中显示文本,但在指定的时间段内显示文本,然后显示下一个文本 - 请使用摆动计时器。这将使您不必显式创建后台线程,因为Timer的ActionListener代码保证在Swing事件线程上调用,因此需要注意后台线程中的所有Swing代码调用都排队到事件线程上。

如果要显示多行文本,请使用JTextArea或JList。我的猜测是你真的想使用JList。

例如,

// better to extend JPanel than JFrame, since this makes your code more flexible. 
public class ViewMessage extends JPanel { 
    private static final int LIST_WIDTH = 40; 
    private static final int VISIBLE_ROWS = 20; 
    private DefaultListModel<String> listModel = new DefaultListModel<>(); 
    private JList<String> messageList = new JList<>(listModel); 
    private JLabel additionLabel = new JLabel(); 

    public ViewMessage() { 
     // set the width of the JList 
     String listWidth = String.valueOf(LIST_WIDTH); 
     String prototypeValue = String.format("%" + listWidth + "s", " "); 
     messageList.setPrototypeCellValue(prototypeValue); 

     // set the number of JList rows visible in the scrollpane 
     messageList.setVisibleRowCount(VISIBLE_ROWS); 

     setLayout(new BorderLayout()); 
     add(new JScrollPane(messageList)); 
    } 

    public void appendMessage(String message) { 
     listModel.addElement(message); 
    } 

} 
+0

谢谢,这真的很有用,我喜欢JList。 – Sivar

+0

@Sivar:很划算! –