2012-07-22 8 views
1

요약 : 저는 현재 택시를 시뮬레이트하는 애플릿 실험실 연습을하고 있으며, 속도, 연료, 운임 및 거리를 표시하고 택시가 비었거나 공석인지 여부를 표시해야합니다. 사용자에게 상호 작용을 제공하는 버튼이 있습니다. 문제 : 나는 운임, 거리 및 연료를 위해 실을, 그리고 천막을위한 또 다른 실을 사용했는데, 왜 천막이 계속 깜박 거리는가?왜 여러 스레드를 사용하여 다시 칠 때 애플릿이 깜박입니까?

답변

3

코드가 없으면 누구나 추측 할 수 있지만 관계없이 찌를 것입니다. 내 생각 엔 JApplet의 paint(...) 메서드에서 직접 그리기 때문에 Swing의 이중 버퍼링에서 가능한 모든 이득을 잃어버린다. 그렇다면 이것을 변경하고 JApplet이 표시하는 JPanel의 paintComponent(...) 메소드를 그립니다.

이것이 도움이되지 않는다면, 우리가 추측 할 필요가 없도록 충분한 정보를 제공하는 것을 고려하십시오. 스레딩을 어떻게하는지에 대해 우리를 기입하고 스레딩 스레딩 규칙을 준수하고 스레딩 구성 요소를 이벤트 스레드에서만 업데이트하도록주의를 기울여야합니다.

편집
귀하의 코드 :

