2015-02-25 2 views
0

Дело в том, что я создаю JFrame с текстом, показанным почти как визуальный роман. И когда текст в JLabel сделан, в нижней части экрана отображается мигающий символ стрелки «>». Я добираюсь так далеко, но как мне сделать перерыв цикла while, если я нажму клавишу ввода. Allmost все ответы в Интернете было около JTextField и консоли ...Java Break a while loop with enter button

public static void nextSymbol(boolean blink) { 
    ImageIcon nextIcon = null; 
    boolean blinked = false; 
    if(blink) { 
     nextIcon = new ImageIcon("res/image/next.gif"); 
     while(blink){ 
      if (/* When ENTER is pressed */){ 
       System.out.println("Disabled"); 
       blink = false; 
      } 
      pause(0.01); 
     } 
     blinked = true; 
    } 
    if(!blink && blinked) 
     vnGame.nextSymbolIcon.setIcon(null); 
    else 
     ; 
    blinked = false; 
} 

EDIT

Таким образом, после некоторого смешения я изменил программу ... ни один из ответов не работал (или я неправильно somethign ИДК ...)

Ну новый код теперь:

public static void nextSymbol() { 
    ImageIcon nextIcon = null; 
    nextIcon = new ImageIcon("res/image/next.gif"); 
    vnGame.nextSymbolIcon.setIcon(nextIcon); 
    boolean next = false; 
    Continue = 0; 

    do { 
     vnGame.contentPane.requestFocus(); 
     switch(Continue) { 
      case 1:{ 
       next = true; 
       break; 
      } 
      default:break; 
     } 
    }while(!next); 
    SysPrint("Continue!");nl(); 
} 

продолжени метод изменения здесь (другой класс):

public void keyPressed(KeyEvent e) { 
    if (e.getKeyChar() == 's') { 
     VONGINE.SysPrint("S"); 
     VONGINE.Continue = 1; 
    } 
} 

И, наконец, новый вопрос проблема ... Как я называю ...

keyPressed(KeyEvent e) 

... во время цикла делать?

+0

[Class KeyEvent] (http://docs.oracle.com/javase/7/docs/api/java/awt/event/KeyEvent.html) – Smit

+0

Честно говоря, я не понимаю вопроса. Я действительно не понимаю, чего вы пытаетесь достичь.Наверное, давая нам больше контекста и рассказывая нам, что ваша цель, поможет нам помочь вам. –

+0

Я хочу сделать цикл, на этот раз в цикле while, который ломается, если я нажимаю EnterKey на моей клавиатуре. В принципе, бесконечный цикл с перерывом на ввод ключа. –

ответ

5

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

Чтобы сделать что-то «мигающим» в JLabel, используйте таймер Swing вместо вашего цикла while и чередуйте в ActionListener вашего Таймера, показывая и не показывающий символ «>» в ​​JLabel.

Чтобы остановить это при нажатии клавиши ввода, используйте привязки клавиш (не KeyListener). Или если JTextField имеет фокус, то ActionListener, добавленный в JTextField, будет работать.


Для примера рассмотрим попробовать что-то вдоль этих линий:

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.KeyEvent; 
import java.net.MalformedURLException; 
import java.net.URL; 

import javax.swing.*; 

@SuppressWarnings("serial") 
public class SwappingLabel extends JPanel { 
    public static final String IMG_PATH = "http://www.guitarchordsmagic.com/images/arrow.gif"; 
    private static final int PREF_W = 400; 
    private static final int PREF_H = PREF_W; 
    private JLabel nextSymbolIcon = new JLabel("", SwingConstants.CENTER); 
    private Icon nextIcon; 

    public SwappingLabel() throws MalformedURLException { 
     // Create our ImageIcon from online (or local) source 
     nextIcon = getOnlineIcon(IMG_PATH); 

     // add icon to JLabel 
     nextSymbolIcon.setIcon(nextIcon); 

     // set up key binding to recognize enter key press 
     setupKeyBinding(); 

     // add the JLabel to the bottom of the GUI 
     setBackground(Color.white); 
     JPanel southPanel = new JPanel(); 
     southPanel.setOpaque(false); 
     southPanel.add(nextSymbolIcon); 
     setLayout(new BorderLayout()); 
     add(southPanel, BorderLayout.PAGE_END); 
    } 

    private Icon getOnlineIcon(String path) throws MalformedURLException { 
     URL imgUrl = new URL(path); 
     return new ImageIcon(imgUrl); 
    } 

    private void setupKeyBinding() { 
     int condition = WHEN_IN_FOCUSED_WINDOW; 
     InputMap inputMap = getInputMap(condition); 
     ActionMap actionMap = getActionMap(); 
     KeyStroke enterKey = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0); 

     // the action that will be called when enter is pressed 
     Action action = new EnterAction(); 

     // bind the key press to the component to the action 
     inputMap.put(enterKey, enterKey.toString()); 
     actionMap.put(enterKey.toString(), action); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet()) { 
     return super.getPreferredSize(); 
     } 
     return new Dimension(PREF_W, PREF_H); 
    } 

    private class EnterAction extends AbstractAction { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
     nextSymbolIcon.setIcon(null); 
     } 
    } 

    private static void createAndShowGui() { 
     JFrame frame = new JFrame("Blinking Label"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     try { 
     frame.getContentPane().add(new SwappingLabel()); 
     } catch (MalformedURLException e) { 
     e.printStackTrace(); 
     System.exit(-1); 
     } 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 

Обратите внимание, что нет пока и делать-то время не петлями здесь, нет ненужных статических методов или полей, и все вызовы выполняются на Качание событий.

+0

Это дух! :-) –

+0

@HoverCraftFullOfEels Попробуйте это ... посмотрим, сработает ли это. :) –

