Java 正在尝试创建进度条

Java 正在尝试创建进度条,java,events,timer,progress-bar,graphics2d,Java,Events,Timer,Progress Bar,Graphics2d,这只是一个力学练习。我试图创建三个自定义面板,它们控制自己的进度条。这是我为自己编写的一个时间管理程序的一部分,旨在进一步了解Java。较大的程序使用用户输入的日期为进度条的最小/最大值创建框架。这个程序和较大的程序都表现出相同的行为,多个条在时钟上赛跑 我遇到的问题是,如果我只有一个酒吧,一切似乎都很好,但当我有多个酒吧时,一切似乎都崩溃了。所以我写了这个小程序来测试一些东西。它非常简单,需要三个自定义面板,给它们一个标签,并使用计时器事件来更改标签和进度条的位置。我的问题是,如果数学排成一行

这只是一个力学练习。我试图创建三个自定义面板,它们控制自己的进度条。这是我为自己编写的一个时间管理程序的一部分,旨在进一步了解Java。较大的程序使用用户输入的日期为进度条的最小/最大值创建框架。这个程序和较大的程序都表现出相同的行为,多个条在时钟上赛跑

我遇到的问题是,如果我只有一个酒吧,一切似乎都很好,但当我有多个酒吧时,一切似乎都崩溃了。所以我写了这个小程序来测试一些东西。它非常简单,需要三个自定义面板,给它们一个标签,并使用计时器事件来更改标签和进度条的位置。我的问题是,如果数学排成一行(系统输出显示计算结果),而我每秒(1000毫秒)都在计数事件,为什么所有的事情都在倒数呢

请原谅我的代码缺乏形式。我更关心的是逻辑而不是形式

(下面的大部分内容都是从我的大程序中删去的,所以如果你看到一些无关的内容,它们确实有一个家) 先谢谢你

import javax.swing.*;
import javax.swing.Timer;
import java.awt.*;
import java.awt.Color;
import java.awt.event.*;
import java.awt.geom.*;
import java.util.*;

