【发布时间】:2023-01-20 01:33:37
【问题描述】:
我有以下代码:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.*;
import javax.swing.event.*;
@SuppressWarnings("serial")
public class MyList
extends JFrame
implements ActionListener, ListSelectionListener, KeyListener
{
static MyList mylist = new MyList();
public static void main(String[] args)
{
// TODO Auto-generated method stub
JFrame frame = new JFrame();
frame.setSize(600, 800);
frame.setDefaultCloseOperation(3);
JPanel panel = new JPanel();
JLabel title = new JLabel("<html><body><h1>To-Do-List</h1></body></html>");
title.setPreferredSize(new Dimension(600, 80));
title.setHorizontalAlignment(JLabel.CENTER);
/*
title.setOpaque(true);
title.setBackground(Color.cyan);
*/
/*
JTextField newTask = new JTextField();
newTask.setHorizontalAlignment(JTextField.CENTER);
newTask.setPreferredSize(new Dimension(400, 40));
*/
JTextArea newTask_field = new JTextArea(3, 1);
newTask_field.setPreferredSize(new Dimension(400, 80));
newTask_field.setLineWrap(true);
newTask_field.setWrapStyleWord(true);
JScrollPane newTask = new JScrollPane(newTask_field);
newTask.setPreferredSize(new Dimension(400, 80));
JButton confirm = new JButton("Add");
confirm.setHorizontalAlignment(JButton.CENTER);
confirm.setEnabled(false);
DefaultListModel<String> listModel = new DefaultListModel<>();
//listModel.addElement("");
JList<String> done = new JList<String>(listModel);
done.setPreferredSize(new Dimension(200, 400));
DefaultListModel<String> listModel2 = new DefaultListModel<>();
JList<String> notDoneYet = new JList<String>(listModel2);
notDoneYet.setPreferredSize(new Dimension(200, 400));
panel.add(title);
//panel.add(newTask);
panel.add(newTask);
panel.add(mylist.createEmptySpace(new JLabel(), 600, 40));
panel.add(confirm);
panel.add(mylist.createEmptySpace(new JLabel(), 600, 0));
panel.add(done);
panel.add(mylist.createEmptySpace(new JLabel(), 100, 400));
panel.add(notDoneYet);
frame.add(panel);
frame.setVisible(true);
//-------------------------------//
newTask.setFocusable(true);
newTask_field.setFocusable(true);
if(newTask_field.getText().equals(""))
{
//Unused if-statement
}
newTask.addKeyListener(new KeyListener()
{
@Override
public void keyTyped(KeyEvent e)
{
// TODO Auto-generated method stub
if(e.getKeyCode() == KeyEvent.VK_A)
{
}
}
@Override
public void keyReleased(KeyEvent e)
{
// TODO Auto-generated method stub
}
@Override
public void keyPressed(KeyEvent e)
{
// TODO Auto-generated method stub
}
});
}
//Method createEmptySpace(JLabel(), int, int) which works.
}
现在,我希望它在每次按下打印字符(a-z、1-9、0、*、+、# 等特殊符号)的键时运行 keyTyped 事件。 (此外,我想在按下 Enter、Backspace 或 Delete 后检查 JTextArea 是否为空)。问题是,做一个常规的 if-else 或 switch-case-statement 是荒谬的。想象一下,执行 26+10+dontKnowHowMuch 条件来检查像这样的每个键。有没有办法让它变短,这样我就不需要那样拉伸它了?
更新:我将以下代码写入 KeyListener:
newTask_field.addKeyListener(new KeyListener()
{
@Override
public void keyTyped(KeyEvent e)
{
// TODO Auto-generated method stub
if(e.getKeyCode() == KeyEvent.VK_A)
{
confirm.setEnabled(true);
newTask_field.setText(newTask_field.getText() + e.getKeyCode());
}
if(e.getKeyCode() == KeyEvent.VK_ALPHANUMERIC)
{
System.out.println("Alphanumeric sign");
confirm.setEnabled(true);
newTask_field.setText(newTask_field.getText() + e.getKeyChar());
}
if(e.getKeyChar()==KeyEvent.VK_UNDEFINED)
{
System.out.println("Undefined");
}
}
@Override
public void keyReleased(KeyEvent e)
{
// TODO Auto-generated method stub
if(e.getKeyCode() == KeyEvent.VK_BACK_SPACE ||
e.getKeyCode() == KeyEvent.VK_DELETE ||
e.getKeyCode() == KeyEvent.VK_ENTER ||
e.getKeyCode() == KeyEvent.VK_SPACE ||
e.getKeyCode() == KeyEvent.VK_TAB ||
e.getKeyCode() == KeyEvent.VK_CIRCUMFLEX ||
e.getKeyCode() == KeyEvent.VK_DEAD_ACUTE ||
e.getKeyCode() == KeyEvent.VK_DEAD_GRAVE)
{
if (newTask_field.getText().isBlank())
{
confirm.setEnabled(false);
}
}
if(e.getKeyCode() == KeyEvent.VK_UNDEFINED)
{
System.out.println("Undefined");
}
}
@Override
public void keyPressed(KeyEvent e)
{
// TODO Auto-generated method stub
}
});
而且无论我在 JTextArea 中键入什么,也无论 KeyListener 是用于 newTask 还是用于 newTask_field,都不会发生任何事情。标志出现在 JTextArea 中,但 KeyListener 什么也不做。任何想法为什么?
【问题讨论】:
-
如果你只想得到输入的字符,你可以做e.getText()。如果您需要测试每个字符,那么我认为最简洁的方法是执行 switch()/case:
-
我需要在哪里写e.getText()?根据 Eclipse,对于此 KeyListener 中的 e,getText() 甚至不存在。
-
正在考虑javaFX,抱歉。您可以按照 MDH 的建议调用 e.getKeyChar()。它会给你按下的键的字符串值
标签: java jscrollpane jtextarea keylistener