在'中设置JLabel的文本。环

时间:2015-05-10 21:29:55

标签: java swing loops jlabel

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

  mep spring spring   meep2 winter

我希望标签olso在窗口上设置整个列表

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

2 个答案:

答案 0 :(得分:3)

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

如果要显示多行文本,请使用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);
   }

}

答案 1 :(得分:-1)

由于没有延迟,JLabel正在使用所有消息进行更改,但速度太快以至于不可见。要解决此问题,请创建一个线程并使线程与Thread.sleep(time)一起休眠。

如果要打印整个消息列表,请执行以下操作以更改JLabel: label.setText(label.getText()+“”+ messageYouWantToAdd);

我不知道您对邮件类的看法是什么,因此请将代码添加到标签中。