【问题标题】:Miles to Kilometers converter (event driven)英里到公里转换器(事件驱动)
【发布时间】:2013-07-24 16:31:15
【问题描述】:

我需要创建一个 JPanel 来显示 英里公里。当您将数字输入一个时,它会使用 Enter 键将其转换为另一个。

我不知道如何正确获取KeyListener 来执行转换。我不是在寻找答案,只是一些指导或类似示例的链接。 谢谢。

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.*;

import javax.swing.*;

public class Ch09Asg extends JFrame {
    private JTextField jtfMiles = new JTextField(10);
    private JTextField jtfKilo = new JTextField(10);

    public Ch09Asg() {
        JPanel p1 = new JPanel(new GridLayout(2,2));        
        p1.setSize(400,250);
        p1.add(new JLabel("Mile"));
        p1.add(jtfMiles);
        p1.add(new JLabel("Kilometers"));
        p1.add(jtfKilo);
        jtfMiles.setHorizontalAlignment(JTextField.RIGHT);
        jtfKilo.setHorizontalAlignment(JTextField.RIGHT);

        add(p1, BorderLayout.CENTER);

        jtfMiles.addActionListener(new ButtonListener(){
        });

        jtfKilo.addActionListener(new ButtonListener(){
        });
    }

    class ButtonListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            //double mi = convertKmtoMi 
            //Double.parseDouble(jtfMiles.getText());
            //double kilom =
            //Double.parseDouble(jtfKilo.getText());
            //---------------------------------------KILOTOMILE

            String kmStr = jtfKilo.getText();      //Note 3
            double km = Double.parseDouble(kmStr);

            //... Convert it
            double mi = convertKmToMi(km);                //Note 4

            //... Convert it to a string and set mi textfield
            jtfMiles.setText("" + mi); 

            //--------------------------------------MILESTOKILO
            String miStr = jtfMiles.getText();      //Note 3
            double mi2 = Double.parseDouble(miStr);

            //... Convert it
            double km2 = convertKmToMi(mi2);                //Note 4

            //... Convert it to a string and set mi textfield
            jtfMiles.setText("" + km2); 
        }
    }

    public static double convertKmToMi(double kilometers) {
        // Assume there are 0.621 miles in a kilometer.
        double miles = kilometers * 0.621;
        return miles;
    }

    public static double convertMitoKm(double miles) {
        // Assume there are 0.621 miles in a kilometer.
        double kilometers = miles / 0.621;
        return kilometers;
    }

    public static void main(String[] args) {
        Ch09Asg frame = new Ch09Asg();
        frame.pack();
        frame.setTitle("Mile/Kilometer Converter");
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

【问题讨论】:

  • 顺便说一句,if (e.getKeyCode() == KeyEvent.VK_ENTER); 什么都不做,System.out.println("43"); 应该是 System.out.println("42"); :-)
  • 我不确定如何将 KeyEvent 链接到 ButtonListener 类。我正在使用 System.out 来查看它是否至少在文本字段中读取了 Enter 。我完全迷路了。对不起,如果我的代码到处都是。
  • @user2616657,阅读给出的答案。您不应该使用 KeyEvent。您只需使用 addActionListener() 方法将 ButtonListener 添加到文本字段。
  • 非常感谢!我得到了工作和计算的密钥,但要使文本字段工作,我必须在 actionPerformed 区域中只有一个。我是否为其他文本字段计算创建另一个 actionPerformed?
  • 另见Converter

标签: java swing jtextfield keylistener


【解决方案1】:

您应该添加ActionListeners,而不是添加KeyListeners 到文本字段,这实际上并不能很好地工作,就像您将动作侦听器添加到按钮一样。当你按下回车键时它们会被激活。

【讨论】:

  • +1 for the actionListener,尝试建议使用Key Bindings 而不是KeyListenerActionListener
  • +1,用于利用 API。 @Azad,文本字段旨在使用 ActionListener。无需为 Enter 键创建您自己的键绑定。 Enter 键的键绑定将调用 ActionListener。
  • 类似 jtfMiles.addActionListener(new ActionListener())
  • @camickr:感谢您的纠正。我必须将我的评论更改为 而不是 KeyListener
【解决方案2】:

您可以使用 KeyBindings 代替 KeyListener

KeyListener 不适合您正在执行的操作,因为当您使用 keyListener 时,每个键(键入、释放或按下)都会被执行。

所以如果您使用 KeyBinding,您可以将操作绑定到特定键

AbstractAction enterAction = new AbstractAction() {
    @Override
    public void actionPerformed(ActionEvent e) {
         //conversion code here example

    }};
 String key = "ENTER";
 KeyStroke keyStroke = KeyStroke.getKeyStroke(key);
 component.getInputMap(JComponent.WHEN_FOCUSED).put(keyStroke, key);
 component.getActionMap().put(key, escapeAction);

最好的情况是您不必专注或专注。您可以使用这些 JComponent 常量

WHEN_ANCESTOR_OF_FOCUSED_COMPONENT 
WHEN_FOCUSED 
WHEN_IN_FOCUSED_WINDOW 

【讨论】:

  • 通常是使用键绑定的好建议,但在这种情况下不是。 JTextField 已经具有 Enter 键的键绑定。它将调用 ActionListener。
【解决方案3】:

来自:jcpartri

你好!

此链接可能会对您有所帮助。它也位于 stackoverflow.com 中。 您是否有任何理由切换到一个 KeyListener 和另一个 ActionListener ? 下面的链接建议您改用 keyReleased 方法。

KeyListener, keyPressed versus keyTyped

【讨论】:

  • 我想看看哪一个能用。我会检查链接谢谢。
猜你喜欢
  • 2017-06-12
  • 1970-01-01
  • 1970-01-01
  • 2021-12-17
  • 2011-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-04
相关资源
最近更新 更多