요약 : 저는 현재 택시를 시뮬레이트하는 애플릿 실험실 연습을하고 있으며, 속도, 연료, 운임 및 거리를 표시하고 택시가 비었거나 공석인지 여부를 표시해야합니다. 사용자에게 상호 작용을 제공하는 버튼이 있습니다. 문제 : 나는 운임, 거리 및 연료를 위해 실을, 그리고 천막을위한 또 다른 실을 사용했는데, 왜 천막이 계속 깜박 거리는가?왜 여러 스레드를 사용하여 다시 칠 때 애플릿이 깜박입니까?
답변
코드가 없으면 누구나 추측 할 수 있지만 관계없이 찌를 것입니다. 내 생각 엔 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에 직접 페인팅하고 있습니다. 처음에 말했듯이 그렇게하지 마십시오. ,
- Lesson: Performing Custom Painting (the basics)
- Painting in AWT and Swing (for more advanced concepts)
또한 코드에서 다른 오류가 많이있어 몇 가지 중요한 : 사실을 제대로 할 학습에서 가장 좋은 건 튜토리얼을 읽는 것입니다 equals(...)
또는 equalsIgnoreCase(...)
메서드 대신 ==를 사용하여 문자열을 비교하고 Thread#stop()
을 직접 호출하는 방법을 포함합니다. 그러지 마. 또한 paint 또는 paintComponent 내에 구성 요소의 테두리를 설정하지 마십시오. 또한 백그라운드 스레드와 Swing 이벤트 스레드에서 구성 요소의 텍스트와 배경색을 설정합니다. 간헐적이며 디버깅하기 어려운 스레드 오류의 두 가지 원인이있을 수 있습니다. Swing 이벤트 스레드에서만 이러한 작업을 수행하려고합니다.
- 1. 다시 칠 때 JButton이 복사됩니까?
- 2. 왜 텍스트가 깜박입니까?
- 3. 내부 패널을 바꿀 때 왜 깜박입니까?
- 4. 왜이 JTable은 다시 칠 때 반으로 줄어들까요?
- 5. 왜 simplyScroll jquery 플러그인이 깜박입니까?
- 6. 자바 그래픽 다시 칠 문제
- 7. Chrome에서 rotateY (flip) css3 애니메이션이 왜 깜박입니까?
- 8. 내 xna 프로젝트에서 내 이미지가 왜 깜박입니까?
- 9. 내 툴팁이 Firefox가 아닌 Chrome에서 왜 깜박입니까?
- 10. 스크롤하기 전에 매끄러운 스크롤이 왜 깜박입니까?
- 11. ExtJS에서 패널을 다시 칠 수 없습니다
- 12. 왜 여러 애플릿이 하나의 전역 클래스에 액세스 할 수 있습니까?
- 13. 프레임 업데이트 또는 패널 다시 확인/다시 칠
- 14. 마우스를 움직이면 Java 애플릿이 느려집니다.
- 15. 버튼을 누를 때 계속 이미지가 깜박입니까?
- 16. 는 클러킹을위한 스레드를 생성하고 다시 다른 스레드를
- 17. .NET에서 스레드를 다시 시작
- 18. mouseReleased 이벤트를 처리 할 때 Java 애플릿이 여러 예외를 throw합니다.
- 19. 스레드를 사용하여 사용자 지정 콘솔을 동기식으로 다시 그리는 방법은 무엇입니까?
- 20. 활동이 닫힐 때 실행 가능한 스레드를 유지하는 방법 활동이 다시 시작될 때 스레드를 파괴합니다.
- 21. 맞춤화 된 플래시가 깜박입니까?
- 22. WPF scrollviewer - 여러 스레드를 사용하여 액세스
- 23. 여러 스레드를 사용하여 DataTable의 행을 처리합니까?
- 24. 여러 스레드를 사용하여 보내는 Linux 소켓
- 25. pthread를 사용하여 여러 컴퓨터에서 스레드를 실행 하시겠습니까?
- 26. 스레드를 다시 시작하려고하면 ThreadStateException이 발생합니다.
- 27. 파일에 쓸 때 자체 서명 애플릿이 발생했습니다.
- 28. Xcode, 왜 빌드 결과를 볼 수 없으며 왜 오류가 빨간색으로 깜박입니까?
- 29. 애플릿 배경이 깜박입니까?
- 30. 어떻게 이미지를 깜박입니까?
이 코드는 현재 다소 성가신 상태입니다. 잠깐만, 문제를 일으킬 수있는 코드를 선택하겠습니다. btw, 나는 학기가 막 시작했기 때문에 아직 실험 단계에 있습니다. Thread.suspend() 또는 Thread.resume()과 같은 감가 상각 된 메소드를 사용하는 것이 괜찮습니까? – cjBucketHead
@cjBucketHead : 좋은 주 님 - *** 절대로 *** 그 방법을 사용하십시오. [Thread API] (http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html)를 읽으면 사용하는 것이 왜 매우 위험한 지 알 수 있습니다. –
여기에 전체 코드가 있습니다. https://www.dropbox.com/s/hh00qmxiqos0ehx/taxiCab.java – cjBucketHead