0

そのため、割り当ての最後の詳細を入力しているだけで、getCursor(); に気付きました。プログラムを実行すると機能しますが、プログラムの後半 (2 つの actionListeners 内) で華氏 TB に戻りません。私はいくつかの入力を得ることができるかどうか疑問に思っていました。ありがとうございました。これが私のコードです:

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


public class Part3Question1 extends JPanel
{
private JTextField fahrenheitTB;
private JTextField celsiusResultTB;
private JButton tryAgain;

public Part3Question1()
{
    Color color=new Color(255,0,0);  

    JLabel fahrenheitLabel = new JLabel ("Enter Fahrenheit temperature:");
    add (fahrenheitLabel);

    fahrenheitTB = new JTextField (5);
    fahrenheitTB.setHorizontalAlignment(fahrenheitTB.CENTER);
    //Works here!
    fahrenheitTB.getCursor();
    add (fahrenheitTB);

    JLabel celsiusLabel = new JLabel ("Temperature in Celsius: ");
    add (celsiusLabel);

    celsiusResultTB = new JTextField (5);
    celsiusResultTB.setForeground(color);
    celsiusResultTB.setEditable(false);
    celsiusResultTB.setHorizontalAlignment(celsiusResultTB.CENTER);
    add (celsiusResultTB);

    JButton convertButton = new JButton("Convert!");
    add (convertButton);

    tryAgain = new JButton("Try Again!");
    tryAgain.setVisible(false);
    add (tryAgain);

    convertButton.addActionListener (new myFirstActionListener());
    tryAgain.addActionListener (new mysecondActionListener());
}
private class myFirstActionListener implements ActionListener
{
  public void actionPerformed (ActionEvent event)
  {
          int fahrenheitTemp, celsiusTemp;
          String text = fahrenheitTB.getText();
          try
          {
              fahrenheitTemp = Integer.parseInt (text);
              celsiusTemp = (fahrenheitTemp-32) * 5/9;
              celsiusResultTB.setText (Integer.toString (celsiusTemp));
              tryAgain.setVisible(true);

          }
          catch (NumberFormatException e)
          {
              String myException="Invalid entry. Please enter Integers Only";
              JOptionPane.showMessageDialog(null,myException);
              fahrenheitTB.setText("");
              //doesn't work here!
              fahrenheitTB.getCursor();
          }
      }
}
private class mysecondActionListener implements ActionListener
{
  public void actionPerformed (ActionEvent event)
  {
          fahrenheitTB.setText("");
          //doesn't work here!
          fahrenheitTB.getCursor();
          celsiusResultTB.setText("");
      }
}

public static void main (String[] args)
{
    JFrame myFrame = new JFrame ();
    myFrame.setTitle("Fahrenheit to Celsius Converter");
    myFrame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
    myFrame.setPreferredSize(new Dimension(300,150));
    myFrame.setLocation(400,300);
    Part3Question1 panel = new Part3Question1();
    myFrame.getContentPane().add(panel);
    myFrame.pack();
    myFrame.setVisible(true);
}
}
4

2 に答える 2

4

開始するには、次のチュートリアルを読むことをお勧めします: "フォーカス サブシステムの使用方法"。あなたの状況では、requestFocusInWindow()あなたのコンポーネントを呼び出すことができます

更新されたコードは次のとおりです。

import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class Part3Question1 extends JPanel {
    private JTextField fahrenheitTB;
    private JTextField celsiusResultTB;
    private JButton tryAgain;

    public Part3Question1() {
        Color color = new Color(255, 0, 0);

        JLabel fahrenheitLabel = new JLabel("Enter Fahrenheit temperature:");
        add(fahrenheitLabel);

        fahrenheitTB = new JTextField(5);
        fahrenheitTB.setHorizontalAlignment(fahrenheitTB.CENTER);
        // updated
        fahrenheitTB.requestFocusInWindow();
        add(fahrenheitTB);

        JLabel celsiusLabel = new JLabel("Temperature in Celsius: ");
        add(celsiusLabel);

        celsiusResultTB = new JTextField(5);
        celsiusResultTB.setForeground(color);
        celsiusResultTB.setEditable(false);
        celsiusResultTB.setHorizontalAlignment(celsiusResultTB.CENTER);
        add(celsiusResultTB);

        JButton convertButton = new JButton("Convert!");
        add(convertButton);

        tryAgain = new JButton("Try Again!");
        tryAgain.setVisible(false);
        add(tryAgain);

        convertButton.addActionListener(new myFirstActionListener());
        tryAgain.addActionListener(new mysecondActionListener());
    }

    private class myFirstActionListener implements ActionListener {
        public void actionPerformed(ActionEvent event) {
            int fahrenheitTemp, celsiusTemp;
            String text = fahrenheitTB.getText();
            try {
                fahrenheitTemp = Integer.parseInt(text);
                celsiusTemp = (fahrenheitTemp - 32) * 5 / 9;
                celsiusResultTB.setText(Integer.toString(celsiusTemp));
                tryAgain.setVisible(true);

            } catch (NumberFormatException e) {
                String myException = "Invalid entry. Please enter Integers Only";
                JOptionPane.showMessageDialog(null, myException);
                fahrenheitTB.setText("");
            }finally{
                // updated
                fahrenheitTB.requestFocusInWindow();
                    }
        }
    }

    private class mysecondActionListener implements ActionListener {
        public void actionPerformed(ActionEvent event) {
            fahrenheitTB.setText("");
            // updated
            fahrenheitTB.requestFocusInWindow();
            celsiusResultTB.setText("");
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                JFrame myFrame = new JFrame();
                myFrame.setTitle("Fahrenheit to Celsius Converter");
                myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                myFrame.setPreferredSize(new Dimension(300, 150));
                myFrame.setLocation(400, 300);
                Part3Question1 panel = new Part3Question1();
                myFrame.getContentPane().add(panel);
                myFrame.pack();
                myFrame.setVisible(true);

            }
        });
    }
}
于 2012-10-31T05:50:17.750 に答える
2

問題はあなたmyFirstActionListenerにあります、フォーカスの要求は決して呼び出され始めません。

例外ブロックは、例外がある場合にのみ実行され、それ以外の場合は無視されます。

それ以外の...

} catch (NumberFormatException e) {
    String myException = "Invalid entry. Please enter Integers Only";
    JOptionPane.showMessageDialog(null, myException);
    fahrenheitTB.setText("");
    //doesn't work here!
    fahrenheitTB.requestFocusInWindow();
}

あなたが使用する必要があります

} catch (NumberFormatException e) {
    String myException = "Invalid entry. Please enter Integers Only";
    JOptionPane.showMessageDialog(null, myException);
    fahrenheitTB.setText("");
    //doesn't work here!
} finally {
    fahrenheitTB.requestFocusInWindow();
}

私のテストでは、「再試行」は期待どおりに機能しました

selectAll個人的なメモとして、フォーカスをリクエストした後に電話をかけることもできますfahrenheitTB.selectAll。これは個人的なことですが、ユーザーがフィールドを手動でクリアして次の値を入力する必要はありません...;)

于 2012-10-31T05:56:12.580 に答える