英里到公里转换器(事件驱动)

时间:2013-07-25 00:04:26

标签: java swing jtextfield keylistener

我需要创建一个显示里程公里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);
    }
}

3 个答案:

答案 0 :(得分:3)

而不是将KeyListeners添加到文本字段(实际上效果不好),您应该添加ActionListener,就像您将一个动作侦听器弄到一个按钮一样。按Enter键时会激活它们。

答案 1 :(得分:2)

使用KeyListener可以使用KeyBindings

当你使用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 

答案 2 :(得分:-1)

来自:jcpartri

您好!

此链接可能会对您有所帮助。它也位于stackoverflow.com中。 有没有理由你切换到一个KeyListener和另一个ActionListener? 以下链接建议您使用keyReleased方法。

KeyListener, keyPressed versus keyTyped