我目前正在从事一个简单的计算器项目,我发现自己遇到了一个小问题。 我无法使用按钮在文本字段上书写。我希望能够使用框架上的按钮在文本上书写。
有人可以帮我吗?
这是我的代码:
import javax.swing.*;
import java.awt.*;
public class Calculator extends JFrame{
JPanel NumberPanel = new JPanel();
String [] ButtonString = {"7","8","9","4","5","6","1","2","3","0",".","+/-"};
JButton ButtonArray [] = new JButton[ButtonString.length];
JPanel OperationPanel = new JPanel();
String [] OperationString = {"Erase","Ac","*","/","+","-","Ans","="};
JButton [] OperationArray = new JButton [OperationString.length];
Calculator(){
for (int a = 0 ; a < ButtonArray.length ; a++){
ButtonArray[a]= new JButton (ButtonString[a]);
}
NumberPanel.setLayout(new GridLayout(4,3,5,5));
for (int a = 0 ; a < ButtonArray.length ; a++){
NumberPanel.add(ButtonArray[a]);
}
for (int a = 0 ; a < OperationArray.length ; a++){
OperationArray[a]= new JButton(OperationString[a]);
}
OperationPanel.setLayout(new GridLayout(4,2,5,5));
for (int a = 0 ; a < OperationArray.length ; a++){
OperationPanel.add(OperationArray[a]);
}
JPanel Finalpanel = new JPanel();
Finalpanel.setLayout(new FlowLayout());
Finalpanel.add(NumberPanel);Finalpanel.add(OperationPanel);
JTextField WritingZone = new JTextField(27);
WritingZone.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
WritingZone.setBorder(BorderFactory.createLoweredSoftBevelBorder());
WritingZone.setEditable(false);
JPanel TextPanel = new JPanel();
TextPanel.add(WritingZone);
JPanel AllPanel = new JPanel();
AllPanel.setLayout(new BorderLayout(5,5));
AllPanel.add(BorderLayout.NORTH, TextPanel);
AllPanel.add(BorderLayout.CENTER, Finalpanel);
AllPanel.setBorder(BorderFactory.createTitledBorder("Simple Calculator"));
add(AllPanel);
}
public static void main (String [] arg){
JFrame frame = new Calculator();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setSize(400,250);
frame.setResizable(false);
}
}
最佳答案
首先,遵循Java命名约定。变量名称不应以大写字符开头。我从未见过论坛上发布的教程、教科书或示例可以做到这一点,所以不要制定自己的约定。通过示例学习。
如果您希望按钮执行某些操作,那么您需要向按钮添加一个 ActionListener
。或者更好的是创建一个可以由按钮和键盘共享的操作,以便您可以使用键绑定(bind)。
简单的例子:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
public class CalculatorPanel extends JPanel
{
private JTextField display;
public CalculatorPanel()
{
Action numberAction = new AbstractAction()
{
@Override
public void actionPerformed(ActionEvent e)
{
display.setCaretPosition( display.getDocument().getLength() );
display.replaceSelection(e.getActionCommand());
}
};
setLayout( new BorderLayout() );
display = new JTextField();
display.setEditable( false );
display.setHorizontalAlignment(JTextField.RIGHT);
add(display, BorderLayout.NORTH);
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout( new GridLayout(0, 5) );
add(buttonPanel, BorderLayout.CENTER);
for (int i = 0; i < 10; i++)
{
String text = String.valueOf(i);
JButton button = new JButton( text );
button.addActionListener( numberAction );
button.setBorder( new LineBorder(Color.BLACK) );
button.setPreferredSize( new Dimension(50, 50) );
buttonPanel.add( button );
InputMap inputMap = button.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
inputMap.put(KeyStroke.getKeyStroke(text), text);
inputMap.put(KeyStroke.getKeyStroke("NUMPAD" + text), text);
button.getActionMap().put(text, numberAction);
}
}
private static void createAndShowUI()
{
// UIManager.put("Button.margin", new Insets(10, 10, 10, 10) );
JFrame frame = new JFrame("Calculator Panel");
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
frame.add( new CalculatorPanel() );
frame.pack();
frame.setLocationRelativeTo( null );
frame.setVisible(true);
}
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowUI();
}
});
}
}
关于java - 如何使用 JFrame 上的 JButtons 在 JTextField 上书写?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23528735/