我在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);
}
}
答案 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);
我不知道您对邮件类的看法是什么,因此请将代码添加到标签中。