import java.awt.*; 
import java.awt.event.ActionEvent; 
import javax.swing.JApplet; 
import javax.swing.*; 
import java.awt.event.ActionListener; 
import java.io.*; 
import javax.swing.border.Border; 
/** 
* 
* @author IC 
*/ 
public class taxiCab extends JApplet implements ActionListener { 
    private JTextField speed, distance, fare, fuel, ov, full, tf, tf_fuel, tf_speed; 
    private JButton butt, start, butt_pass, butt_sUp, butt_sDown, butt_refuel; 
    private JLabel label; 
    private JPanel main, north, south, south_left, south_right, center, center_content, north_speed, north_distance, north_fuel, north_fare; 
    private Container contain; 
    private int speedVal, distanceVal, passval, thread_sleep, status_width, fuel_width; 
    private float fuelVal, fareVal; 
    private Graphics g; 
    private String status; 
    private Font font2 = new Font("Kozuka Gothic Pro B", Font.BOLD, 60); 
    private Border border2 = BorderFactory.createLineBorder(Color.black, 3); 
    private Border border1 = BorderFactory.createLineBorder(Color.black, 1); 
    private final int width_ = 500; 
    private final int height_ = 300; 
    Thread thread1 = new trd1(); 
    Thread thread2 = new trd2(); 
    /** 
    * Initialization method that will be called after the applet is loaded into 
    * the browser. 
    */ 
    public void init() { 
     setSize(width_,height_); 
     status = new String(); 
     status = "VACANT"; 
     status_width = -330; 
     Border border3 = BorderFactory.createLineBorder(Color.black, 5); 
       thread1 = new trd1(); 
       thread2.start(); 
       thread2.suspend(); 
     contain = new Container(); 
     contain = getContentPane(); 
     main = new JPanel(new BorderLayout()); 
      north = new JPanel(new GridLayout(2,2)); 
      north.setBackground(Color.blue); 
       north_speed = new JPanel(); 
        tf_speed = new JTextField(10); 
        tf_speed.setBorder(border1); 
        tf_speed.setText("Speed"); 
        tf_speed.setHorizontalAlignment(JTextField.CENTER); 
        tf_speed.setBackground(Color.CYAN); 
        tf_speed.setEditable(false); 
        speed = new JTextField(10); 
        speed.setBorder(border1); 
        speed.setEditable(false); 
        speed.setText("-"); 
        speed.setHorizontalAlignment(JTextField.CENTER); 
        north_speed.add(tf_speed); 
        north_speed.add(speed); 
       north_distance = new JPanel(); 
        tf = new JTextField(10); 
        tf.setBorder(border1); 
        tf.setText("Distance"); 
        tf.setHorizontalAlignment(JTextField.CENTER); 
        tf.setBackground(Color.CYAN); 
        tf.setEditable(false); 
        distance = new JTextField(10); 
        distance.setBorder(border1); 
        distance.setEditable(false); 
        distance.setText("-");//<----------------------------------distance 
        distance.setHorizontalAlignment(JTextField.CENTER); 
        north_distance.add(tf); 
        north_distance.add(distance); 
       north_fuel = new JPanel(); 
        tf_fuel = new JTextField(10); 
        tf_fuel.setBorder(border1); 
        tf_fuel.setText("Fuel"); 
        tf_fuel.setHorizontalAlignment(JTextField.CENTER); 
        tf_fuel.setBackground(Color.CYAN); 
        tf_fuel.setEditable(false); 
        fuel = new JTextField(10); 
        fuel.setBorder(border1); 
        fuel.setEditable(false); 
        fuel.setText("-"); 
        fuel.setHorizontalAlignment(JTextField.CENTER); 
        north_fuel.add(tf_fuel); 
        north_fuel.add(fuel); 
       north_fare = new JPanel(); 
        tf = new JTextField(10); 
        tf.setBorder(border1); 
        tf.setText("Fare"); 
        tf.setHorizontalAlignment(JTextField.CENTER); 
        tf.setBackground(Color.CYAN); 
        tf.setEditable(false); 
        fare = new JTextField(10); 
        fare.setBorder(border1); 
        fare.setEditable(false); 
        fare.setText("-"); 
        fare.setHorizontalAlignment(JTextField.CENTER); 
        north_fare.add(tf); 
        north_fare.add(fare); 
       north.add(north_speed); 
       north.add(north_distance); 
       north.add(north_fuel); 
       north.add(north_fare); 
      center = new JPanel(new BorderLayout(3,3)); 
       center_content = new JPanel(new GridLayout(2,1,0,15)); 
        ov = new JTextField(20); 
        ov.setText(""); 
        ov.setBackground(Color.yellow); 
        ov.setEditable(false); 
        ov.setBorder(border2); 
        full = new JTextField(20); 
        full.setHorizontalAlignment(JTextField.CENTER); 
        full.setText("FUELMeter"); 
        full.setIgnoreRepaint(true); 
        full.setFont(font2); 
        full.setBorder(border2); 
        center_content.add(ov); 
        center_content.add(full); 
       center.add(center_content, "Center"); 
       center_content.setBackground(Color.yellow); 
       label = new JLabel(" "); 
       center.add(label, "North"); 
       label = new JLabel(" "); 
       center.add(label, "West"); 
       label = new JLabel(" "); 
       center.add(label, "South"); 
       label = new JLabel(" "); 
       center.add(label, "East"); 
      south = new JPanel(new BorderLayout()); 
       south_left = new JPanel(new GridLayout(2,1)); 
        butt_sUp = new JButton("Speed Up"); 
        butt_sUp.setBorder(border1); 
        butt_sUp.addActionListener(this); 
        butt_sUp.setEnabled(false); 
        south_left.add(butt_sUp); 
        butt_sDown = new JButton("Speed Down"); 
        butt_sDown.setBorder(border1); 
        butt_sDown.addActionListener(this); 
        butt_sDown.setEnabled(false); 
        south_left.add(butt_sDown); 
       south_right = new JPanel(new GridLayout(2,1)); 
        butt_pass = new JButton("Passenger In"); 
        butt_pass.setBorder(border1); 
        butt_pass.addActionListener(this); 
        butt_pass.setEnabled(false); 
        south_right.add(butt_pass); 
        butt_refuel = new JButton("Refuel"); 
        butt_refuel.setBorder(border1); 
        butt_refuel.addActionListener(this); 
        butt_refuel.setEnabled(false); 
        south_right.add(butt_refuel); 
       butt = new JButton("Start"); 
       butt.setBorder(border1); 
        butt.addActionListener(this); 
       south.add(butt, "Center"); 
       south.add(south_left, "West"); 
       south.add(south_right, "East"); 
     north.setBorder(border1); 
     center.setBorder(border1); 
     south.setBorder(border1); 
     center.setBackground(Color.yellow); 
     main.add(north, "North"); 
     main.add(center, "Center"); 
     main.add(south, "South"); 
     main.setBorder(border1); 
     //main.setIgnoreRepaint(true); 
     contain.add(main); 
     contain.setVisible(true); 
     //contain.setIgnoreRepaint(true); 


    } 
    public void paint(Graphics g){ 
     super.paint(g); 
     g.setColor(Color.black); 
     g.setFont(font2); 
     g.drawString(status, status_width, 140); 
     g.setColor(Color.yellow); 
     g.fillRect(2,82,12,70); 
     g.fillRect(getWidth()-14,82,12,70); 
     g.setColor(Color.black); 
     g.fillRect(0,82,2,70); 
     g.setColor(Color.GREEN); 
     g.fillRect(17,(getHeight()/2)+20,fuel_width,getHeight()-(83+(getHeight()/2))); 
     main.setBorder(border1); 
    } 

