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

时间:2016-03-19 19:31:28

标签: java swing dialog jlist joptionpane

我一直在尝试创建一个创建对话框的程序,如果它们是素数,则检查前n个数字(在下面的代码中由int指定),然后将输出打印到窗口中,如下所示:

  

1 - 是的   2 - 是的   3 - 是的   4 - 错   5 - 真实

等...

我无法弄清楚如何让它变得动态和生动(即刷新),但是另一个论坛上的某人建议使用Jlist并将其设置为内容,我做了(如下所示),但......

  1. 窗口不是700x700,列表也不是。
  2. 列表是空的,或者至少我是这么认为的,因为我得到的是一个默认大小的窗口,以及一条白线作为唯一的内容。
  3. 代码:

    import javax.swing.JOptionPane;
    import java.awt.Dimension;
    import javax.swing.DefaultListModel;
    import javax.swing.JList;
    
    public class main {
    
    @SuppressWarnings("unused")
    public static void main(String[] args) {
        //make new string jlist, add numstr to it, and set list as contents 
        of window.
    
        String NumberStr = "";
    
        DefaultListModel<String> listModel = new DefaultListModel<>();
        listModel.addElement(NumberStr); 
    
        JList<String> list = new JList<>(listModel);
    
        JOptionPane Window = new JOptionPane();
        JOptionPane.showMessageDialog(Window, list, "Prime Number Generator", 
        JOptionPane.CANCEL_OPTION);
        Window.setPreferredSize(new Dimension(700,700));
        list.setPreferredSize(new Dimension(100, 100));
        Window.setVisible(true);
        //check if prime, append, update
        int y = 0;
        int z = 0;
        while (y<100){
            if (isPrime(z) == true){
                NumberStr += z + " true";
            } else {
                NumberStr += z + " false";
            }
            y++;
            z++;
        }
    }
    
    public static boolean isPrime (int x){
        int i = 1;
        boolean result = false;
        while (i<=x){
            if (i%x<0) {
                result = true;
            }else{
                result = false;;
            }
            i++;
            }
        return result;
        }
    }
    

2 个答案:

答案 0 :(得分:1)

你在这里创建字符串:

while (y<100){
    if (isPrime(z) == true){  
        NumberStr += z + " true";
    } else {
        NumberStr += z + " false";
    }
    y++;
    z++;
}

但你对它们一无所知,所以什么都不会显示出来。

你想使用JList,然后:

  • 创建新号码时,请将其添加到模型中:model.addElement(numberStr);
  • 最好在完成所有计算后显示GUI。
  • 在显示
  • 之前将JList添加到JScrollPane
  • 当你正在做的时候不要创建两个JOptionPanes(并且你显示错误的一个)。
  • 不要限制JList的大小。而是限制行数。
  • 如果您绝对想首先显示GUI然后使用长时间运行的代码更新它,您将不得不使用单独的线程进行计算,并且需要将结果排队到模型上关心和Swing事件线程。你确定要这么做吗?

另请注意,

  • if (isPrime(z) == true){应该更简单if (isPrime(z)) {
  • 所有变量都应以小写字母开头,因此numberStr,而不是NumberStr。

Key是while循环 - 你需要存储在那里创建的字符串:

while (y<100){
    if (isPrime(z)){  
        model.addElement(z + " true");
    } else {
        model.addElement(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;
    }
}

答案 1 :(得分:0)

我不太清楚你的意思&#34;我什么都不做他们&#34; ...我已经创建了一个模型并在其中添加了Numstr:

DefaultListModel<String> listModel = new DefaultListModel<>();
listModel.addElement(NumberStr); 
JList<String> list = new JList<>(listModel);

避风港?