1

我需要创建一个JPanel显示MilesKilometers的。当您将数字输入一个时,它会使用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);
    }
}
4

3 回答 3

3

您应该添加 s,而不是添加KeyListeners到实际上效果不佳的文本字段,ActionListener就像您将动作侦听器添加到按钮一样。当您按下回车键时,它们会被激活。

于 2013-07-25T00:07:00.687 回答
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 
于 2013-07-25T00:10:22.420 回答
-1

来自:jcpartri

你好!

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

KeyListener、keyPressed 与 keyTyped

于 2013-07-25T00:20:33.080 回答