Java 写入以设置线程数的进度条数
我昨天发了帖子,当时我完全不知道进度条是如何工作的。在得到一些帮助和工作后,我有很多工作要做,但我在更新进度栏时遇到了困难 我试图使用我的setProgress方法,每次轮换时都发送更新,但这似乎不起作用 许多人告诉我使用swing计时器发送进度,但我似乎不知道如何实现它。如果有人能告诉我他们会怎么做,我会从中学到很多 编辑:要查看的重要位置很可能是Robot中的run方法和progressbar类的全部内容 代码当前的问题是没有更新进度 机器人类Java 写入以设置线程数的进度条数,java,timer,jprogressbar,Java,Timer,Jprogressbar,我昨天发了帖子,当时我完全不知道进度条是如何工作的。在得到一些帮助和工作后,我有很多工作要做,但我在更新进度栏时遇到了困难 我试图使用我的setProgress方法,每次轮换时都发送更新,但这似乎不起作用 许多人告诉我使用swing计时器发送进度,但我似乎不知道如何实现它。如果有人能告诉我他们会怎么做,我会从中学到很多 编辑:要查看的重要位置很可能是Robot中的run方法和progressbar类的全部内容 代码当前的问题是没有更新进度 机器人类 public class Robot impl
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中的方法名称按照约定以小写字母开头。您的
应该是设置、旋转、接合等
设置、旋转、接合等
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++);