2012-01-06 2 views
2

내가 원한 모두 간단한 사용자 암호 로그인을 만드는 것입니다.ClassCastException : javax.swing.JButton

나는 거기에 ActionListener을 넣었고 로그인을 누르면 암호가 팝업되고 제대로 작동하는지 확인합니다.

import java.awt.BorderLayout; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.GridLayout; 
import java.awt.Insets; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.JPasswordField; 
import javax.swing.JTextField; 

public class PasswordForm 
{ 
    private static String password = "mypass"; 
    public static void main(String[] args) 
    { 
     // Basic form create 
     JFrame frame = new JFrame("Form 1"); 
     frame.setSize(300,300); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     // Creating the grid 
     JPanel panel = new JPanel(new GridBagLayout()); 
     frame.getContentPane().add(panel, BorderLayout.NORTH); 
     GridBagConstraints c = new GridBagConstraints(); 

     // Create some elements 
     JTextField usernameInput = new JTextField(10); 
     c.gridx = 0; 
     c.gridy = 1; 
     panel.add(usernameInput,c); 

     JPasswordField passwordInput = new JPasswordField(10); 
     c.gridx = 0; 
     c.gridy = 2; 
     panel.add(passwordInput,c); 

     JButton loginInput = new JButton("Login"); 
     c.gridx = 0; 
     c.gridy = 3; 
     loginInput.addActionListener(new LoginButton()); 
     panel.add(loginInput,c); 


     frame.setVisible(true); 
    } 

    static class LoginButton implements ActionListener 
    { 
     public void actionPerformed(ActionEvent e) 
     { 
      JTextField usernameInput = (JTextField)e.getSource(); 
      JOptionPane.showMessageDialog(null,"Text is:"); 
     } 
    } 
} 

누구에게 도움을 줍니까?

오류

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: javax.swing.JButton 
at PasswordForm$LoginButton.actionPerformed(PasswordForm.java:56) 
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) 
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) 
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) 
at javax.swing.DefaultButtonModel.setPressed(Unknown Source) 
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) 
at java.awt.Component.processMouseEvent(Unknown Source) 
at javax.swing.JComponent.processMouseEvent(Unknown Source) 
at java.awt.Component.processEvent(Unknown Source) 
at java.awt.Container.processEvent(Unknown Source) 
at java.awt.Component.dispatchEventImpl(Unknown Source) 
at java.awt.Container.dispatchEventImpl(Unknown Source) 
at java.awt.Component.dispatchEvent(Unknown Source) 
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) 
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) 
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) 
at java.awt.Container.dispatchEventImpl(Unknown Source) 
at java.awt.Window.dispatchEventImpl(Unknown Source) 
at java.awt.Component.dispatchEvent(Unknown Source) 
at java.awt.EventQueue.dispatchEvent(Unknown Source) 
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.run(Unknown Source) 
+3

질문은 무엇인가? –

+2

그리고 네 질문은 뭐니? – mre

+0

어떻게 작동합니까? 그것은 이상한 오류를 준다 ... – Master345

답변

2

.

public class PasswordForm { 

    private static String password = "mypass"; 
    private JTextField usernameInput; 

    public PasswordForm() { 
    } 

    private void init(){ 
     // Basic form create 
     JFrame frame = new JFrame("Form 1"); 
     frame.setSize(300,300); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     // Creating the grid 
     JPanel panel = new JPanel(new GridBagLayout()); 
     frame.getContentPane().add(panel, BorderLayout.NORTH); 
     GridBagConstraints c = new GridBagConstraints(); 

     // Create some elements 
     usernameInput = new JTextField(10); 
     c.gridx = 0; 
     c.gridy = 1; 
     panel.add(usernameInput,c); 

     JPasswordField passwordInput = new JPasswordField(10); 
     c.gridx = 0; 
     c.gridy = 2; 
     panel.add(passwordInput,c); 

     JButton loginInput = new JButton("Login"); 
     c.gridx = 0; 
     c.gridy = 3; 
     loginInput.addActionListener(new LoginButton()); 
     panel.add(loginInput,c); 


     frame.setVisible(true); 
    } 
    public static void main(String[] args){ 
     PasswordForm form = new PasswordForm(); 
     form.init(); 
    } 

    class LoginButton implements ActionListener{ 

     public void actionPerformed(ActionEvent e){ 
      //JTextField usernameInput = (JTextField)e.getSource(); 
      String username = (usernameInput.getText().length()>0?usernameInput.getText():" U have not entered!"); 
      JOptionPane.showMessageDialog(null,"Text is : "+username); 
     } 
    } 
} 
+0