public class plaything extends JFrame implements ActionListener
{
myPanel[] mp = new myPanel[3];
JLabel[] jl = new JLabel[3];
short[] tim = new short[3];
short x = 0;
short t = 0; //used to stagger the clocks
short dateSaver; //holds temp dates

public plaything()
{
    setSize(400, 350);
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLayout(new GridLayout(3, 1) ); 

    for(short x = 0; x < 3; x++)
    {
        mp[x] = new myPanel();

        //sets all three bars to different 'times'
        dateSaver = (short)(10 + t) ;
        tim[x] = dateSaver;
        mp[x].setMax( dateSaver );

        jl[x] = new JLabel("Expires: " + dateSaver);
        this.add(mp[x]);
        mp[x].add( jl[x] );
        t += 15; // 15 seconds
    }

    Timer time = new Timer(1000, this);
    time.start();
}
public void actionPerformed(ActionEvent e)
{
    if ( x < 60 )
    {
        x++;
    } 
    else
    {
        x = 1;
    }
    for(myPanel m : mp)
    {
        m.tock();
    }
    for(short x = 0; x < 3; x++ )
    {
        mp[x].tock();
        jl[x].setText( "" + --tim[x]  );
    }
}


private class myPanel extends JPanel
{
//Fields
    private boolean finished = false;
    //(x,y) Coords
    private short x = 15;
    private short y = 50;
    //Size and shape
    private short width = 200;
    private short height = 10;
    private short arcSize = 10;
    //Bar essentials
    private double max; //highest range of bar
    private double fill = width; //sets filled in portion
    private double tick; //calculates movement per event
    private Color urgent = Color.BLUE; // Changes the color depending on the   Urgency

//Constructors
    public myPanel()
    {
        this.setBackground( Color.WHITE );
        repaint();
    }

//Mutators ( tick manipulation )
    public void setMax( double maxIn )
    {
        this.max = maxIn;
        System.out.println("Max: " + this.max );
        this.tick = (double)width / this.max;
        System.out.println("tick: " + this.tick );
    }

//Methods
    //Tick Manipulation
    public void tock()
    {   
        //Ends when zero
        if( fill < 1 )
        {
            fill = width;
            finished = true;
            tick = 0;
            urgent = Color.BLUE;
            repaint();
        }
        else
        {   
            fill -= tick ;
            System.out.println("fill is " + fill );
            repaint();
        }

    }
    //Paint method
    public void paint( Graphics g)
    {
        super.paint(g);
        Graphics2D g2 = (Graphics2D)g;
        g2.setColor( urgent );
        g2.draw(new RoundRectangle2D.Double(x,y + 40, width, height, arcSize, arcSize) );
        g2.fill(new RoundRectangle2D.Double(x,y + 40, fill , height, arcSize, arcSize) );
    }
 }
public static void main(String[] args)
  {
    plaything pt = new plaything();
    pt.setVisible(true);
  }
}
import javax.swing.*;
导入javax.swing.Timer;
导入java.awt.*;
导入java.awt.Color;
导入java.awt.event.*;
导入java.awt.geom.*;
导入java.util.*;
公共类plaything扩展JFrame实现ActionListener
{
myPanel[]mp=新的myPanel[3];
JLabel[]jl=新的JLabel[3];
short[]tim=新的short[3];
短x=0;
short t=0;//用于错开时钟
短日期保护程序;//保存临时日期
公共玩具
{
设置大小(400350);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(新的GridLayout(3,1));
用于(短x=0;x<3;x++)
{
mp[x]=新的myPanel();
//将所有三个条设置为不同的“时间”
日期保护程序=(短)(10+t);
tim[x]=日期保护程序;
mp[x].setMax(日期保护程序);
jl[x]=新的JLabel(“Expires:+dateSaver”);
添加(mp[x]);
mp[x].添加(jl[x]);
t+=15;//15秒
}
定时器时间=新定时器(1000,本次);
time.start();
}
已执行的公共无效操作(操作事件e)
{
如果(x<60)
{
x++;
} 
其他的
{
x=1;
}
用于(myPanel m:mp)
{
m、 tock();
}
用于(短x=0;x<3;x++)
{
mp[x].tock();
jl[x].setText(“+--tim[x]);
}
}
私有类myPanel扩展了JPanel
{
//田地
private boolean finished=false;
//(x,y)坐标
私人短x=15;
私人短y=50;
//大小和形状
私人短宽=200;
私人短高度=10;
专用短弧尺寸=10;
//酒吧必需品
private double max;//条的最大范围
private double fill=width;//在部分中填充的集合
private double tick;//计算每个事件的移动
private Color emergency=Color.BLUE;//根据紧急程度更改颜色
//建设者
公共事务委员会()
{
这个.背景(颜色.白色);
重新油漆();
}
//突变子(蜱虫操纵)
公共无效设置最大值(双最大值)
{
this.max=maxIn;
System.out.println(“Max:+this.Max”);
this.tick=(双)宽度/this.max;
System.out.println(“勾选:+this.tick”);
}
//方法
//蜱虫操纵
公屋
{   
//零时结束
如果(填充<1)
{
填充=宽度;
完成=正确;
勾号=0;
紧急=颜色。蓝色;
重新油漆();
}
其他的
{   
填充-=勾选;
System.out.println(“fill is”+fill);
重新油漆();
}
}
//油漆方法
公共空间涂料(图g)
{
超级油漆(g);
图形2d g2=(图形2d)g;
g2.设置颜色(紧急);
g2.绘制(新的圆形矩形2D.Double(x,y+40,宽度,高度,圆弧尺寸,圆弧尺寸));
g2.填充(新的圆形矩形2D.双精度(x,y+40,填充,高度,圆弧尺寸,圆弧尺寸));
}
}
公共静态void main(字符串[]args)
{
plaything pt=新的plaything();
pt.setVisible(真);
}
}
我真正关心的是,我的逻辑在酒吧和标签的进展方面哪里有缺陷。我希望找到如何使两者同时达到零。(仅在酒吧就进行了两天的研究和工作)

再次感谢您抽出时间。

您正在调用
tock()
两次
计时器的每次迭代:

    for(myPanel m : mp)
    {
        m.tock(); // ONCE
    }
    for(short x = 0; x < 3; x++ )
    {
        mp[x].tock(); // TWICE
        jl[x].setText( "" + --tim[x]  );
    }
for(myPanel m:mp)
{
m、 tock();//一次
}
用于(短x=0;x<3;x++)
{
mp[x].tock();//两次
jl[x].setText(“+--tim[x]);
}
您应该删除一个或另一个调用。

您正在调用
tock()
计时器的每个迭代两次:

    for(myPanel m : mp)
    {
        m.tock(); // ONCE
    }
    for(short x = 0; x < 3; x++ )
    {
        mp[x].tock(); // TWICE
        jl[x].setText( "" + --tim[x]  );
    }
for(myPanel m:mp)
{
m、 tock();//一次
}
用于(短x=0;x<3;x++)
{
mp[x].tock();//两次
jl[x].setText(“+--tim[x]);
}

你应该删除一个或另一个电话。

你说“一切都完了”,到底发生了什么,你能更具体一点吗?他们中的一个完成得很好,但是其他人马上就完成了吗?还是他们都马上就结束了?
System.out.println()
方法调用的输出是什么?这个程序发布后,所有三行都很快完成,第一行快5秒,第二行快12秒,最后一行快23秒。System.out的所有输出都是您所期望的。数学排好了队,但酒吧还是提前结束了。在我的大程序中,这是稍微模仿的。其中一个(最长的一个)正确完成,其余的都很快。你说,
“请原谅我的代码缺少形式。我更关心逻辑而不是形式。”
。这是好的,当你