2012-02-13 4 views
4

내가 잘못 가고있는 것을 알 수 없다. 몇 가지를 변경하려고했지만 "CalculateButtonHandler"를 제대로 사용할 수 없다. 마지막으로 나는 충분히 특정하지 않았다 :.. S 누군가가 큰 감사 것 올바른 방향으로 날 지점 수 있다면GUI 문제 읽는 JTextField

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

// some kind of problem with Calculate button handler (LINE 78 

public class Program5 extends JFrame 
{ 
    // Setting up for the program 
    private JLabel side1, side2, side3, str, result; 

    private JButton calculate, endProgram; 

    private JTextField input1, input2, input3; 

    private CalculateButtonHandler calcHandler; 
    private EndProgramButtonHandler endHandler; 

    private Container pane; 

    private static final int WIDTH = 500; 
    private static final int HEIGHT = 350; 

    // constructor 
    public Program5() 
    { 
     // create labels 
     side1 = new JLabel ("Triangle's Longest Side: ", SwingConstants.CENTER); 
     side2 = new JLabel ("Triangle's Next Side: ", SwingConstants.CENTER); 
     side3 = new JLabel ("Triangle's Last Side: ", SwingConstants.CENTER); 
     result = new JLabel ("", SwingConstants.CENTER); 
     str = new JLabel ("Is the Triangle a right Triangle?",SwingConstants.CENTER); 

     // create text fields 
     input1 = new JTextField ("", 60); 
     input1.setHorizontalAlignment(JTextField.CENTER); 
     input2 = new JTextField ("", 60); 
     input2.setHorizontalAlignment(JTextField.CENTER); 
     input3 = new JTextField ("", 60); 
     input3.setHorizontalAlignment(JTextField.CENTER); 

     // create buttons 
     calculate = new JButton ("Calculate"); 
     calcHandler = new CalculateButtonHandler(); 
     calculate.addActionListener(calcHandler); 

     endProgram = new JButton ("Exit"); 
     endHandler = new EndProgramButtonHandler(); 
     endProgram.addActionListener(endHandler); 

     // Set title of Window 
     setTitle ("Right Triangle Tester"); 

     //Get Container 
     pane = getContentPane(); 

     // set Layout 
     pane.setLayout (new GridLayout (5, 2)); 

     // place the components in the pane 
     pane.add(side1); 
     pane.add(input1); 
     pane.add(side2); 
     pane.add(input2); 
     pane.add(side3); 
     pane.add(input3); 
     pane.add(str); 
     pane.add(result); 
     pane.add(calculate); 
     pane.add(endProgram); 

     // set size of the window and display it 
     setSize (WIDTH, HEIGHT); 
     setVisible (true); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
    } 

    private class CalculateButtonHandler implements ActionListener 
    { 
     public void actionPerformed (ActionEvent e) 
     { 
      double num1, num2, num3; 
      num1 = Double.parseDouble(side1.getText()); 
      num2 = Double.parseDouble(side2.getText()); 
      num3 = Double.parseDouble(side3.getText()); 

      if ((num1*num1) == ((num2*num2)+(num3*num3))) 
      { 
       result.setText("YES"); 
      } 
      else 
      { 
      result.setText("NO"); 
      } 
     }  
    } 

    private class EndProgramButtonHandler implements ActionListener 
    { 
     public void actionPerformed (ActionEvent e) 
     { 
      System.exit(0); 
     } 
    } 

    public static void main(String[] args) 
    {  
     Program5 myObject = new Program5(); 
    } 
} 
+0

"제대로 일을"정의 "제대로 작동"하시기 바랍니다. 당신은 무엇을하기를 기대하며, 그 대신에 무엇을합니까? –

답변

2

JTextField가 아닌 JLabel 인 sideX 텍스트를 구문 분석하고 있습니다. 당신의 CalculateButtonHandler에 inputX로 SIDEX를 교체하고 모두가 잘 될 것입니다

당신이 입력을 얻을 수 JLabel를 사용하여 CalculateButtonHandler 클래스에서
+0

+1, 너무 늦게 내 페이지를 새로 고쳤습니다. 멋지다. 나는 전체 결과물을주는 데 시간을 보낸다. –

+0

나는 바보 같다고 생각하니. 몇 시간 동안 내 코드를보고 후 어리석은 실수, 고마워 –

2

1)를 사용 JFormattedTextField (위트 Number instance)보다는 JTextField 일반, 당신은 모를 수가 파싱 ​​문제를 해결할 Number 인스턴스에서 String,

2)는 JTextFields 대신 JLabels에서이 코드 구문 분석 텍스트처럼 보입니다.

+0

+1 좋은 캐치를 원한다면 전체 응답을 제출하는 데 너무 늦었습니다. –

2

, 당신이에 대한 입력을 얻을 JTextField를 필요한 것처럼,이에 그 클래스 변경 보인다

private class CalculateButtonHandler implements ActionListener 
{ 
    public void actionPerformed (ActionEvent e) 
    { 
     double num1, num2, num3; 
     num1 = Double.parseDouble(input1.getText()); 
     num2 = Double.parseDouble(input2.getText()); 
     num3 = Double.parseDouble(input3.getText()); 

     if ((num1*num1) == ((num2*num2)+(num3*num3))) 
     { 
      result.setText("YES"); 
     } 
     else 
     { 
      result.setText("NO"); 
     } 
    }  
} 