와우,이 작품, 그래서, ** 클래스 LoginButton 밖에서 값을 얻으려면 ActionListener을 구현 (** ..... 그냥 "** (** "및"**) ** "예를 들어 내가 원한다면 ** passwordInput ** ** ** ** ** (**"및 ** "**) ** "는 왼쪽과 오른쪽에서 클래스 ** LoginButton ** 밖의 값을 얻을 수 있도록 도와 줍니까? 당신이 나를 이해했다면 희망 – Master345

+0

클래스'LoginButton'은'PasswordForm' 클래스의 내부 클래스이고, 클래스의 필드에 접근 할 수 있기 때문에 작동하지 않습니다. 'passwordInput'에 접근하고 싶다면, 그 필드를 만들어야합니다. – Robin

+0

그리고 여러분의 코드가 약간 수정 된 것을 볼 수 있습니다. 예를 들어 ** Test **를 두 번 더 해보았습니다. 성공했습니다. 실시간 오류가 발생했습니다. 코드는 다음과 같습니다. http://www.text-upload.com/read.php?id=252035&c=3544300 ... btw, 귀찮게해서 미안하지만, 저와 자바 사이에 알맞은 의사 소통을 얻지 못해 어려워 질 것입니다. – Master345

1

확실하지,하지만 :

  1. JButton loginInput = new JButton("Login");
  2. JTextField usernameInput = (JTextField)e.getSource();

어떻게 이벤트의 소스가 TextField 될 수 있을까? 이벤트가 발생한 출생지는 JButton입니다. 이것을 재 설계해야하며 오류가 사라지거나 더 명확 해집니다.

또한 Stephen C가 말한 바 : 제공하신 오류가 귀하의 코드와 일치하지 않습니다.

추신 : 귀하의 질문에 관해서는, 게으른 Java 개발자로서 나는 class-level에서 내 userid 필드와 암호 필드를 선언 한 다음 해당 필드에서 직접 이벤트에 액세스합니다. 그것은 완벽한 방법은 아니지만 Java의 초보자에게 받아 들여질 수 있습니다.

+0

나는 그것을 얻는다. 그러나 나는이 문제를 어떻게 해결 하느냐? 나는 LoginButton을 눌러 비밀번호가있는 대화 상자를 팝업 할 때를 의미합니다. 난 정말 내가 = "mypass"개인 정적 문자열 암호 같은 경고 만이 – Master345

3

코드에 컴파일 오류가 있다는 사실을 무시하고 어쨌든 실행하려고하면 다음 예외가 발생합니다. (I는 관련 소스 파일에 빨간색 오류 마커를 찾아보십시오. 당신은 이클립스를 사용한다고 가정하고, 문제점보기를 확인합니다.)

Exception in thread "AWT-EventQueue-0" java.lang.Error: 
     Unresolved compilation problem: 
     The method getText() is undefined for the type ActionEvent 

이상한 것은 임베디드 컴파일 오류 메시지가 일치하지 않는 것이다 게시 한 소스 코드 코드를 변경했거나 빌드 프로세스의 일부 결함으로 인해 부실 클래스 파일이 실행 중입니다.


다른 점 몇 :

  • 당신은 당신의 중첩 된 클래스에서 자바의 명명 규칙을 위반하고 있습니다. 클래스 이름은 이어야하며 항상은 대문자로 시작해야합니다. "loginButton"을 "LoginButton"으로 변경하십시오.

  • PasswordForm 클래스가 static을 너무 많이 사용하고 있습니다. static 내부 클래스는 정상이지만 password을 정적으로 선언하고 모든 논리를 정적 main 메서드에 넣으면 장기적으로 문제가 발생할 수 있습니다. (OK,이 코드는 현재의 형태로 ... 분명히 실험입니다.)

+0

... 그것은 나를 악, 비록 자바를 배울 필요가; 사용되지 않습니다 ... 그리고 나는 그 오류, 같은 오류를 얻을, 내 말은 .. – Master345

+0

흥미 롭 ...하지만, 어떻게이 문제를 해결합니까? 나는 LoginButton을 눌러 비밀번호가있는 대화 상자를 팝업 할 때를 의미합니다. 나는 정말 나에게 악, 비록 자바를 배울 필요가 ... – Master345

+0

@RowMinds - * "... 그것은 나와 함께 악 비록"*. 그런 태도는 배우는 데 도움이되지 않습니다. * "C#에서는 쉽지만 java가 아닌 것은"*. C#을 사용하거나 whinging을 중지하십시오. –

1

난 그냥 정말 빠르게 코드를 실행하기 때문에 이것은 @ tomdemuyt의 대답에 대한 추가 사항입니다.나는 당신이 무엇을 완전히 다른 오류가 발생했습니다 :

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: javax.swing.JButton cannot be cast to javax.swing.JTextField 
    at StupidCode$loginButton.actionPerformed(PasswordForm.java:54) 
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) 
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) 
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) 
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source) 
    ...more stack trace information that I'm not sure will help at this stage 

이클립스에 코드의이었다 단지 그대로 복사 - 붙여 넣기를받은 플러스 필요한 수입에 추가 한 예외입니다. 따라서 @Stephen은 이전에 지적했듯이 빌드 프로세스에 문제가 있거나 어떤 것도 변경하지 않았다면 프로젝트 설정이 잘못되었을 수 있습니까?


