Это всего лишь упражнение по механике.Я пытаюсь создать три пользовательские панели, которые контролируют собственную индикатор выполнения.Это часть программы управления временем, которую я пишу для себя, чтобы узнать больше о 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);
}
}
Моя настоящая единственная проблема - где моя логическая ошибка в отношении последовательности баров и меток.Я надеюсь найти способ сделать так, чтобы оба достигли нуля вместе.(два дня исследований и работа только на одной решетке)
Еще раз спасибо за ваше время.