2017-01-30 1 views
-2

저는 화씨를 섭씨로, 그리고 그 반대로 변환하기위한 아주 간단한 자바 프로그램을 가지고 있습니다. 그러나 지금은 단지 화씨에서 섭씨로 변환하도록 설정하고 두 가지 방법으로 작동하도록하는 방법을 알아 내려는 데 어려움을 겪고 있습니다.KeyListener를 사용하여 마지막으로 사용 된 textField를 추적합니다.

결국 사용자가 텍스트 필드에 입력 할 수 있고 프로그램이 어떤 텍스트 필드가 마지막으로 변경되었는지에 따라 사용할 수식을 알 수 있기를 바랍니다. 이것에 대해 Java에서 KeyListener 함수를 사용하고 싶습니다. 그러나이 설명서를 읽은 후에는이 작업을 수행하는 방법에 대해 상당히 혼란스러워합니다. 나는 textFields에 그것들을 추가해야한다는 것을 알고 있지만, 그것은 생성자가 나를 던지고있다.

여기 내 코드가 있는데, 누군가 내 메인 클래스에 이것을 통합하는 법을 설명 할 수 있다면 정말 고맙겠습니다!

import java.awt.*; 
import javax.swing.*; 

public class Convert extends JFrame 
{ 
    private JTextField jtfFahr = new JTextField(10); 
    private JTextField jtfCels = new JTextField(10); 
    private JButton jbConvert = new JButton("Convert"); 

    public static void main(String[] args) 
    { 
     new Convert(); 
    } 

    public Convert() 
    { 
     setTitle("Convert"); 
     setSize(400, 125); 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 

     JPanel jpNorth = new JPanel(new GridLayout(0, 2)); 
     jpNorth.add(new JLabel("Fahrenheit", JLabel.RIGHT)); 
     jpNorth.add(jtfFahr); 
     jpNorth.add(new JLabel("Celcius", JLabel.RIGHT)); 
     jpNorth.add(jtfCels); 
     add(jpNorth, BorderLayout.NORTH); 

     JPanel jpSouth = new JPanel(); 
     jpSouth.add(jbConvert); 
     add(jpSouth, BorderLayout.SOUTH); 

     Converter cvt = new Converter(jtfFahr, jtfCels); 
     jbConvert.addActionListener(cvt); 

     setVisible(true); 
    } 
} 

다음은 실제로뿐만 아니라 작업을 구현하는 클래스입니다 : 당신이 때문에 '만약'요소를 제기하는 방법을 모르고 아직 완료되지 볼 수 있듯이

import javax.swing.*; 
import java.awt.event.*; 

public class Converter implements ActionListener 
{ 
    private JTextField jtfDegF; 
    private JTextField jtfDegC; 

    public Converter(JTextField _jtfDegF, JTextField _jtfDegC) 
    { 
     jtfDegF = _jtfDegF; 
     jtfDegC = _jtfDegC; 
    } 

    public void actionPerformed(ActionEvent ae) 
    { 
     if() 
     { 
     double degF = Double.parseDouble(jtfDegF.getText()); 
     double degC = (degF - 32) * 5.0/9.0; 
     jtfDegC.setText(String.format("%.2f", degC)); 
     } 
     else 
     { 
     double degC = Double.parseDouble(jtfDegC.getText()); 
     double degF = (degC * 9.0/5.0) + 32; 
     jtfDegF.setText(String.format("%.2f", degF)); 
     } 
    } 
} 

.

addKeyListener를 구현하는 방법에 대한 간단한 설명은 훌륭합니다!

답변

1

JTextField에 KeyListener를 추가하지 말아주세요. 이것은 매우 저레벨의 청취자이며, 이것들을 사용하면 (자), 텍스트 컴퍼넌트의 통상의 기능이 저하 될 가능성이 있습니다.

보통 우리는 JTextField를의 문서를 듣고 추천 할 것입니다 만, 상황에 훨씬 더 간단한 해결책은 자신을 제시한다

이유는 단순히 모두에 ActionListener를 추가하지. 사용자가 두 필드 중 하나에서 Enter 키를 누르면 자체 ActionListener가 호출되고 수행 할 변환을 결정할 수 있습니다. 예를 들어

, 두 배 또는 숫자가

를 입력 한 반 간단한 예
import javax.swing.*; 

@SuppressWarnings("serial") 
public class TextFieldListener extends JPanel { 
    private JTextField field1 = new JTextField(15); 
    private JTextField field2 = new JTextField(15); 

    public TextFieldListener() { 
     field1.addActionListener(e -> { 
      String text1 = field1.getText(); 
      try { 
       int value1 = Integer.parseInt(text1); 
       String text2 = String.valueOf(2 * value1); 
       field2.setText(text2); 
      } catch (NumberFormatException e1) { 
       String title = "Number Format Error"; 
       String message = "Text must be numeric"; 
       JOptionPane.showMessageDialog(field1, message, title, JOptionPane.ERROR_MESSAGE); 
       field1.setText(""); 
      } 
     }); 
     field2.addActionListener(e -> { 
      String text2 = field2.getText(); 
      try { 
       int value2 = Integer.parseInt(text2); 
       String text1 = String.valueOf(value2/2); 
       field1.setText(text1); 
      } catch (NumberFormatException e1) { 
       String title = "Number Format Error"; 
       String message = "Text must be numeric"; 
       JOptionPane.showMessageDialog(field1, message, title, JOptionPane.ERROR_MESSAGE); 
       field2.setText(""); 
      } 
     }); 

     add(field1); 
     add(field2); 
    } 

    private static void createAndShowGui() { 
     JFrame frame = new JFrame("Field Listener"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new TextFieldListener()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 
} 
+0

나는 모든 KeyListener를 사용하는 경우 정말, 내가 그렇게 쉽게 프로그램을 완료하고 내 방식에있을 수 좋아,하지만 것 학기말 평균 점수에 2 점을 더했습니다.이 점수는 A 나 B의 차이 일 수 있습니다. 그래서 나는 그것을 어렵게하려고 노력하고있다. KeyListener에 대한 Java API를 읽었지 만이 상황에서 구현하는 방법을 모르겠습니다 ... –

+1

@AbbeyS 그리고 텍스트 필드에 텍스트를 붙여 넣으면 코드가 손상됩니다. 어쩌면 당신의 강사에게 당신이 더 나은 방법을했고 2 가지 추가 점수를받을 자격이 있는지, 또는 강사가 프로그래밍을 가르치지 않는 새로운 일을 찾아야한다고 설득 할 수 있습니다. – MadProgrammer

+0

@AbbeyS : 다시 KeyListener를 사용하지 말 것을 권장합니다. 그것을 사용하려면 먼저 왜 그렇게 노력하지 않으십니까? 당신은 잃을 것이 아무것도없는 사람을 위해, 그리고 두 사람은 우리가 잘못하고있는 일에 대해 훨씬 더 잘 생각할 것입니다. 그렇지 않으면이 질문은 "나를 위해이 키 릴스터를 작성하십시오"로 바뀌 었습니다. 나는 당신의 의도가 아니라고 확신합니다. –

관련 문제