2014-09-23 1 views
1

간단한 프로그램에 JProgressBar를 추가하려고합니다. 지금까지 내가 그것을 표시 할 수 있지만 하나만 보여주고 싶어하는 동안 그것은 여러 인스턴스를 추가합니다.JProgressBar 자체적으로 여러 번 인스턴스화

package package1; 
import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Font; 
import java.awt.Graphics; 

import javax.swing.JPanel; 
import javax.swing.JProgressBar; 

public class Opening extends JPanel { 
    private JProgressBar loadingBar; 
    private Thread t; 

public void paintComponent(Graphics g) 
{ 
    super.paintComponent(g);  
    //Loading bar 
    bar(); 
} 

private void bar() 
{ 
    loadingBar = new JProgressBar(); 
    t = new Thread(new LoadMyBar()); 

    this.add(loadingBar).setLocation(25, 600); 
    loadingBar.setSize(625, 25); 
    loadingBar.setStringPainted(true); 
    loadingBar.setValue(0); 
    loadingBar.setMinimum(0); 
    loadingBar.setMaximum(100); 
    t.start(); 
} 

class LoadMyBar implements Runnable 
{ 
    public void run(){ 
     for(int i = loadingBar.getMinimum(); i <= loadingBar.getMaximum(); i++) 
     { 
      loadingBar.setValue(i); 
      try 
      { 
       t.sleep(1000); 
      }catch(InterruptedException e) 
      { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

}

어떤 생각이 내가 잘못하고있는 무슨에 : 여기

enter image description here 코드인가?

답변

5

귀하는 paintComponent(Graphics g) 방법 중 bar()으로 전화를 걸고 있습니다. 이 메서드는 구성 요소를 그리는 작업을 담당하며 컨트롤이 아닌 잠재적으로 여러 번 호출 할 수 있습니다. 그렇게하지 말고, 한 번만 호출 할 수있는 생성자 또는 다른 위치에서 한 번 호출하십시오.

JProgressBar의 값을 Swing 이벤트 스레드에서 설정하는 것은 위험 할 수 있습니다. 대신 Swing Timer를 사용하거나 PropertyChangeListener와 함께 SwingWorker의 progress 속성을 사용하십시오.

예를 들어

,

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JProgressBar; 
import javax.swing.SwingUtilities; 
import javax.swing.Timer; 

@SuppressWarnings("serial") 
public class Opening extends JPanel { 
    private static final int TIMER_DELAY = 1000; 
    private JProgressBar loadingBar; 
    private Timer t = new Timer(TIMER_DELAY, new TimerListener()); 

    public Opening() { 
     bar(); 
    } 

    private void bar() { 
     loadingBar = new JProgressBar(); 
     this.add(loadingBar); 
     loadingBar.setStringPainted(true); 
     loadingBar.setValue(0); 
     loadingBar.setMinimum(0); 
     loadingBar.setMaximum(100); 
     t.start(); 
    } 

    private class TimerListener implements ActionListener { 
     int value = 0; 

     @Override 
     public void actionPerformed(ActionEvent e) { 
     if (value <= 100) { 
      loadingBar.setValue(value); 
      value++; 
     } else { 
      // value > 100 
      ((Timer) e.getSource()).stop(); // stop timer 
     } 
     } 
    } 

    private static void createAndShowGui() { 
     JFrame frame = new JFrame("Opening"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(new Opening()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 
+0

를 참조하십시오? JPanel은 그래픽 콘텐츠를 표시하기 때문에 필요합니다. – Chax

+0

@Chax : 예를 들어 위의 예를 참조하십시오. 그리고 아무것도 크기를 설정하지 마십시오. 대신 레이아웃 관리자를 사용하십시오. –

1

당신은 JProgressBar가 생성 및 방법의 paintComponent()에서 수업 열기에 추가된다. paintComponent()가 호출 될 때마다 구성 요소가 자체적으로 그려야합니다.

이것은 응용 프로그램과 겹치는 창 (JFrame) 또는 다른 응용 프로그램의 크기를 조정 한 후에 적용 할 수 있습니다.

개방형 생성자로 초기화를 이동해야합니다. 나는 다음 진행해야 방법 인 JPanel에 JProgressBar가를 추가하려면

http://docs.oracle.com/javase/tutorial/uiswing/painting/closer.html