2016-02-09 2 views
-3

Я относительно новичок в java, и я делаю HangMan Game, но сейчас у меня проблема. В частности, я хочу закрыть рамку программы, чтобы открыть новую когда кто-то находит это слово, но поскольку мой класс там расширяет JPanel, dispose() не является доступным решением. Итак, что мне делать, чтобы закрыть этот кадр? (в виду, что его объект определен в другом классе, тот, который вызывает этот конкретный.) Вот часть моего кода: (пожалуйста, простите меня за отображение так много строк) Я просто хочу знать, как я могу закрыть это окно без выхода из всей программы, Спасибо за ваше время :))Как закрыть класс extends JPanel

EDIT: Спасибо, ребята, я очень многому научился через этот раздел комментариев. Я благодарен за ваши быстрые ответы, и я надеюсь, что в будущем я больше не буду задавать такой глупый вопрос :) PS: Я действительно использовал CardLayout для решения моей проблемы. Я действительно не вижу мысли, как этот вопрос похож на «Как программно закрыть JFrame», поскольку в этом я не могу использовать метод dispose, потому что я расширяю JPanel.

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
//import java.io.File; 
import java.util.*; 
import java.util.concurrent.TimeUnit; 
public class Game extends JPanel implements Runnable{ 

public void paintComponent(Graphics g) 
{ 
super.paintComponent(g); 
this.setBackGround(Color.BLACK); 

} 


public void run() 
{ 
} 
} 
+3

Просьба указать [минимальный объем кода] (http://stackoverflow.com/help/mcve), который продемонстрирует вашу проблему. Это слишком много нерелевантного кода, чтобы ожидать, что кто-нибудь прочтет. – khelwood

+1

* «Я хочу закрыть рамку программы, чтобы открыть новую» * - Plese рассматривает альтернативы, такие как «CardLayout», [использование нескольких 'JFrame'] (http://stackoverflow.com/q/ 9554636/4857909) не является хорошей практикой. –

+0

* «Я хочу закрыть рамку программы, чтобы открыть новую, когда кто-то найдет слово« * - Не делайте этого. Снова перезапустите состояние игры – MadProgrammer

ответ

0

Для вашей проблемы:

  • Вы можете просто расширить JFrame вместо JPanel.
  • Вы можете установить операцию закрытия JFrame, которую вы создаете в своем конструкторе (frame). Использовать setDefaultCloseOperationhttps://docs.oracle.com/javase/7/docs/api/javax/swing/JFrame.html#setDefaultCloseOperation(int)
  • Вы можете сохранить JFrame, который у вас есть в своем конструкторе, в качестве поля экземпляра и вызывать его позже (всякий раз, когда вам нужно перезапустить игру).

Кроме того, использование текстового поля с прослушивателем клавиатуры или кнопкой «отправить» может сделать это проще - вам не понадобятся 26 буквенных кнопок, и пользовательский интерфейс будет намного более интуитивно понятным.

Кроме того, использование массивов приведет к исчезновению многих других ваших переменных.

+0

, но могу ли я использовать метод paintComponent без расширения jpanel? –

+0

Нет. Для чего вам нужна paintComponent? Кажется, вы только обновляете пользовательский интерфейс, когда пользователь нажимает. –

+0

Я на самом деле рисую палача в программе –

0

Возможно, завершите весь класс игры в родительском классе, который может управлять созданием новых JFrames, а также добавлением к нему JPANel игры?

Это логично отделяет компоненты, потому что это может сбивать с толку, когда класс компонента, добавляемый в контейнер, расширяется, а затем переходит к созданию собственного контейнера (на самом деле это нормально, если настройка пользовательского интерфейса выполнена один раз, но, возможно, не для повторяемого процесса).

0

Только один из JPanel не может быть виден, вам нужно иметь его в каком-то контейнере. Этот контейнер принимается panel.getParent().

При этом вы можете удалить себя из родительского контейнера.

Этот образец класса имеет JButton, который удаляет панель из иерархии представления при нажатии.

public static class APanel extends JPanel { 
    public APanel() { 
     super(); 

     JButton btn = new JButton(); 
     btn.setText("Hello World!"); 
     btn.addActionListener(e -> { 
      ((JButton) e.getSource()).setText("Boo!"); 
      final Container parent = APanel.this.getParent(); 
      parent.remove(APanel.this); 
      parent.repaint(); 
     }); 
     add(btn); 
    } 
} 
+0

это действительно помогло мне с другой моей программой, но есть ли что-то, что я могу сделать закрыть это конкретное окно или мне нужно использовать CardLayout? thx для вашего времени –

+0

@Notorious_Hacker Что значит «это конкретное окно»? В вашем коде есть «JPanel». Панель не является окном ('JFrame' является окном). «JPanel», являющийся «JComponent», может быть 'add()' ed и 'remove()' d из класса 'Container'. Он не может быть закрыт. Кстати: если вы нашли мой комментарий полезным, это хорошая практика для SO, чтобы проголосовать. – thst

2

Я хочу, чтобы закрыть кадр программы, чтобы открыть новый один, когда кто-то находит слово

простой ответ, нет.Вместо этого переустановите состояние игры в исходное состояние и обновите UI, согласуясь

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