java - 如何使用 JFrame 上的 JButtons 在 JTextField 上书写?

标签 java swing jbutton jtextfield

我目前正在从事一个简单的计算器项目,我发现自己遇到了一个小问题。 我无法使用按钮在文本字段上书写。我希望能够使用框架上的按钮在文本上书写。

有人可以帮我吗?

这是我的代码:

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/

相关文章:

Java JTabbedPane无法添加多个选项卡?

java - JButton 在 Windows 上显示浅蓝色背景

java - 具有多个 main 的 Jar

java - 将 Java 时间戳转换为 MySQL 时间戳,反之亦然

java - 使用 Cake 与 Clojure 一起构建 Java

java - 从 Android 手机的 Blogspot 博客中提取 HTML 数据

java - JTextField问题

java - 没有在 Java 中调用 paintComponents 方法

java - 将按钮的旧 ActionListener 替换为新的 ActionListener

java - 每次按下 JButton 时如何增加 JTextField 中的数字?