이것은 역학에서의 연습에 지나지 않습니다. 자신의 진행률 표시 줄을 제어하는 세 개의 사용자 지정 패널을 만들려고합니다. 그것은 내가 자바에 대해 더 많이 배우기 위해 내가 쓰고있는 시간 관리 프로그램의 일부이다. 큰 프로그램은 사용자가 입력 한 날짜를 사용하여 진행률 막대의 최소/최대 프레임 워크를 만듭니다. 이 프로그램과 큰 프로그램 모두 시계를 경주하는 여러 바에서 같은 행동을 보입니다.진행률 막대를 만들려고 시도합니다.
내가 가지고있는 문제는 내가 하나의 막대 만 있으면 모든 것이 잘 작동하는 것처럼 보이지만 여러 가지가있을 때 모든 것이 바스 트되는 것으로 보입니다. 그래서 나는이 작은 프로그램을 써서 어떤 것을 시험해 보았다. 매우 간단하며 세 개의 사용자 정의 패널을 사용하고 레이블을 제공하며 타이머 이벤트를 사용하여 레이블 및 진행률 막대의 위치를 변경합니다. 내 질문은 (시스템 출력이 계산을 표시하는) 수학 라인을 올리면 매초마다 (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);
}
}
내 유일한 관심사는 막대 및 라벨의 진행과 관련하여 내 논리에 결함이있는 부분입니다. 두 방법 모두 함께 도달 할 수있는 방법을 찾으려고합니다. (단지 2 일간의 연구와 바에서의 작업)
다시 한번 감사드립니다. 당신은 두 번 Timer
의 모든 반복을 tock()
를 호출하고
"모든 것이 파열됩니다."정확히 무슨 일이 일어 났습니까? 더 구체적으로 할 수 있습니까? 그 중 하나가 제대로 끝나지만 나머지는 즉시 끝나나요? 아니면 모두 다 끝내나요? 'System.out.println()'메소드 호출의 결과는 무엇입니까? –
이 프로그램은 세 줄 모두 빠르게 끝내고 첫 번째 줄은 5 초, 두 번째 줄은 12 초, 마지막 줄은 거의 23 초 빠릅니다. System.out의 모든 출력은 사용자가 기대하는 것입니다. 수학 라인은 올라가지 만 막대는 여전히 일찍 끝납니다. 내 큰 프로그램에서 약간 벗어난 모델입니다. 하나 (가장 긴 것)가 올바르게 끝나고 모든 나머지는 빠르다. – Powe8525
당신이 말하길, "제 코드가 부족한 것을 용서해주세요. 나는 폼보다 로직에 더 관심이 있습니다." 자신 만의 코드를 작성하는 경우에는 괜찮습니다. 그러나 코드를 작성하고 다른 사람이 평가하고 이해하도록 시도 할 때, 특히 자원 봉사자에게 질문하면 잘못된 것입니다. 여기에 코드를 게시 할 때 적절한 형식을 사용하는 것은 우리의 시간과 노력에 대한 존중의 신호이며, 귀하의 이익을 위해 *** 노력을 다하기 위해 기꺼이 노력을 기울이고 있음을 보여줍니다. –