+0

@valrossen_Oliver: см. Править, чтобы ответить, включая код. –

-1

Хорошо ... это заняло много времени, но это, наконец, исправлено! Сначала я добавил KeyListener в свой JPanel (contentpane). Вот панель:

contentPane = new JPanel(); 
    contentPane.setBackground(Color.BLACK); 
    contentPane.setAlignmentX(0.0f); 
    contentPane.setAlignmentY(0.0f); 
    contentPane.setBorder(new EmptyBorder(0, 0, 0, 0)); 
    setContentPane(contentPane); 

А вот слушатель:

contentPane.addKeyListener(new KeyListener() { 

     @Override 
     public void keyTyped(KeyEvent e) {} 

     @Override 
     public void keyReleased(KeyEvent e) {} 

     @Override 
     public void keyPressed(KeyEvent e) { 
      if(e.getKeyCode() == KeyEvent.VK_ENTER) 
       VONGINE.Continue = 1; 
     } 
    }); 
    vnGame.contentPane.setFocusable(true); 

после этого я просто изменил функцию паузы в этом:

public static void nextSymbol() { 
    ImageIcon nextIcon = null; 
    nextIcon = new ImageIcon("res/image/next.gif"); 
    vnGame.nextSymbolIcon.setIcon(nextIcon); 
    boolean next = false; 
    Continue = 0; 

    do { 
     vnGame.contentPane.requestFocus(); 
     switch(Continue) { 
      case 1:{ 
       next = true; 
       break; 
      } 
      default:break; 
     } 
    }while(!next); 
    SysPrint("Continue!");nl(); 
} 

Ну, спасибо за помощь все равно ребята. Не знал бы, какие функции искать без вас!

+0

Извините, но это очень хрупкое решение, которое я не рекомендую, особенно ваш цикл while-while. Если вы могли бы опубликовать больше своего кода в своем исходном вопросе, желательно [mcve] (http://stackoverflow.com/help/mcve) (пожалуйста, ознакомьтесь с ссылкой), мы сможем показать вам код, который работать лучше и быть намного более надежными. –

+0

Также, пожалуйста, опишите более подробно, какое поведение вы пытаетесь выявить. –

+0

Например, вы указываете, '' когда текст в JLabel сделан ... "', что вы подразумеваете под этим? Прокрутка текста? Он показывает несколько строк? Можете ли вы показать изображения того, что ваша программа пытается сделать? –