Java 写入以设置线程数的进度条数

Java 写入以设置线程数的进度条数,java,timer,jprogressbar,Java,Timer,Jprogressbar,我昨天发了帖子,当时我完全不知道进度条是如何工作的。在得到一些帮助和工作后,我有很多工作要做,但我在更新进度栏时遇到了困难 我试图使用我的setProgress方法,每次轮换时都发送更新,但这似乎不起作用 许多人告诉我使用swing计时器发送进度,但我似乎不知道如何实现它。如果有人能告诉我他们会怎么做,我会从中学到很多 编辑:要查看的重要位置很可能是Robot中的run方法和progressbar类的全部内容 代码当前的问题是没有更新进度 机器人类 public class Robot impl

我昨天发了帖子,当时我完全不知道进度条是如何工作的。在得到一些帮助和工作后,我有很多工作要做,但我在更新进度栏时遇到了困难

我试图使用我的setProgress方法,每次轮换时都发送更新,但这似乎不起作用

许多人告诉我使用swing计时器发送进度,但我似乎不知道如何实现它。如果有人能告诉我他们会怎么做,我会从中学到很多

编辑:要查看的重要位置很可能是Robot中的run方法和progressbar类的全部内容

代码当前的问题是没有更新进度

机器人类

public class Robot implements Runnable{
public static final int on = 0x0001;
public static final int clockwise = 0x0002;
public static final int counter = 0x0004;
int  opcode;
int moveCount = 0;
int rotation, increment, progress = 0;
boolean CW;

ProgressBar prgBar;
CyclicBarrier cyclicBarrier;
Controller c;
Motor m;

public Robot(CyclicBarrier cyclicBarrier, Motor m)
{
    opcode = 0;
    this.cyclicBarrier = cyclicBarrier;
    this.m = m;
}


public Boolean Set(int value)
{
    boolean bvalue = false;
    switch (value)
    {
    case on : 
        bvalue = true;
        break;
    case clockwise :
        if ( (opcode & counter) == 0 )
            bvalue = true;
        break;
    case counter :
        if ( (opcode & clockwise) == 0 )
            bvalue = true;
        break;
    }
    if (bvalue == true)
        opcode += value;
    return bvalue;
}

private String Validate()
{
    String sresult = "Executing: ";
    boolean bvalue = false;
    if ((opcode & on) > 0)
    {
        bvalue = true;
        sresult = "On";
        if ((opcode & (clockwise+counter)) == (clockwise+counter))
            bvalue = false;
        if (bvalue == true)
        {   
            if ((opcode & clockwise) > 0)
                sresult +="+Clockwise";
            if ((opcode & counter) > 0)
                sresult += "+Counter";
        }
        if (bvalue == false)
            sresult = "Invalid opcode";
    }
    return sresult;
}

public void robotExecute()
{
    String svalue = Validate();
    System.out.println(svalue);
    opcode = 0;
}

public void setOn(ProgressBar prgBar){
    this.prgBar = prgBar;
    Set(1);
}


public void run(){
    System.out.println("Running: ");


    m.Engage(this);
    prgBar.setProgress(this, progress);
    try {
        System.out.println("Sleeping: ");
        Thread.sleep(3000);
        cyclicBarrier.await();

    } catch (Exception e){
        e.printStackTrace();
    }
    System.out.println("Engaging: ");
}

public void Rotate(){
        if ((opcode & clockwise) > 0){
            rotation++;
            if(rotation == 360){
                rotation = 0;
                moveCount++;
            }
        }
        if ((opcode & counter) > 0){
            rotation--;
            if(rotation == -360){
                rotation = 0;
                moveCount --;
            }
        }
        prgBar.setProgress(this, progress);
}
}
进度条

public class ProgressBar implements ActionListener {

final int MAX = 100;
final JFrame frame = new JFrame("JProgress ");
final JProgressBar pbOne = new JProgressBar();
final JProgressBar pbTwo = new JProgressBar();
final JProgressBar pbThree = new JProgressBar();

private Map<Robot, JProgressBar> robotBars = new HashMap<>();

