2011-12-12 3 views
1

이것은 역학에서의 연습에 지나지 않습니다. 자신의 진행률 표시 줄을 제어하는 ​​세 개의 사용자 지정 패널을 만들려고합니다. 그것은 내가 자바에 대해 더 많이 배우기 위해 내가 쓰고있는 시간 관리 프로그램의 일부이다. 큰 프로그램은 사용자가 입력 한 날짜를 사용하여 진행률 막대의 최소/최대 프레임 워크를 만듭니다. 이 프로그램과 큰 프로그램 모두 시계를 경주하는 여러 바에서 같은 행동을 보입니다.진행률 막대를 만들려고 시도합니다.

내가 가지고있는 문제는 내가 하나의 막대 만 있으면 모든 것이 잘 작동하는 것처럼 보이지만 여러 가지가있을 때 모든 것이 바스 트되는 것으로 보입니다. 그래서 나는이 작은 프로그램을 써서 어떤 것을 시험해 보았다. 매우 간단하며 세 개의 사용자 정의 패널을 사용하고 레이블을 제공하며 타이머 이벤트를 사용하여 레이블 및 진행률 막대의 위치를 ​​변경합니다. 내 질문은 (시스템 출력이 계산을 표시하는) 수학 라인을 올리면 매초마다 (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()를 호출하고

+0

"모든 것이 파열됩니다."정확히 무슨 일이 일어 났습니까? 더 구체적으로 할 수 있습니까? 그 중 하나가 제대로 끝나지만 나머지는 즉시 끝나나요? 아니면 모두 다 끝내나요? 'System.out.println()'메소드 호출의 결과는 무엇입니까? –

+0

이 프로그램은 세 줄 모두 빠르게 끝내고 첫 번째 줄은 5 초, 두 번째 줄은 12 초, 마지막 줄은 거의 23 초 빠릅니다. System.out의 모든 출력은 사용자가 기대하는 것입니다. 수학 라인은 올라가지 만 막대는 여전히 일찍 끝납니다. 내 큰 프로그램에서 약간 벗어난 모델입니다. 하나 (가장 긴 것)가 올바르게 끝나고 모든 나머지는 빠르다. – Powe8525

+1

당신이 말하길, "제 코드가 부족한 것을 용서해주세요. 나는 폼보다 로직에 더 관심이 있습니다." 자신 만의 코드를 작성하는 경우에는 괜찮습니다. 그러나 코드를 작성하고 다른 사람이 평가하고 이해하도록 시도 할 때, 특히 자원 봉사자에게 질문하면 잘못된 것입니다. 여기에 코드를 게시 할 때 적절한 형식을 사용하는 것은 우리의 시간과 노력에 대한 존중의 신호이며, 귀하의 이익을 위해 *** 노력을 다하기 위해 기꺼이 노력을 기울이고 있음을 보여줍니다. –

답변

4

:

for(myPanel m : mp) 
    { 
     m.tock(); // ONCE 
    } 
    for(short x = 0; x < 3; x++) 
    { 
     mp[x].tock(); // TWICE 
     jl[x].setText("" + --tim[x] ); 
    } 

당신은 하나의 호출, 또는 다른 사람을 제거해야합니다.

+0

좋은 캐치. 1+ 표. –

+0

하하 감사합니다. 무슨 일이 일어나고 있는지 파악하기 위해 한두 자리 변수 이름을 통해 잡초를 제거하기가 어려웠습니다. –

+0

와우 나는 너무 피곤해서 완전히 그걸 놓쳤다! 이제이 모델은 잘 작동합니다. 왜 이것이 큰 코드가 아닌 작동하는지에 대한 질문을 던집니다. 유일한 차이점은 탭 패널입니다. Craig 대단히 감사합니다! 첫 번째 줄은 내가 어떻게하면 m을 사용하여 내 레이블을 반복 할 수 없다는 것을 깨닫기 전까지 반복 할 것입니다. 아직도 내 청소를 봐야 해. – Powe8525

관련 문제