Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.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 SwingWorker中setProgress的无法解释的行为_Java_Jtextpane_Swingworker_Jprogressbar - Fatal编程技术网

Java SwingWorker中setProgress的无法解释的行为

Java SwingWorker中setProgress的无法解释的行为,java,jtextpane,swingworker,jprogressbar,Java,Jtextpane,Swingworker,Jprogressbar,为了测试publish()和setProgress()方法,我对SwingWorker进行了快速而肮脏的实现。当我为setProgress()方法设置参数(如下面完整的源代码中所述)时,一切正常。 但是,如果我这样设置setProgress参数: setProgress((int)((i/2000)*100)) 还是像这样 setProgress((int)(i*(100/2000)) progressbar未更新,因为未触发propertyChange 我真的不知道这是为什么,因为在我看来,我

为了测试publish()和setProgress()方法,我对SwingWorker进行了快速而肮脏的实现。当我为setProgress()方法设置参数(如下面完整的源代码中所述)时,一切正常。 但是,如果我这样设置setProgress参数:
setProgress((int)((i/2000)*100))
还是像这样
setProgress((int)(i*(100/2000))

progressbar未更新,因为未触发propertyChange

我真的不知道这是为什么,因为在我看来,我没有看到任何数学上的错误

有什么想法吗

提前谢谢

致意

package test;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.util.LinkedList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.SwingWorker;
import javax.swing.text.BadLocationException;
import javax.swing.text.StyledDocument;

public class ConsoleTest extends SwingWorker<Void, String>{ 

private JTextPane console;
private JProgressBar pb;

public ConsoleTest(JProgressBar pb, JTextPane out){

    this.console = out;
    this.pb = pb;
}

private static void createGUI(){

    JFrame container = new JFrame();
    container.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JTextPane console = new JTextPane();
    JButton start = new JButton("start");
    JButton reset = new JButton("reset");
    JPanel btnpane = new JPanel();
    btnpane.add(start);
    btnpane.add(reset);
    btnpane.add(new JCheckBox( "Click me to proof UI is responsive" ));
    JProgressBar pb = new JProgressBar(0,100);
    btnpane.add(pb);
    container.add(btnpane, BorderLayout.SOUTH);

    JScrollPane sp = new JScrollPane(console);
    sp.setPreferredSize(new Dimension(800,800));
    container.add(sp,BorderLayout.NORTH);

    start.addActionListener(e -> { ConsoleTest test = new ConsoleTest(pb, console);
                                   test.addPropertyChangeListener(evt -> { if ("progress".equals(evt.getPropertyName())) {
                                                                             System.out.println("check");
                                                                             test.getPG().setValue((int)evt.getNewValue());
                                                                           }                                                                                  
                                                                         });
                                   test.execute();
                                 });
    reset.addActionListener(e -> clear(console));
    container.pack();
    container.setVisible(true);


}

private static void clear(JTextPane console) {

    console.setText("");
}



public JProgressBar getPG(){

    return this.pb;
}

@Override
protected Void doInBackground() throws Exception {

    LinkedList<Integer> list = new LinkedList<>();
    for (int i = 0; i< 2000;i++){
        list.add(i);
        if(((i+1) % 5) == 0)
            publish(Integer.toString(i+1));
        setProgress((int) (i*100/2000));
        Thread.sleep(1);            
    }
    return null;
}

@Override
protected void process(List<String> chunks){

        StyledDocument doc = this.console.getStyledDocument();
        try {
            for(String s: chunks)
            doc.insertString(doc.getLength(),"- "+s+" elements added to the list\n", null);
        } catch (BadLocationException e) {
            e.printStackTrace();
        }       
}


@Override
protected void done() {

    try {
        System.out.println("DONE!!!");
    } 
    catch (Exception ignore) {
    }
}

public static void main(String[] args) {

    createGUI();
}
封装测试;
导入java.awt.BorderLayout;
导入java.awt.Dimension;
导入java.util.LinkedList;
导入java.util.List;
导入javax.swing.JButton;
导入javax.swing.JCheckBox;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JProgressBar;
导入javax.swing.JScrollPane;
导入javax.swing.JTextPane;
导入javax.swing.SwingWorker;
导入javax.swing.text.BadLocationException;
导入javax.swing.text.StyledDocument;
公共类控制台测试扩展SwingWorker{
专用JTextPane控制台;
私人JProgressBar pb;
公共控制台测试(JProgressBar pb、JTextPane out){
this.console=out;
这是1.pb=pb;
}
私有静态void createGUI(){
JFrame容器=新的JFrame();
container.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JTextPane控制台=新的JTextPane();
JButton start=新JButton(“start”);
JButton reset=新JButton(“reset”);
JPanel btnpane=新的JPanel();
btnpane.add(开始);
btnpane.add(重置);
添加(新的JCheckBox(“单击我以证明UI响应”);
JProgressBar pb=新的JProgressBar(0100);
添加(pb);
container.add(btnpane,BorderLayout.SOUTH);
JScrollPane sp=新的JScrollPane(控制台);
sp.setPreferredSize(新尺寸(800800));
添加(sp,BorderLayout.NORTH);
start.addActionListener(e->{ConsoleTest test=newconsoletest(pb,console);
test.addPropertyChangeListener(evt->{if(“progress”).equals(evt.getPropertyName()){
系统输出打印项次(“检查”);
test.getPG().setValue((int)evt.getNewValue());
}                                                                                  
});
test.execute();
});
reset.addActionListener(e->clear(控制台));
container.pack();
container.setVisible(true);
}
专用静态无效清除(JTextPane控制台){
console.setText(“”);
}
公共JProgressBar getPG(){
返回此.pb;
}
@凌驾
受保护的Void doInBackground()引发异常{
LinkedList=新建LinkedList();
对于(int i=0;i<2000;i++){
列表.添加(i);
如果(((i+1)%5)==0)
发布(Integer.toString(i+1));
环境运输及工务局局长(国际)(i*100/2000);;
睡眠(1);
}
返回null;
}
@凌驾
受保护的无效进程(列表块){
StyledDocument doc=this.console.getStyledDocument();
试一试{
for(字符串s:块)
doc.insertString(doc.getLength(),添加到列表中的“-”+s+”元素\n“,null);
}捕获(错误位置异常e){
e、 printStackTrace();
}       
}
@凌驾
受保护的void done(){
试一试{
System.out.println(“完成!!!”;
} 
捕获(异常忽略){
}
}
公共静态void main(字符串[]args){
createGUI();
}
}你应该把(i*100)/2000 公式是

(当前状态*100)/最终状态


你用整数工作

setProgress((int) ((i/2000)*100));
总是
0
,因为
(int)i/2000
总是
0


同样的问题

setProgress((int) (i*(100/2000)));
100/2000
始终是
0
整数

试试看

setProgress((int) (((float)i/2000)*100));


它会起作用的

不知何故编辑“吃”了多重符号不知何故编辑吃了我的“*”符号。文档中有没有写过必须是这样的?从数学上讲,(i*100)/2000与i*(100/2000)相同,因为您使用int作为最终类型,而不进行浮点转换100/2000始终为零,因此进度保持为0。
setProgress((int) (i*((float)100/2000)));