РЕДАКТИРОВАТЬ: ПРОСТОЙ, ПРОСТОЙ И ПРОВЕРЯЕМЫЙ ЗАДАЧИ НИЖЕ
РЕЗЮМЕ
Я делаю приложение Латинского квадрата, которое устанавливаетквадрат размера s, и вам нужно покрасить его с некоторыми ограничениями, например, не одного цвета в том же ряду или в том же столбце.
Но моя проблема не в самой проблеме, а в Swing.
Я пытаюсь сделать это с помощью Swing для некоторой графики и лучшего внешнего вида.
Проблема в том, что когда я нашел решение, я хочу остановиться на несколько секунд дляпосмотрите его, а затем продолжайте искать других (я сделаю это с Thread.sleep ()).
Но я наблюдаю, что квадрат не окрашивается.Только когда закончите метод, он изменится.
ОСНОВНАЯ ПРОБЛЕМА
Показать только последнее решение, котороеон появляется и показывает, когда завершается метод Backtracking.
Когда я нажимаю кнопку разрешения, появляется класс, который реализует интерфейс ActionListener, который имеетМетод actionPerformed, который вызывает метод класса основного фрейма, который разрешает квадрат.Так что проблема в том, что если я остановлю выполнение, когда найду решение, графический интерфейс не изменится, но внутренне, когда я проверяю свойства (отладку), в ячейке обновляется цвет, но не в графическом интерфейсе.
И я не знаю почему: (
ПОДРОБНЕЕ
Моя идея состояла в том, чтобы сделать раму с двумя панелями, одна слеваи один посередине (возможно, в будущем, поместите что-нибудь справа).
Для этого я использую BorderLayout.
Итак, первая панель слева, это что-то вроде базовойМеню конфигурации, где пользователь может установить размер квадрата и запустить его для получения решения.
Для этого у меня есть две кнопки, одна для изменения размера, а другая для его разрешения.
Так что мне нужны события для кнопок. Размер не доставляет мне проблем, но решает да.
Итак, я проверил, чем если я раскрасю квадрат и приостановлю выполнение (Scanner.nextLine () илиThread.sleep ()) не вносит изменения в графический интерфейс, но когдаЯ отлаживаю, квадрат в свойствах раскрашен, поэтому я не очень хорошо понимаю, почему это фейлинг.
ГДЕ Я ДУМАЮ, ЧТО ПРОБЛЕМА
Итак, у меня есть кнопка, которая разрешает квадрат при нажатии на.И я думаю, я на самом деле не знаю, но я подозреваю, что при этом создается новый поток или что-то, поэтому не может обновлять графический интерфейс;и только когда закончите, сделайте это.
Есть что-нибудь, чтобы изменить это?.
class ResolveListener implements ActionListener
{
@Override
public void actionPerformed(ActionEvent e)
{
int size = Integer.parseInt(textField.getText());
latinSquareFrame.resolve(size);
}
}
ПРОБНАЯ ПРОБЛЕМА
Iпрочитал в комментариях, чтобы найти минимальную и легко проверяемую проблему, подобную этой.
Так я и сделал.Этот код похож на мою проблему, есть квадрат, я и я хочу покрасить его, когда нажмем кнопку.
Проблема в том, что, если я сделаю паузу, он не цветной, а только цветной, когдаметод завершается, и я не знаю почему.
Я думаю, что это похоже на проблему, с которой я сталкивался ранее.
Это минимальный код, который я могу использовать для решения этой проблемы.иметь.
package LatinSquare;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Scanner;
public class Test
{
public static void main(String[] args)
{
TestFrame testFrame = new TestFrame();
}
}
class TestFrame extends JFrame
{
public TestFrame()
{
this.setVisible(true);
this.setBounds(400,300,400,300);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLayout(new BorderLayout());
TestJPanel testJPanel = new TestJPanel();
this.add(testJPanel,BorderLayout.CENTER);
TestContainerButtonJPanel testContainerButtonJPanel = new TestContainerButtonJPanel(testJPanel);
this.add(testContainerButtonJPanel, BorderLayout.SOUTH);
this.revalidate();
this.repaint();
}
}
class TestContainerButtonJPanel extends JPanel
{
private JButton resolve;
public TestJPanel testJPanel;
public TestContainerButtonJPanel(TestJPanel testJPanel)
{
this.testJPanel = testJPanel;
this.setVisible(true);
resolve = new JButton("RESOLVE");
ActionListener resolveListener = new ResolveListener();
resolve.addActionListener(resolveListener);
this.add(resolve);
}
class ResolveListener implements ActionListener
{
@Override
public void actionPerformed(ActionEvent e)
{
try {
TestContainerButtonJPanel.this.testJPanel.colourCells();
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
}
}
class TestJPanel extends JPanel
{
private JButton[][] board;
public TestJPanel()
{
this.board = new JButton[4][4];
this.setVisible(true);
this.setLayout(new GridLayout(4,4));
for(int i=0; i<4;i++)
{
for(int j=0; j<4;j++)
{
JButton cell = new JButton();
board[i][j] = cell;
board[i][j].setBackground(Color.WHITE);
this.add(cell);
}
}
}
public void colourCells() throws InterruptedException {
for(int i=0; i<4;i++)
{
for(int j=0;j<4;j++)
{
this.board[i][j].setBackground(Color.RED);
Thread.sleep(300);
}
}
}
}