2016-01-18 3 views
0

Я изо всех сил пытался заставить JFrame перекрасить его содержимое. Я попытался использовать методы revaluate() и repaint() вместе после добавления новых компонентов в JFrame, но я не вижу изменения рамки.JFrame не обновляет его содержание

Вот простой графический интерфейс игры тральщика, которую я пытаюсь сделать. enter image description here

Когда пользователь нажимает на одну из 3 верхних кнопок, они входят в следующий блок кода

private void drawGrid() 
{ 
     removeAll(); 

     setLayout(new GridLayout(2,1)); 
     add(new JButton("button")); 

     setVisible(true); 

     revalidate(); 
     repaint(); 
     setVisible(false); 
     setVisible(true); 
} 

При нажатии на кнопку, все приложение становится белым, но я не могу видеть новый Я добавил. Когда я удаляю две строки метода setVisible(), нажатие кнопки определенно удаляет компоненты, так как я не могу нажимать ни на одну из них сейчас, но 4 начальные кнопки все еще видны. Удаление методов revalidate или repaint не влияет на приложение.

Что еще я могу попробовать, чтобы приложение обновило и отобразило его новое содержимое.

ответ

1

Звонок removeAll на JFrame является опасным и может привести к непредвиденным результатам, что является еще одной причиной отказа от использования интерфейса UI непосредственно на контейнерах верхнего уровня.

Начните с использования JPanel в качестве базового компонента пользовательского интерфейса, затем используйте команду CardLayout для управления переключением между видами.

Разделяйте вид в собственный класс (простирающейся от JPanel или что-то Двойники) для более легкого управления

+0

Я попытался создать JPanel, а затем вставить все кнопки меню в эту панель, а затем добавить JPanel в основной JFrame, но графический интерфейс появляется в виде четырех кнопок, сжимаемых в сетку 2x2 в верхней половине JFrame, даже если я установил компоновку JPanel как сетку 4x1 – user217339

+0

, как я мог вставить все кнопки в отдельный JPanel, а затем добавить JPanel в основной JFrame и визуально получить тот же результат, что и в настоящее время. – user217339

+0

Убедитесь, что в 'JFrame' есть макет, установленный на' BorderLayout', убедитесь, что панель «меню» имеет макет, установленный в «GridLayout», с 1 столбцом и 0 строками. Вам не нужно иметь отдельные панели, для них нужно управлять на одной панели, например, игровое представление должно быть отдельной панелью, тогда вы можете более легко управлять кодом, а не пытаться динамически генерировать объекты «на лету» все время из одного класса – MadProgrammer

0

Может быть, это будет работать лучше, если бы вы использовали этот

easyBtn.setVisible(false); 
medBtn.setVisible(false); 
hardBtn.setVisible(false); 
customBtn.setVisible(false); 
newBtn.setVisible(true); 

Если это не сработает, попробуйте положить это в SwingWorker.

Смежные вопросы