편집 :

좋아, 그럼 난 코드를 만들 수 있습니다 당신이 원하는 것을 할. 코드가 매우 멋지게 나오지 않는 것 같으며, 이미 Stephen이 지적한 정적 클래스/메소드에 지나치게 의존하고 있습니다. 당신이 JPasswordField, 개인 및 정적 즉 한 경우 희망, 이것은 당신이 자바를 배울 때 사용하는 단지 실험적인 코드 ...

이다. 주요 방법의

private static JPasswordField passwordInput; 
//main method below 
//... 
//main method finished, action listener follows... 

외부, 다음은 ActionListener, loginButton은 "참조"할 수 있습니다. 이런 식으로, 당신이 정말 당신의 클래스를 구성하는 아주 좋은 방법이 아니다

JOptionPane.showMessageDialog(null,"Text is: "+ new String(passwordInput.getPassword())); 

그러나처럼 뭔가를 할 수 있습니다. 그것은 스티븐이 지적한 모든 결점을 가지고 있으며, 아마 내가 직접 훌륭한 코더가 아니기 때문에 더 많은 것을 알 수 있습니다. 당신이 정말 빨리 뭔가를 해킹하고자하는 경우 그것은 단지 당신이 원하는해야한다. 내가 버튼을 쉽게,하지만 자바 것, 암호를 보여주는 C#으로 있음을 누를 때

+0

좋아요, 내 게시물을 재 편집했습니다. mayby ​​당신 말이 맞지만 이클립스에서 코드를 복사/붙여 넣기하지 않았습니다.이 작업을하려고합니다. http://www.youtube.com/watch?v=1G8H8uAAsLo&feature = 나를 믿는 channel_video_title은 "복사/붙여 넣기"조차도 작동하지 않습니다. 그냥 암호를 보여주는 버튼을 누르면 간단한 대화 상자가 필요할 것입니다. C#에서는 쉽지만 java가 아닌 것입니다 ... – Master345

+0

ok,하지만 JOptionPane.showMessageDialog (null, "Text is :"+ new String (passwordInput.getPassword())); 정적 클래스 LoginButton의 ActionListener 구현 정적 계급의 내부에서 ..... – Master345

+0

미안하지만, 네가 무엇을 요구하는지 잘 모르겠다. JPasswordField를 외부 메소드로 사용하면이 메소드를 호출 할 수 있습니다. 말하자면, 나는 당신이 질문에 코드를 작성하는 방식이 매우 안전한 코딩 방법이라고 생각하지 않습니다. 기사를 읽으려는 로빈의 제안이 도움이 될 것입니다. 이 메서드를 호출 할 때 오류가 발생 했습니까? – blahman

1

난 그냥

이 아마에서와 같이 자바로 쉽게 ... 간단한 대화 상자를 원하는 C#을 사용하지만 하나의 언어에 익숙합니다. 나는 C#으로 이것을 수행하는 방법을 알지 못한다. 어쨌든, 나는 약간 작동 얻을 수 있도록 코드를 수정 (나는 짧은 내 대답을 유지하기 위해 수정에 대한 비 관련 부분을 제거) 내가이 당신을 도움이되기를 바랍니다

public class PasswordForm { 
private static String password = "mypass"; 
public static void main(String[] args){ 
    //Swing operations should happen on the EDT 
    EventQueue.invokeAndWait(new Runnable(){ 
     public void run(){ 
      //whole UI creation 
      final JTextField usernameInput = new JTextField(10); 
      final JPasswordField passwordInput = new JPasswordField(10); 
      //more UI creation 
      JButton loginInput = new JButton("Login"); 
      loginInput.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent e){ 
       JOptionPane.showMessageDialog(null,"Username is:" + usernameInput.getText() + " Password is:" + passwordInput.getText()); 
      } 
      }); 
     } 
     } //todo catch the exceptions from the invokeAndWait call 
    } 
} 
+0

오케이, 당신이 만든 것은 "익명의 내부 클래스"라고 불리는가? 이것이 올바른 방법인가요? 내 말은, 모든 함수가 다른 함수 아래 있고, 다른 file.class에있는 것이 좋을 것입니다. 더 우아하고 순서가 있다고 믿습니다. 그러나 감사합니다 :) – Master345

+0

'ActionListener'를 별도의 클래스에 넣고 싶다면, 해당 텍스트 필드를 전달해야합니다. – Robin

+0

그게 내게 문제가있어, 알다시피 ... :)) ** "클래스 LoginButton 외부 값을 가져 오려면 그 마지막 게시물에서 이해했다 ActionListener {....."** 그냥 put ** "("** and ** ")"** 예를 들어 passwordInput을 원한다면 ** ** password password = (passwordInput.getText()); ** ** "("** 및 ** ")"** 왼쪽 및 오른쪽에서 ** LoginButton 클래스 외부 값을 가져 오는 데 도움이됩니까? 당신이 나를 이해했기를 바랍니다 – Master345