2013-10-25 3 views
1

JFrame не выключается, когда нажата кнопка «X» по умолчанию. Я думаю, что эта проблема имеет какое-то отношение к тому, что основной поток не читается, но я не понимаю тонкости качания или, честно говоря, потоков в целом. «Окно» - это расширение JFrame, «Boxy» управляет программой. Программа находится только на начальных этапах. Кроме того, я хотел бы знать, как заставить основной поток запускать каждый цикл. Не удалось найти что-либо об этом в других вопросах.JFrame не будет закрываться при нажатии кнопки «X».

public class Window extends JFrame implements KeyListener{ 
    private static final long serialVersionUID = 1L; 
JPanel panel; 
public Window(){ 
    super("FileTyper"); 
    super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    super.setSize(200,100); 
    super.setResizable(false); 
    panel = new JPanel(); 
    super.getContentPane().add(panel); 
    super.setFocusable(true); 
    addKeyListener(this); 

    super.setVisible(true); 
} 
public void update(){ 

} 
public void render(Graphics2D g){ 

} 
@Override 
public void keyPressed(KeyEvent e) { 

} 
@Override 
public void keyReleased(KeyEvent e) { 
    switch(e.getKeyCode()) { 
    case KeyEvent.VK_F9: 
     break; 
    case KeyEvent.VK_F10: 
     break; 
    } 

} 
@Override 
public void keyTyped(KeyEvent arg0) { 

} 

}

public class Boxy { 
public Window window; 

public static void main (String args[]){ 
    start(); 
} 
public Boxy(){ 
    init(); 
    boolean forever = true; 
    while(forever){ 
     update(); 
     render(); 
     delay(); 
    } 
} 
private void init(){ 
    window = new Window(); 
} 
private void update(){ 
    window.update(); 
} 
private void render(){ 
    Graphics2D g2 = (Graphics2D) window.getContentPane().getGraphics(); 
    window.render(g2); 
    g2.fillRect(0, 0, 100, 100); 
} 
private void delay(){ 
    try {Thread.sleep(20);} catch (InterruptedException ex) {System.out.println("ERROR: Delay compromised");} 
} 
public static void start(){ 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      Boxy box = new Boxy(); 
     } 
    }); 
} 
} 
+0

престижности для того, новичок, который не использует ящик для UI –

ответ

4

Я хотел бы предложить, что вы блокируете событие диспетчерской тему с

while(forever){ 
    update(); 
    render(); 
    delay(); 
} 

Это препятствует очереди событий от обработки события, которое бы закрыть окно.

Начните с обзора Concurrency in Swing. Я бы посоветовал вам сначала взглянуть на что-то вроде javax.swing.Timer, но если вы хотите больше контролировать частоту кадров, вам понадобится использовать какой-то Thread. Помните, однако, Swing ожидает, что все обновления будут выполнены из контекста Event Dispatching Thread.

Пользовательские картины в Swing, не делается с помощью что-то вроде ...

Graphics2D g2 = (Graphics2D) window.getContentPane().getGraphics(); 

Graphics контекст недолгим, ничего краску к нему (используя этот метод) будет уничтожен на следующем цикле краски ,

Вместо этого вы должны использовать что-то вроде JPanel в качестве основы для своей картины и переопределить его метод paintComponent и отобразить состояние изнутри, когда оно вызывается.

Вам необходимо просто позвонить repaint, если вы хотите обновить компонент.

Посмотрите на Performing Custom Painting для получения более подробной информации.

Я также рекомендовал бы вам взглянуть на How to use Key Bindings как aletrnative к KeyListener

+0

1+ для великих умов мыслят одинаково. –

+0

@HovercraftFullOfEels Я думал то же самое, уже + 1'nd вы отвечаете – MadProgrammer

+0

Есть ли быстрое решение? Я не намерен, чтобы эта программа была слишком длинной с некоторыми другими типами циклов, на которые я смотрел. Все классы в моей программе – Killam

4

"игра" цикл вашей программы неправилен:

while(forever){ 
    update(); 
    render(); 
    delay(); 
} 

Вместо зацикливания программы, она замерзает его привязывания нить Качели событий или EDT (для E vent D ispatch T hread). Для этой функции вы должны использовать Swing Timer.

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