我的应用程序处理患者记录。在主框架中,用户可以打开多个内部框架。每个内部框架都包含一个选项卡式窗格,并且用户创建的每个选项卡都包含一个表单,用户可以在其中输入患者的数据,以及一个jtable,其中显示了所有已添加的患者。

当用户单击jtable中的一行(患者)时,该表单的字段将填充有患者的数据,而当他按下“转义”时,该表单的字段将被清除,用户可以继续搜索/检查/输入另一位患者。

我的问题是此转义键事件在我使用的Substance look and feel中引发了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;
        }

最佳答案

您提到您已切换为使用JTabbedPane,但是在您的“actionPerformed”方法代码中,您仍然转换为“JDesktopPane”,并且堆栈跟踪显示:

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
可能将其更改为:
if(e.getSource() instanceof JTabbedPane) {
    JTabbedPane = (JTabbedPane)e.getSource();
}

可能是您需要做的更改。

08-25 02:32