    public void actionPerformed(ActionEvent e) { 
     if(e.getActionCommand() == "Start"){ 
      butt.setLabel("Stop"); 
      butt_pass.setEnabled(true); 
      fuelVal = 50.00f; 
      distanceVal = 0; 
      fareVal = 40.00f; 
      speedVal = 0; 
      fuel.setText(String.valueOf(fuelVal) + " L"); 
      distance.setText(String.valueOf(distanceVal) + " km"); 
      fare.setText("Php " + String.valueOf(fareVal)); 
      speed.setText(String.valueOf(speedVal) + " kph"); 
       thread1 = new trd1(); 
       thread1.start(); 
       thread2 = new trd2(); 
       thread2.start(); 
      //BufferedWriter bw;<----------------------------------------------- 
      } 
     else if(e.getActionCommand() == "Stop"){ 
      butt.setLabel("Start"); 
      butt_pass.setEnabled(false); 
      butt_sUp.setEnabled(false); 
      butt_sDown.setEnabled(false); 
      butt_refuel.setEnabled(false); 
      butt_pass.setLabel("Passenger In"); 

      thread1.stop(); 
     } 
     else if(e.getActionCommand() == "Speed Up"){ 
      if(speedVal == 0){ 
       speedVal+=25; 
       speed.setText(String.valueOf(speedVal) + " kph"); 
       butt_sDown.setEnabled(true); 
       tf_speed.setText("Speed"); 
       thread1 = new trd1(); 
       thread1.start(); 
      } 
      else if(speedVal == 275){ 
       speedVal+=25; 
       speed.setText(String.valueOf(speedVal) + " kph"); 
       //butt_sUp.setEnabled(false); 
       tf_speed.setText("MAX SPEED"); 
      } 
      else{ 
       speedVal+=25; 
       speed.setText(String.valueOf(speedVal) + " kph"); 
       } 
     } 
     else if(e.getActionCommand() == "Speed Down"){ 
      repaint(); 
      if(speedVal==25){ 
       speedVal-=25; 
       speed.setText(String.valueOf(speedVal) + " kph"); 
       tf_speed.setText("S T O P P E D"); 
       butt_sDown.setEnabled(false); 
      } 
      else if(speedVal == 300){ 
       speedVal-=25; 
       speed.setText(String.valueOf(speedVal) + " kph"); 
       tf_speed.setText("Speed"); 
       butt_sUp.setEnabled(true); 
      } 
      else{ 
       speedVal-=25; 
       speed.setText(String.valueOf(speedVal) + " kph"); 
      } 
     } 
     else if(e.getActionCommand() == "Passenger In"){ 
      butt_pass.setLabel("Passenger Out"); 
      fareVal = 40.0f; 
      fare.setText("Php " + String.valueOf(fareVal)); 
      butt_sUp.setEnabled(true); 
      butt_sDown.setEnabled(true); 
      butt_refuel.setEnabled(true); 
      speedVal = 25; 
      speed.setText(String.valueOf(speedVal) + " kph"); 
      status = "OCCUPIED"; 
       thread1 = new trd1(); 
       thread1.start(); 


     } 
     else if(e.getActionCommand() == "Passenger Out"){ 
      status = "VACANT"; 
      butt_pass.setLabel("Passenger In"); 
      thread1.stop(); 
     } 
     else if(e.getActionCommand() == "Refuel"){ 
      if(fuelVal == 0.0f){ 
       fuelVal = 50.00f; 
       fuel.setText(String.valueOf(fuelVal)); 
       tf_fuel.setBackground(Color.cyan); 
       tf_fuel.setText("Fuel"); 
         fuel_width = (int)((getWidth()-34)*fuelVal/50f); 
       thread1 = new trd1(); 
       thread1.start(); 
      } 
      else{ 
       fuelVal = 50.00f; 
       fuel.setText(String.valueOf(fuelVal) + " L"); 
      } 
     } 
    } 