그리고 당신의 주요 방법은 다음과 같이해야한다 귀하의 경우처럼 스윙을 사용하는 동안 다음에서 항상 이벤트 디스패처 스레드에 대한 작업을 예약 :

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

// some kind of problem with Calculate button handler (LINE 78 

public class Program5 extends JFrame 
{ 
    // Setting up for the program 
    private JLabel side1, side2, side3, str, result; 

    private JButton calculate, endProgram; 

    private JTextField input1, input2, input3; 

    private CalculateButtonHandler calcHandler; 
    private EndProgramButtonHandler endHandler; 

    private Container pane; 

    private static final int WIDTH = 500; 
    private static final int HEIGHT = 350; 

    // constructor 
    public Program5() 
    { 
      // create labels 
     side1 = new JLabel ("Triangle's Longest Side: ", SwingConstants.CENTER); 
     side2 = new JLabel ("Triangle's Next Side: ", SwingConstants.CENTER); 
     side3 = new JLabel ("Triangle's Last Side: ", SwingConstants.CENTER); 
     result = new JLabel ("", SwingConstants.CENTER); 
     str = new JLabel ("Is the Triangle a right Triangle?",SwingConstants.CENTER); 


      // create text fields 
     input1 = new JTextField ("",60); 
     input1.setHorizontalAlignment(JTextField.CENTER); 
     input2 = new JTextField ("",60); 
     input2.setHorizontalAlignment(JTextField.CENTER); 
     input3 = new JTextField ("",60); 
     input3.setHorizontalAlignment(JTextField.CENTER); 

     // create buttons 
     calculate = new JButton ("Calculate"); 
     calcHandler = new CalculateButtonHandler(); 
     calculate.addActionListener(calcHandler); 

     endProgram = new JButton ("Exit"); 
     endHandler = new EndProgramButtonHandler(); 
     endProgram.addActionListener(endHandler); 

     // Set title of Window 
     setTitle ("Right Triangle Tester"); 

     //Get Container 
     pane = getContentPane(); 

     // set Layout 
     pane.setLayout (new GridLayout (5,2)); 

     // place the components in the pane 
     pane.add(side1); 
     pane.add(input1); 
     pane.add(side2); 
     pane.add(input2); 
     pane.add(side3); 
     pane.add(input3); 
     pane.add(str); 
     pane.add(result); 
     pane.add(calculate); 
     pane.add(endProgram); 

     // set size of the window and display it 
     setSize (WIDTH, HEIGHT); 
     se1tVisible (true); 
     setDefaultCloseOperation (EXIT_ON_CLOSE);  
    } 

    private class CalculateButtonHandler implements ActionListener 
    { 
     public void actionPerformed (ActionEvent e) 
     { 
      double num1, num2, num3; 
      num1 = Double.parseDouble(input1.getText()); 
      num2 = Double.parseDouble(input2.getText()); 
      num3 = Double.parseDouble(input3.getText()); 

      if ((num1*num1) == ((num2*num2)+(num3*num3))) 
      { 
       result.setText("YES"); 
      } 
      else 
      { 
       result.setText("NO"); 
      } 
     }  
    } 

    private class EndProgramButtonHandler implements ActionListener 
    { 
     public void actionPerformed (ActionEvent e) 
     { 
      System.exit(0); 
     } 
    } 

    public static void main(String[] args) 
    { 
     // Here this is used to attain Concurrency in Swing. 
     // So that if there is a need to update the GUI, 
     // that can be done without any difficulty or freezing the GUI. 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       Program5 myObject = new Program5(); 
      } 
     }); 
    } 
} 

내가 AB를 이야기하고있는 일에 대해 자세한 내용을 알고 out Concurrency in Swing을 읽으십시오. 스윙에 대한 매우 중요한 점은이 장에 있습니다.

+0

원래 JTextField로 계산을 했는데도 여전히 읽지 않았습니다. 나는 "SwingUtilities.invokeLater (새로운 Runnables())가 무엇인지 이해하지 못한다. (나는 그 사실을 약간 나중에 살펴볼 것이다.) 그러나 내가 Eclipse에서 얻는 에러는 AWT-EventQue-0에 대해 뭔가를 말하고 나서 간다. floatingDecimals에 대해 이야기하고 싶습니다. (아직도 이클립스에서 디버깅하는 방법을 알아 냈습니다.) num1 num2 num3을 올바르게 설정 했습니까? –

+0

@ChewOnThis_Trident : 2 분 만요, 코드를 필요한 변경 사항과 함께 게시 할 수 있습니다. 너는. –

1

또한 복식을 직접 비교하고 있습니다. 이 비교가 사실 일 가능성은 거의 없습니다. 이 실행

 
    double num1,num2,num3; 
    num1=2.8284271247461903; //== Math.sqrt(8) 
    num2=2.0; num3=2.0; 
    if ((num1*num1) == ((num2*num2)+(num3*num3))) 
     System.out.println ("yes"); 
    else System.out.println ("no " + num1*num1 + " " + (num2*num2 + num3*num3));

}

+0

+1, 의심 할 여지없이 생각을위한 음식, 나는 이것을 오랫동안 뒤로 upvoted했다. –