Java中的实时更新、动态内容窗口
我一直在尝试制作一个程序,创建一个对话框,检查前n个数字(在下面的代码中由int y指定)是否为素数,然后像这样将输出打印到窗口中: 1-正确 2-正确 3-正确 4-错误 5-正确 等等 我很难弄清楚如何使它动态和生动(即刷新),但另一个论坛上有人建议使用Jlist并将其设置为内容,我确实这样做了(正如您在下面看到的),但是Java中的实时更新、动态内容窗口,java,swing,dialog,jlist,joptionpane,Java,Swing,Dialog,Jlist,Joptionpane,我一直在尝试制作一个程序,创建一个对话框,检查前n个数字(在下面的代码中由int y指定)是否为素数,然后像这样将输出打印到窗口中: 1-正确 2-正确 3-正确 4-错误 5-正确 等等 我很难弄清楚如何使它动态和生动(即刷新),但另一个论坛上有人建议使用Jlist并将其设置为内容,我确实这样做了(正如您在下面看到的),但是 窗口不是700x700,列表也不是 列表是空的,或者至少我认为是空的,因为我得到的是一个默认大小的窗口,只有一条白线作为内容 代码: import javax.swing
import javax.swing.JOptionPane;
导入java.awt.Dimension;
导入javax.swing.DefaultListModel;
导入javax.swing.JList;
公共班机{
@抑制警告(“未使用”)
公共静态void main(字符串[]args){
//创建新字符串jlist,向其中添加numstr,并将列表设置为内容
窗边。
字符串NumberStr=“”;
DefaultListModel listModel=新的DefaultListModel();
listModel.addElement(NumberStr);
JList list=新的JList(listModel);
JOptionPane Window=新建JOptionPane();
showMessageDialog(窗口,列表,“素数生成器”,
JOptionPane.CANCEL_选项);
设置首选尺寸(新尺寸(700700));
list.setPreferredSize(新维度(100100));
Window.setVisible(true);
//检查prime、append、update
int y=0;
int z=0;
(y您在此处创建字符串时:
while (y<100){
if (isPrime(z) == true){
NumberStr += z + " true";
} else {
NumberStr += z + " false";
}
y++;
z++;
}
更好的是:
import javax.swing.*;
public class Foo {
public static void main(String[] args) {
DefaultListModel<String> listModel = new DefaultListModel<>();
// get rid of this, doesn't help
// listModel.addElement(numberStr);
JList<String> list = new JList<>(listModel);
// don't restrict the list's size, rather set its row count
// list.setPreferredSize(new Dimension(100, 100));
list.setVisibleRowCount(10);
// check if prime, append, update
int y = 0;
while (y < 100) {
listModel.addElement(String.format("%d %b", y, isPrime(y)));
y++;
}
JOptionPane.showMessageDialog(null, new JScrollPane(list));
}
// simplify
public static boolean isPrime(int x) {
int i = 2;
while (i < x) {
if (x % i == 0) {
return false;
}
i++;
}
return true;
}
}
import javax.swing.*;
公开课Foo{
公共静态void main(字符串[]args){
DefaultListModel listModel=新的DefaultListModel();
//摆脱这个,没用
//listModel.addElement(numberStr);
JList list=新的JList(listModel);
//不要限制列表的大小,而是设置其行数
//list.setPreferredSize(新维度(100100));
list.setVisibleRowCount(10);
//检查prime、append、update
int y=0;
而(y<100){
addElement(String.format(“%d%b”,y,isPrime(y));
y++;
}
showMessageDialog(null,新的JScrollPane(列表));
}
//简化
公共静态布尔值iPrime(int x){
int i=2;
而(i
我不太明白你所说的“我什么都不做”是什么意思……我已经创建了一个模型,并在这里添加了Numstr:
DefaultListModel<String> listModel = new DefaultListModel<>();
listModel.addElement(NumberStr);
JList<String> list = new JList<>(listModel);
DefaultListModel listModel=新的DefaultListModel();
listModel.addElement(NumberStr);
JList list=新的JList(listModel);
我没有吗?如果您的主要计算正在进行中,则需要在后台线程中运行计算。相反,将字符串结果保存到JList的模型中会更容易进行所有计算(您没有这样做,只是忽略了返回的字符串),然后在完成所有计算后,显示您的JList。如果您选择后一种更简单的方法,则在创建NumberStr变量后,您仍然需要对其执行某些操作--您需要将其添加到JList的模型中。因此,创建一个DefaultListModel
对象,…使用它来创建JList(将上面的模型对象传递到JList的构造函数中),每次创建新的numberStr变量时,使用其addElement(…)将其添加到模型中
method。是的,我错了,我现在看到了模型,但我说的是在您的while循环中--您对while循环中创建的字符串对象不做任何操作。请参阅进一步的编辑以回答问题。我认为您的错误是,您将空白字符串添加到列表模型中,然后在while循环中,您正在更改tring变量引用--但这对添加到列表模型中的原始字符串没有影响--它仍然是空的。这是变量和对象之间的核心区别。字符串对象是不可变的,不能更改,因此每次对String变量调用+=时,您都在创建一个新字符串,但原始字符串ng对象再次保持不变。
import javax.swing.*;
public class Foo {
public static void main(String[] args) {
DefaultListModel<String> listModel = new DefaultListModel<>();
// get rid of this, doesn't help
// listModel.addElement(numberStr);
JList<String> list = new JList<>(listModel);
// don't restrict the list's size, rather set its row count
// list.setPreferredSize(new Dimension(100, 100));
list.setVisibleRowCount(10);
// check if prime, append, update
int y = 0;
while (y < 100) {
listModel.addElement(String.format("%d %b", y, isPrime(y)));
y++;
}
JOptionPane.showMessageDialog(null, new JScrollPane(list));
}
// simplify
public static boolean isPrime(int x) {
int i = 2;
while (i < x) {
if (x % i == 0) {
return false;
}
i++;
}
return true;
}
}
DefaultListModel<String> listModel = new DefaultListModel<>();
listModel.addElement(NumberStr);
JList<String> list = new JList<>(listModel);