    public class trd1 extends Thread implements Runnable { 

     public void run(){ 
      if(fuelVal>0.00f || speedVal>0){ 
       for(;;){ 
        try { 
         Thread.sleep(50000/speedVal); 
         if(fuelVal == 0.00f || speedVal == 0) 
          thread1.stop(); 
         distanceVal++; 
         fareVal += 1.00; 
         fuelVal -=.25f; 
         fuel_width = (int)((getWidth()-34)*fuelVal/50f); 
         repaint(); 
         distance.setText(String.valueOf(distanceVal)+" km"); 
         fuel.setText(String.valueOf(fuelVal)+" L"); 
         fare.setText("P " + String.valueOf(fareVal)); 
        } catch (InterruptedException e) { 
        } 
       } 
      } 
      } 
     } 
    public class trd2 extends Thread implements Runnable { 
     //tf_fuel = new JTextField(15); 

     public void run(){ 
       for(int b = 0;;b++){ 
        try { 
         Thread.sleep(10); 
         status_width +=1; 
         if(status_width == getWidth()) 
          status_width = -330; 
         repaint(); 
         if(fuelVal == 0.0f){ 
          if(b%2==0){ 
           tf_fuel.setBackground(Color.red); 
           tf_fuel.setText("R E F U E L"); 
           } 
          else{ 
           tf_fuel.setBackground(Color.cyan); 
           tf_fuel.setText("R E F U E L"); 
           } 
         } 
        } catch (InterruptedException e) { 
        } 
       } 


     } 
    } 
} 

그래, 내가 제대로 짐작 : 당신은 JApplet에 직접 페인팅하고 있습니다. 처음에 말했듯이 그렇게하지 마십시오. ,

또한 코드에서 다른 오류가 많이있어 몇 가지 중요한 : 사실을 제대로 할 학습에서 가장 좋은 건 튜토리얼을 읽는 것입니다 equals(...) 또는 equalsIgnoreCase(...) 메서드 대신 ==를 사용하여 문자열을 비교하고 Thread#stop()을 직접 호출하는 방법을 포함합니다. 그러지 마. 또한 paint 또는 paintComponent 내에 구성 요소의 테두리를 설정하지 마십시오. 또한 백그라운드 스레드와 Swing 이벤트 스레드에서 구성 요소의 텍스트와 배경색을 설정합니다. 간헐적이며 디버깅하기 어려운 스레드 오류의 두 가지 원인이있을 수 있습니다. Swing 이벤트 스레드에서만 이러한 작업을 수행하려고합니다.

+0

이 코드는 현재 다소 성가신 상태입니다. 잠깐만, 문제를 일으킬 수있는 코드를 선택하겠습니다. btw, 나는 학기가 막 시작했기 때문에 아직 실험 단계에 있습니다. Thread.suspend() 또는 Thread.resume()과 같은 감가 상각 된 메소드를 사용하는 것이 괜찮습니까? – cjBucketHead

+2

@cjBucketHead : 좋은 주 님 - *** 절대로 *** 그 방법을 사용하십시오. [Thread API] (http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html)를 읽으면 사용하는 것이 왜 매우 위험한 지 알 수 있습니다. –

+0

여기에 전체 코드가 있습니다. https://www.dropbox.com/s/hh00qmxiqos0ehx/taxiCab.java – cjBucketHead

관련 문제