    public ProgressBar(){ 

        pbOne.setMinimum(0);
        pbOne.setMaximum(MAX);
        pbOne.setStringPainted(true);

        pbTwo.setMinimum(0);
        pbTwo.setMaximum(MAX);
        pbTwo.setStringPainted(true);

        pbThree.setMinimum(0);
        pbThree.setMaximum(MAX);
        pbThree.setStringPainted(true);

        frame.setLayout(new FlowLayout());
        frame.getContentPane().add(pbOne);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300, 200);
        frame.setVisible(true);
    }

    public ProgressBar(Robot[] robots){
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300, 200);
        frame.setVisible(true);

        for(Robot r: robots) {
            JProgressBar bar = new JProgressBar();
            robotBars.put(r, bar);
            bar.setMinimum(0);
            bar.setMaximum(MAX);
            frame.setLayout(new FlowLayout());
            frame.add(bar);
        }

        /*Timer timer = new Timer(1000, new ActionListener(){
            public void actionPerformed(ActionEvent evt){
                bar.setValue(progress);
            }
        });*/
    }


    public void setProgress(Robot r, int progress){

        final JProgressBar bar = robotBars.get(r);
        if(bar == null) { return;}
        try{
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    bar.setValue(progress);
                }
            });
            java.lang.Thread.sleep(100);
        } catch (InterruptedException e) {
        JOptionPane.showMessageDialog(frame, e.getMessage());
        }
    }
}

在调查中,你有几个问题

您创建GUI的方式不正确,因此会导致您的
JProgressBar
s不出现在框架中。 基本上是在
ProgressBar(Robot[])
中进行操作

frame.setSize(300, 200);
frame.setVisible(true);
在添加进度条之前,这是一个问题。在添加子项之前调用
setSize(…)…setVisible(true)
会导致不可预测的行为。如果在添加进度条后将这两行移动到,则它们应显示在框架中;然而,你所做的不是一个好的风格

我想推荐像这样的东西

Container pane = frame.getContentPane();
pane.setLayout(new BoxLayout(pane, BoxLayout.Y_AXIS));

for(Robot r: robots) {
    JProgressBar bar = new JProgressBar();
    robotBars.put(r, bar);
    bar.setMinimum(0);
    bar.setMaximum(MAX);
    pane.add(bar);
}

frame.pack();
frame.setVisible(true);
使用和调用可自动调整帧的大小

您也不是,基本上您的
main
逻辑需要包装在对
invokeLater
的调用中。调用
join
,这会使问题变得复杂。也许一个快速解决方法是:

public static void main(String[] args){
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            // ... create GUI ... create Threads ...

            new Thread(new Runnable() {
                @Override
                public void run() {
                    // ... start Threads ... join Threads ...
                }
            }).start();
        }
    }
}
您没有更新
进度
,因此
进度
始终为0。 我不确定你到底想如何更新进度。为了进行测试,我将其更改为:

//                               vv
prgBar.setProgress(this, progress++);

完成这些操作后,我看到框架中的
JProgressBar
s,并看到它们在更新:


其他事项:

  • 将替换
    线程
    s。可能您的
    电机
    会创建一个
    计时器
    ,在计时器事件中进行旋转。这将代替调用
    sleep
    来管理旋转增量
  • Java中的方法名称按照约定以小写字母开头。您的
    设置、旋转、接合等
    应该是
    设置、旋转、接合等

这里的症状是什么?有什么问题吗?考虑发布一个问题。我包括了所有的代码,以防有人想调试,但是MCVE将是我的Robot类和ProgressBar类,另外两个对问题不重要。哦,谢谢。我错过了这个,但是除了盒子的布局之外,我最终做的和你在这里说的差不多。它现在正在工作。非常感谢你的建议。这些方法实际上是我的导师给我的,非常有趣,是的,我确实记得命名惯例。我会换的。如果你认为这足够解决问题的话,你可以。哦,谢谢你让我知道。我不知道,对不起。我想知道我怎么能给你一个信用,因为你的回答没有投票权。。。
public static void main(String[] args){
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            // ... create GUI ... create Threads ...

            new Thread(new Runnable() {
                @Override
                public void run() {
                    // ... start Threads ... join Threads ...
                }
            }).start();
        }
    }
}
//                               vv
prgBar.setProgress(this, progress++);