Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的实时更新、动态内容窗口_Java_Swing_Dialog_Jlist_Joptionpane - Fatal编程技术网

Java中的实时更新、动态内容窗口

Java中的实时更新、动态内容窗口,java,swing,dialog,jlist,joptionpane,Java,Swing,Dialog,Jlist,Joptionpane,我一直在尝试制作一个程序,创建一个对话框,检查前n个数字(在下面的代码中由int y指定)是否为素数,然后像这样将输出打印到窗口中: 1-正确 2-正确 3-正确 4-错误 5-正确 等等 我很难弄清楚如何使它动态和生动(即刷新),但另一个论坛上有人建议使用Jlist并将其设置为内容,我确实这样做了(正如您在下面看到的),但是 窗口不是700x700,列表也不是 列表是空的,或者至少我认为是空的,因为我得到的是一个默认大小的窗口,只有一条白线作为内容 代码: import javax.swing

我一直在尝试制作一个程序,创建一个对话框,检查前n个数字(在下面的代码中由int y指定)是否为素数,然后像这样将输出打印到窗口中:

1-正确 2-正确 3-正确 4-错误 5-正确

等等

我很难弄清楚如何使它动态和生动(即刷新),但另一个论坛上有人建议使用Jlist并将其设置为内容,我确实这样做了(正如您在下面看到的),但是

  • 窗口不是700x700,列表也不是
  • 列表是空的,或者至少我认为是空的,因为我得到的是一个默认大小的窗口,只有一条白线作为内容
  • 代码:

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