Java-свинг-событие нажатия клавиши вызывает исключение classCastException - PullRequest
3 голосов
/ 11 января 2010

Мое приложение обрабатывает записи пациентов.В основном кадре пользователь может открыть несколько внутренних кадров.Каждый внутренний фрейм содержит панель с вкладками, а каждая созданная пользователем вкладка содержит форму, в которую он может вводить данные пациента, и таблицу, в которой отображаются все добавленные пациенты.

Когда пользователь щелкает строку (пациента) вjtable поля формы заполняются данными пациента, и когда он нажимает «Escape», поля формы очищаются, и пользователь может перейти к поиску / проверке / вводу другого пациента.

Моя проблема в том, что это событие escape-ключа, создает исключение classCastException в Веществе, которое я чувствую , которое я использую.Код, который я написал для выполненного действия, работает нормально.Эта проблема появилась, так как я начал использовать панели с вкладками (до того, как все было сделано в одной панели).Если я изменю внешний вид, например, на Windows, исключение не выдается.У вас есть идеи?

Вот пример кода:

private void db_existKeyReleased(java.awt.event.KeyEvent evt) {
    // TODO add your handling code here:

    if(evt.getKeyCode()==KeyEvent.VK_ESCAPE)
    {
        searchField.requestFocusInWindow();         // if user doesn't want to process any of the entries shown to the table
        if(searchField.getText().length()>=1)       // focus goes to search field and data pane fields are cleared form previous shows
        {
            dataPane.setPid(-1);
            dataPane.getPersonalDataPane().clearAll();
            treat_diagPane.getDiagnosis_pane().clearAll();
            treat_diagPane.getTreat_pane().clearAll();
        }

        DefaultTableModel model=new DefaultTableModel(
                new Object [][] {
        },
        new String [] {
            bundle.getString("lname"), bundle.getString("fname"), bundle.getString("date_birth"), bundle.getString("occupation")
        });
        db_exist.setModel(model);
    }

Это исключение:

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: javax.swing.JTabbedPane cannot be cast to javax.swing.JDesktopPane
    at javax.swing.plaf.basic.BasicDesktopPaneUI$Actions.actionPerformed(BasicDesktopPaneUI.java:329)
    at org.jvnet.lafwidget.tabbed.TabPagerWidget$4.actionPerformed(TabPagerWidget.java:158)

, и это код, который вызываетисключение:

public void actionPerformed(ActionEvent e) {
        JDesktopPane dp = (JDesktopPane)e.getSource();
        String key = getName();

        if (CLOSE == key || MAXIMIZE == key || MINIMIZE == key ||
                RESTORE == key) {
            setState(dp, key);
        }
        else if (ESCAPE == key) {
            if (sourceFrame == dp.getSelectedFrame() &&
                    focusOwner != null) {
                focusOwner.requestFocus();
            }
            moving = false;
            resizing = false;
            sourceFrame = null;
            focusOwner = null;
        }

Ответы [ 2 ]

2 голосов
/ 11 января 2010

Вы упоминаете, что вы переключились на использование JTabbedPane, но в коде метода "actionPerformed" вы по-прежнему приводите к "JDesktopPane", и трассировка стека говорит: </p> <pre><code>Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: javax.swing.JTabbedPane cannot be cast to javax.swing.JDesktopPane at javax.swing.plaf.basic.BasicDesktopPaneUI$Actions.actionPerformed

Возможно, изменив его на:

</p> <pre><code>if(e.getSource() instanceof JTabbedPane) { JTabbedPane = (JTabbedPane)e.getSource(); }

может быть тем изменением, которое вам нужно сделать.

0 голосов
/ 27 июля 2011

Use keybindings

    this.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "fecharAction");
    this.getRootPane().getActionMap().put("fecharAction", new AbstractAction() {
        private static final long serialVersionUID = 1L;
        @Override
        public void actionPerformed(ActionEvent e) {
            int resp = JOptionPane.showConfirmDialog(MainForm.this, "Encerrar sistema?", "Confirmação", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
            if (resp == 0) {
                MainForm.this.setVisible(false);
                MainForm.this.dispose();
            }
        }
    });
...