Я пытаюсь что-то раскрасить в моей программе, но поскольку процесс раскраски (перекраска) находится в потоке, функция thread.join () заставляет метод recolor приостановить работу.
Я хочу Перекрасить метод для запуска внутри потока, но весь код, чтобы ждать, пока глобальный процесс перекрашивания завершит свою работу.
Я заметил, что если я удаляю ActionListener, он работает хорошо, но я хочу, чтобы анимация работала с щелчок одной из кнопок
Редактировать:
public class Main {
static Button [][] matrixButtons = new Button[7][2];
protected static Image imgRed;
protected static Image imgFreeSpace;
public Main()
{
File f1= new File("Images/free_cell.png");
File f2= new File("Images/player_one.png");
try {
imgFreeSpace = ImageIO.read(f1).getScaledInstance(90, 90, Image.SCALE_SMOOTH);
} catch (IOException e) {
e.printStackTrace();
}
try {
imgRed = ImageIO.read(f2).getScaledInstance(90, 90, Image.SCALE_SMOOTH);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
JFrame jFrame = new JFrame();
GridLayout gridLayout = new GridLayout(7,1);
JPanel jPanel = new JPanel(gridLayout);
jFrame.add(jPanel,BorderLayout.CENTER);
for(int i = 0; i < 7; i++)
{
for (int j = 0; j < 2; j++) {
matrixButtons[i][j] = new Button(imgFreeSpace);
matrixButtons[i][j].setPreferredSize(new Dimension(90, 90));
matrixButtons[i][j].addActionListener(new AL(j,imgRed));
jPanel.add(matrixButtons[i][j]);
}
}
jFrame.pack();
jFrame.setVisible(true);
}
public static void main(String[] args){
new Main();
}
class AL implements ActionListener {
protected int col;
protected Image image;
public AL(int col,Image image) {
this.col = col;
this.image = image;
}
public void actionPerformed(ActionEvent e) {
animate(1, image);
}
}
public static void animate(int column, Image image) {
Thread t = new Thread(new Runnable() {
public void run() {
try {
Image freeCellImage = imgFreeSpace;
for (int i = 0; i < 7; i++) {
matrixButtons[i][column].setImage(image);
matrixButtons[i][column].repaint();
Thread.sleep(100);
if (i != 7) {
matrixButtons[i][column].setImage(freeCellImage);
matrixButtons[i][column].repaint();
}
}
} catch (InterruptedException ex) {
}
}
});
t.start();
try {
t.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("test");
}
}
Класс кнопок:
public class Button extends JButton {
private Image image;
public Button(Image image) {
this.image = image;
}
public void setImage(Image image) {
this.image = image;
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, 0, 0, null);
}
}