ClassCastException: javax.swing.JButton - PullRequest
       10

ClassCastException: javax.swing.JButton

2 голосов
/ 06 января 2012

Все, что я хочу, - это ввести простой пароль пользователя.

Я положил туда 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)

Ответы [ 5 ]

3 голосов
/ 06 января 2012

Следующее исключение происходит, когда вы игнорируете тот факт, что в вашем коде есть ошибки компиляции, и все равно пытаетесь его запустить.(Я предполагаю, что вы используете Eclipse. Найдите красные маркеры ошибок в соответствующем исходном файле и проверьте представление «Проблемы».)

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

Странно, что встроенное сообщение об ошибке компиляции не отображаетсясоответствовать исходному коду, который вы опубликовали.Либо вы изменили код, либо из-за некоторого недостатка процесса сборки вы запустили устаревшие файлы классов.


Несколько других моментов:

  • Вы нарушаете соглашения об именах Java в своем вложенном классе.Имена классов должны всегда начинаться с заглавной буквы.Измените "loginButton" на "LoginButton".

  • Ваш класс PasswordForm слишком много использует static.Внутренний класс static в порядке, но объявление password как статического и помещение всей вашей логики в статический метод main приведет к проблемам в долгосрочной перспективе.(ОК, этот код явно экспериментальный ... в его нынешнем виде.)

2 голосов
/ 06 января 2012

Я надеюсь, что это поможет вам.

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);
        }
    }
}
1 голос
/ 06 января 2012

Мне просто нужно простое диалоговое окно, когда я нажимаю эту кнопку, показывая пароль, в C # будет легко, но не Java ..

Это, вероятно, так же просто в Java, как и в 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
  }
}
1 голос
/ 06 января 2012

Это дополнение к ответу @ 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

Исключение, которое я получил, было буквально копированием вашего кода в Eclipse, плюс добавление необходимых импортов. Итак, как @Stephen указывал ранее, у вас должны быть какие-то проблемы в процессе сборки или, если вы ничего не изменили, то, возможно, настройки вашего проекта неверны?


Редактировать

Хорошо, я могу заставить код делать то, что вы хотите. Просто код кажется не очень приятным, и уже есть чрезмерная зависимость от статических классов / методов, на что указал Стивен. Надеюсь, это всего лишь экспериментальный код, который вы используете для изучения Java ...

Если вы сделаете 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()));

Но на самом деле это не очень хороший способ построения вашего класса. В этом есть все недостатки, на которые указал Стивен, и, вероятно, больше, потому что я сам не очень хороший кодер. Просто должен делать то, что вы хотите, если вы хотите действительно быстро что-то взломать.

1 голос
/ 06 января 2012

Не уверен, но:

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

Как может быть источником события TextField? Это будет JButton, из которого произошло событие. Вам нужно изменить это, и ваша ошибка исчезнет или станет яснее.

Кроме того, что сказал Стивен С: предоставленная вами ошибка не соответствует вашему коду.

PS: Что касается вашего вопроса, как ленивый Java-разработчик, я бы просто объявил свое поле userid и поле пароля на уровне класса, а затем получил доступ к этим полям непосредственно из события. Это не идеальный способ, но приемлемый для новичка в Java.

...