주어진 수의 아이콘이 프레임의 왼쪽에서 시작하여 화면에서 오른쪽으로 경주되는 애니메이션입니다. 각 아이콘은 컨테이너의 단일 열 GridLayout 내의 행을 채우는 자체 JPanel에 그려지고 각 JPanel은 자체 스레드에서 레이스를합니다. Swing Timer가 더 나은 접근 방법 일지라도 쓰레드를 사용해야합니다.JPanel에 선이 그려지지 않습니다.
결승점은 컨테이너 위에 그려지기는하지만 표시되지 않습니다. Racer의 JPanel 불투명도를 false로 설정하려고 시도했지만 작동하지 않습니다. 결승선의 그림을 실행하는 다른 스레드를 어떻게 얻을 수 있습니까?
작동하지 않는 코드 :
gui = new JPanel() {
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawLine(finishLineXPos, 0, finishLineXPos, windowHeight);
}
};
전체 코드 : 각 아이콘은 자신의 JPanel에 그려집니다
import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
public class Races2 {
private JFrame frame;
private JPanel gui; // to hold all components
private int finishLineXPos; // x-coordinate of finish line
private Icon racerImg;
private int racerImgWidth;
private int racerImgHeight;
private int numOfRacers;
private ArrayList<Racer> racers;
private Racer winner;
private int windowHeight;
private int windowWidth;
public Races(int num) {
numOfRacers = num;
racerImg = new ImageIcon("races.png");
racerImgWidth = racerImg.getIconWidth();
racerImgHeight = racerImg.getIconHeight();
windowHeight = racerImgHeight * numOfRacers;
windowWidth = racerImgWidth * 20;
finishLineXPos = racerImgWidth * 18; // two icon widths from the right
frame = new JFrame("Off to the Races - by Brienna Herold");
frame.setResizable(false); // prevents window resizing which affects painting
gui = new JPanel() {
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawLine(finishLineXPos, 0, finishLineXPos, windowHeight);
}
};
gui.setLayout(new GridLayout(numOfRacers,1));
gui.setPreferredSize(new Dimension(windowWidth, windowHeight));
// Create and add racers to gui panel
racers = new ArrayList<Racer>();
for (int i = 0; i < numOfRacers; i++) {
Racer racer = new Racer();
gui.add(racer);
racers.add(racer);
}
// Start racers
for (Racer racer : racers) {
Thread racerThread = new Thread(racer);
racerThread.start();
}
frame.add(gui);
frame.pack();
frame.setVisible(true);
}
protected class Racer extends JPanel implements Runnable {
private int lastPosX;
private int posX;
public Racer() {
posX = 0;
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
racerImg.paintIcon(this, g, posX, 0);
posX += Math.random() * 20;
}
@Override
public void run() {
// While the race has not been won yet, proceed with race
while (winner == null) {
repaint();
try {
Thread.sleep(100); // slows down racing a bit
} catch (InterruptedException ex) {
ex.printStackTrace();
}
// If racer passes specified x-coordinate, set it as winner
if (posX >= finishLineXPos) {
System.out.println("Winner: " + this.getName());
winner = this;
}
}
}
}
}
Racer 클래스는 JPanel 또는 Swing 구성 요소 클래스가 아니어야하며 위치를 알고있는 논리적 클래스 여야하며 그리기 또는 그리기 메소드를 호출하여 자신을 그릴 수 있습니다. 이 Racer 객체의 메인 그래픽 JPanel 인스턴스를주고 주 JPanel로 그려야합니다. 일련의 스레드가 아닌 단일 스윙 타이머로 애니메이션을 구동하십시오. –
gui JPanel의 그래픽은 추가하고있는 다른 구성 요소로 덮여 있습니다. 그것이 당신이 무언가를 끌지 않는 이유입니다. –
@DontKnowMuchButGettingBetter, 각 Racer의 배경이 투명하면 gui의 줄이 계속 표시되지 않아야합니까? – briennakh