Java 使用回车按钮打破 while 循环
Java Break a while loop with enter button
问题是我正在制作一个 JFrame,其中显示的文本几乎就像一部视觉小说。当 JLabel 中的文本完成后,底部会显示一个闪烁的箭头符号“>”。我已经走到这一步了,但是如果我按下回车键,我该如何使 'while' 循环中断。网上几乎所有的答案都是关于 JTextField 和控制台的...
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;
}
编辑
所以在一些混合之后我改变了程序... none 的答案有效(或者我做错了什么 idk...)
现在新代码是:
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();
}
continue change方法在这里(又一个class):
public void keyPressed(KeyEvent e) {
if (e.getKeyChar() == 's') {
VONGINE.SysPrint("S");
VONGINE.Continue = 1;
}
}
最后是新问题...我如何调用...
keyPressed(KeyEvent e)
...在 do 循环期间?
首先,您不需要使用 while (true)
循环。这是一个 Swing GUI,您可能会在 Swing 事件线程上不断循环,冻结您的 GUI。相反,您需要以不同的方式思考,以事件驱动的方式思考,因为这是大多数 GUI(包括 Swing)的工作方式。
要在 JLabel 中做一些事情 "blink",请使用 Swing 计时器代替 while 循环,并在计时器的 ActionListener 中交替显示和不显示 JLabel 中的“>”字符。
要在按下 enter 时停止此操作,请使用键绑定(而不是 KeyListener)。或者,如果 JTextField 具有焦点,则添加到 JTextField 的 ActionListener 将起作用。
例如,考虑按以下方式尝试:
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();
}
});
}
}
请注意,这里没有 while 或 do-while 循环,没有不必要的静态方法或字段,所有调用都在 Swing 事件线程上完成。
问题是我正在制作一个 JFrame,其中显示的文本几乎就像一部视觉小说。当 JLabel 中的文本完成后,底部会显示一个闪烁的箭头符号“>”。我已经走到这一步了,但是如果我按下回车键,我该如何使 'while' 循环中断。网上几乎所有的答案都是关于 JTextField 和控制台的...
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;
}
编辑
所以在一些混合之后我改变了程序... none 的答案有效(或者我做错了什么 idk...)
现在新代码是:
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();
}
continue change方法在这里(又一个class):
public void keyPressed(KeyEvent e) {
if (e.getKeyChar() == 's') {
VONGINE.SysPrint("S");
VONGINE.Continue = 1;
}
}
最后是新问题...我如何调用...
keyPressed(KeyEvent e)
...在 do 循环期间?
首先,您不需要使用 while (true)
循环。这是一个 Swing GUI,您可能会在 Swing 事件线程上不断循环,冻结您的 GUI。相反,您需要以不同的方式思考,以事件驱动的方式思考,因为这是大多数 GUI(包括 Swing)的工作方式。
要在 JLabel 中做一些事情 "blink",请使用 Swing 计时器代替 while 循环,并在计时器的 ActionListener 中交替显示和不显示 JLabel 中的“>”字符。
要在按下 enter 时停止此操作,请使用键绑定(而不是 KeyListener)。或者,如果 JTextField 具有焦点,则添加到 JTextField 的 ActionListener 将起作用。
例如,考虑按以下方式尝试:
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();
}
});
}
}
请注意,这里没有 while 或 do-while 循环,没有不必要的静态方法或字段,所有调用都在 Swing 事件线程上完成。