我正在使用Java swing使用计算器,并且希望能够通过键盘输入数字和操作。我似乎无法正常工作。
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Calculator extends JFrame implements ActionListener {
JPanel[] row = new JPanel[6];
JButton[] button = new JButton[23];
JMenuBar menubar = new JMenuBar();
JMenu file = new JMenu("File");
JMenuItem clear = new JMenuItem("Clear");
JMenuItem exit = new JMenuItem("Exit");
String[] buttonString = {"7", "8", "9", "+",
"4", "5", "6", "-",
"1", "2", "3", "*",
".", "/", "C", "√",
"+/-", "=", "0", "mod", "x^2", "x^y", "?"};
int[] dimW = {300,45,100,90};
int[] dimH = {35, 40};
Dimension displayDimension = new Dimension(dimW[0], dimH[0]);
Dimension regularDimension = new Dimension(dimW[1], dimH[1]);
Dimension rColumnDimension = new Dimension(dimW[2], dimH[1]);
Dimension zeroButDimension = new Dimension(dimW[3], dimH[1]);
boolean[] function = new boolean[6];
double[] temporary = {0, 0};
JTextArea display = new JTextArea(1,20);
Font font = new Font("Times new Roman", Font.BOLD, 14);
Calculator() {
super("My Calculator");
clear.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event){
clear();
}
});
exit.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event){
System.exit(0);
}
});
file.add(clear);
file.add(exit);
menubar.add(file);
setJMenuBar(menubar);
setDesign();
setSize(420, 350);
setResizable(false);
setDefaultCloseOperation(EXIT_ON_CLOSE);
GridLayout grid = new GridLayout(6,5);
setLayout(grid);
for(int i = 0; i < 6; i++)
function[i] = false;
FlowLayout f1 = new FlowLayout(FlowLayout.CENTER);
FlowLayout f2 = new FlowLayout(FlowLayout.CENTER,1,1);
for(int i = 0; i < 6; i++)
row[i] = new JPanel();
row[0].setLayout(f1);
for(int i = 1; i < 6; i++)
row[i].setLayout(f2);
for(int i = 0; i < 23; i++) {
button[i] = new JButton();
button[i].setText(buttonString[i]);
button[i].setFont(font);
button[i].addActionListener(this);
}
//here is where I'm trying to map button[0] to key 7.
button[0].getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_NUMPAD7,0), button[0].getText());
button[0].getActionMap().put(button[0].getText(), new Click(button[0]));
display.setFont(font);
display.setEditable(false);
display.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
display.setPreferredSize(displayDimension);
for(int i = 0; i < 14; i++)
button[i].setPreferredSize(regularDimension);
for (int i = 19; i < 23; i++)
button[i].setPreferredSize(zeroButDimension);
for(int i = 14; i < 18; i++)
button[i].setPreferredSize(rColumnDimension);
button[18].setPreferredSize(zeroButDimension);
row[0].add(display);
for(int i = 0; i < 4; i++)
row[1].add(button[i]);
row[1].add(button[14]);
for(int i = 4; i < 8; i++)
row[2].add(button[i]);
row[2].add(button[15]);
for(int i = 8; i < 12; i++)
row[3].add(button[i]);
row[3].add(button[16]);
row[4].add(button[18]);
for(int i = 12; i < 14; i++)
row[4].add(button[i]);
row[4].add(button[17]);
for(int i = 19; i<23; i++)
row[5].add(button[i]);
for(int i = 0; i<6; i++)
add(row[i]);
setVisible(true);
}
public final void setDesign() {
try {
UIManager.setLookAndFeel(
"com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
} catch(Exception e) {
}
}
public class Click extends AbstractAction
{
JButton button;
public Click(JButton button)
{
this.button = button;
}
@Override
public void actionPerformed(ActionEvent e)
{
button.doClick();
}
}
public void actionPerformed(ActionEvent ae) {
if(ae.getSource() == button[0])
display.append("7");
if (ae.getSource() == button[1])
display.append("8");
if(ae.getSource() == button[2])
display.append("9");
if(ae.getSource() == button[3])
{//add
temporary[0] = Double.parseDouble(display.getText());
function[0] = true;
display.setText("");
}
if(ae.getSource() == button[4])
display.append("4");
if(ae.getSource() == button[5])
display.append("5");
if(ae.getSource() == button[6])
display.append("6");
if(ae.getSource() == button[7])
{//subtract
function[1]= true;
temporary[0] = Double.parseDouble(display.getText());
display.setText("");
}
if(ae.getSource() == button[8])
display.append("1");
if(ae.getSource() == button[9])
display.append("2");
if(ae.getSource() == button[10])
display.append("3");
if(ae.getSource() == button[11])
{//multiply
function[2] = true;
temporary[0] = Double.parseDouble(display.getText());
display.setText("");
}
if(ae.getSource() == button[12])
display.append(".");
if(ae.getSource() == button[13])
{//divide
function[3] = true;
temporary[0] = Double.parseDouble(display.getText());
display.setText("");
}
if(ae.getSource() == button[14])
clear();
if(ae.getSource() == button[15])
getSqrt();
if(ae.getSource() == button[16])
getPosNeg();
if(ae.getSource() == button[17])
getResult();
if(ae.getSource() == button[18])
display.append("0");
if(ae.getSource() == button[19])
{//modular
function[4] = true;
temporary[0] = Double.parseDouble(display.getText());
display.setText("");
}
if(ae.getSource() == button[20])
getSquare();
if(ae.getSource() == button[21])
{//power
function[5] = true;
temporary[0] = Double.parseDouble(display.getText());
display.setText("");
}
if(ae.getSource() == button[22])
display.setText("This APT has super cow powers");
}
public void clear()
{
try
{
display.setText("");
for (int i = 0; i<6; i++)
function[i]=false;
for (int i = 0; i<2; i++)
temporary[i] = 0;
}
catch (NullPointerException e)
{
}
}
public void getSqrt()
{
try
{
double value = Math.sqrt(Double.parseDouble(display.getText()));
display.setText(Double.toString(value));
}
catch (NumberFormatException e)
{
}
}
public void getPosNeg()
{
try
{
double value = Double.parseDouble(display.getText());
if (value != 0)
{
value = value * -1;
display.setText(Double.toString(value));
}
}
catch (NumberFormatException e)
{
}
}
public void getSquare()
{
try
{
double value = Double.parseDouble(display.getText());
value = value*value;
display.setText(Double.toString(value));
}
catch (NumberFormatException e)
{
}
}
public double getPow()
{
double value = Double.parseDouble(display.getText());
value = Math.pow(temporary[0], temporary[1]);
return value;
}
public void getResult()
{
double result = 0;
temporary[1] = Double.parseDouble(display.getText());
String temp0 = Double.toString(temporary[0]);
String temp1 = Double.toString(temporary[1]);
try
{
if(temp0.contains("-"))
{
String[] temp00 = temp0.split("-",2);
temporary[0] = (Double.parseDouble(temp00[1]) * -1);
}
if (temp1.contains("-"))
{
String[] temp11 = temp1.split("-",2);
temporary[1] = (Double.parseDouble(temp11[1]) *-1);
}
}
catch (ArrayIndexOutOfBoundsException e)
{
}
try
{
if(function[5])
result = getPow();
else if(function[2])
result = temporary[0] * temporary[1];
else if(function[3])
result = temporary[0] / temporary[1];
else if (function[4])
result = temporary[0] % temporary[1];
else if(function[0])
result = temporary[0] + temporary[1];
else if(function[1])
result = temporary[0] - temporary[1];
display.setText(Double.toString(result));
for(int i = 0; i<6; i++)
function[i] = false;
}
catch(NumberFormatException e)
{
}
}
public static void main(String[] arguments) {
Calculator c = new Calculator();
}
}
我认为这是问题所在:
button[0].getInputMap().put(...);
从JComponent.getInputMap()
javadoc:
返回
InputMap
组件具有焦点时使用的。这是的便捷方法getInputMap(WHEN_FOCUSED)
。
因此,按钮必须具有焦点才能正常工作。由于您正在使用计算器,因此建议您改用以下方法:
button[0].getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(...);
JComponent.getInputMap(int
condition)
:返回条件期间使用的InputMap。
参数:
condition
-一WHEN_IN_FOCUSED_WINDOW
,WHEN_FOCUSED
,WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
问题内容: 我如何限制键盘输入,然后再将其输入到JTextField中(摆动) 我只允许用户输入“ + -0123456789abcdef,”。字符,且不超过1 或char 我的JTextField是单行输入字段。 谢谢! 问题答案: 您可以通过DocumentFilter实现此目的。这使您可以控制任何文档类型的文本处理。或使用JFormattedTextField
问题内容: 我正在用Java编写游戏,现在是Swing + JOGL-一个带有GLCanvas的JFrame。 我使用etc.事件()处理输入,但似乎无法正常工作: 当我同时按下3个以上的键时,它们无法正确注册 -显然这是键盘的错误,我必须找到替代的控制方案。 窗口丢失后,重新获得焦点,输入完全停止工作… 我究竟做错了什么? 有没有更好的方法来处理Java中的键盘输入? (除非我别无选择,否则我不
问题内容: 我已经实现了ListSelectionListener,如下所示,因此在选择了第一个表中的特定行之后,第二个表将进行相应的更新。 有没有一种方法不仅可以在选择鼠标时,而且可以在通过键盘进行选择时调用侦听器? 问题答案: 出现异常体验的原因-没有通过键盘选择的通知-是valueIsAdjusting针对键盘与鼠标触发的选择事件的微妙不同设置: 键盘触发的选择(即使带有修饰符)仅触发一次(
我正在使用python 3.4的curses,我需要一个简单的方法来用箭头键计数,每次我按上,x给自己加1,按下,它从自己减去1。
问题内容: 我已经用Java设计了自己的合成器,现在我想将其与Midi键盘连接。我在下面的课程搜索所有带有发射器的Midi设备。它成功找到了我的Midi键盘。我将自己的接收器添加到每个设备的每个发送器中,以便它可以接收所有可能的信息。通过阅读所有帮助文档和Java文档,我知道Transmitter将MidiEvents发送给Receiver,然后由Receiver使用send方法处理它们。因此,我