java - 如何解决 ClassCastException?也许是 JFileChooser 的类型转换错误

标签 java casting classcastexception jfilechooser

目的

我正在定制一个供个人使用的应用程序。这个应用程序可以用Java制作许多midi文件。 我想从列表中一次性选择多个文件并将其保存为 zip 文件。

问题

出现如下错误消息。 如何解决 ClassCastException?也许这是 JFileChooser 的 Cast 的错误。

(错误消息)

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: camidion.chordhelper.midieditor.PlaylistTableModel$1 cannot be cast to javax.swing.JFileChooser
at camidion.chordhelper.midieditor.PlaylistTableModel$SelectedSequenceAction.setEnebledBySelection(PlaylistTableModel.java:188)
at camidion.chordhelper.midieditor.PlaylistTableModel$SelectedSequenceAction.init(PlaylistTableModel.java:195)
at camidion.chordhelper.midieditor.PlaylistTableModel$SelectedSequenceAction.<init>(PlaylistTableModel.java:177)

at camidion.chordhelper.midieditor.MidiSequenceEditorDialog$SequenceListTable$1.<init>(MidiSequenceEditorDialog.java:442)
at camidion.chordhelper.midieditor.MidiSequenceEditorDialog$SequenceListTable.<init>(MidiSequenceEditorDialog.java:444)
at camidion.chordhelper.midieditor.MidiSequenceEditorDialog.<init>(MidiSequenceEditorDialog.java:1182)

at camidion.chordhelper.ChordHelperApplet.init(ChordHelperApplet.java:477)

at camidion.chordhelper.MidiChordHelper$AppletFrame.<init>(MidiChordHelper.java:72)
at camidion.chordhelper.MidiChordHelper$1.run(MidiChordHelper.java:48)

at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)

at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)

at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)

at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)

at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

源代码

(我的想法)

PlayListTableModel.class

    public ListSelectionModel sequenceListSelectionModel = new DefaultListSelectionModel() {
    {
        setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
    }
};

-

从“protected void setEnebledBySelection() {....”开始,错误信息就在这里。

public abstract class SelectedSequenceAction extends AbstractAction implements ListSelectionListener {
    public SelectedSequenceAction(String name, Icon icon, String tooltip) {
        super(name,icon); init(tooltip);
    }
    public SelectedSequenceAction(String name, String tooltip) {
        super(name); init(tooltip);
    }
    @Override
    public void valueChanged(ListSelectionEvent e) {
        if( e.getValueIsAdjusting() ) return;
        setEnebledBySelection();
    }
    protected void setEnebledBySelection() {
        JFileChooser filechooser = new JFileChooser();
        filechooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
        filechooser.setMultiSelectionEnabled(true);
        File[] index = ((JFileChooser) sequenceListSelectionModel).getSelectedFiles();
        setEnabled(index != null);
    }
    private void init(String tooltip) {
        putValue(Action.SHORT_DESCRIPTION, tooltip);
        sequenceListSelectionModel.addListSelectionListener(this);
        setEnebledBySelection();
    }
}

-

MidiSequenceEditerDialog

            /**
         * This is about Action for files
         */
        public Action saveMidiFileAction = getModel().new SelectedSequenceAction(
            "Save",
            "Save selected MIDI sequence to file"
        ) {
            @Override
            public void actionPerformed(ActionEvent event) {
                PlaylistTableModel playlistModel = getModel();
                SequenceTrackListTableModel sequenceModel = playlistModel.getSelectedSequenceModel();
                String fn = sequenceModel.getFilename();
                if( fn != null && ! fn.isEmpty() ) setSelectedFile(new File(fn));
                if( showSaveDialog((Component)event.getSource()) != JFileChooser.APPROVE_OPTION ) return;
                File[] f = getSelectedFiles();


                try {
                    ZipOutputStream out = new ZipOutputStream(new FileOutputStream("/Users/DANIEL/Downloads"));
                    byte[] buffer = new byte[1024];
                    int len;
                    }
                    for(File files : f) {
                        InputStream in = new FileInputStream(files);
                        out.putNextEntry(new ZipEntry(files.getName()));
                        while ((len = in.read(buffer)) > 0) {
                            out.write(buffer, 0, len);
                        }
                        in.close();
                    }
                    out.close();

                } catch(FileNotFoundException e){
                    e.printStackTrace();
                    showError(e.getMessage());
                } catch(Exception e){
                    e.printStackTrace();
                    showError(e.getMessage());
                }
            }
        };
<小时/>

(原线)

PlayListTableModel.class(原版)

public ListSelectionModel sequenceListSelectionModel = new DefaultListSelectionModel() {
    {
        setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
    }
};

-

public abstract class SelectedSequenceAction extends AbstractAction implements ListSelectionListener {
    public SelectedSequenceAction(String name, Icon icon, String tooltip) {
        super(name,icon); init(tooltip);
    }
    public SelectedSequenceAction(String name, String tooltip) {
        super(name); init(tooltip);
    }
    @Override
    public void valueChanged(ListSelectionEvent e) {
        if( e.getValueIsAdjusting() ) return;
        setEnebledBySelection();
    }
    protected void setEnebledBySelection() {
        int index = sequenceListSelectionModel.getMinSelectionIndex();
        setEnabled(index >= 0);
    }
    private void init(String tooltip) {
        putValue(Action.SHORT_DESCRIPTION, tooltip);
        sequenceListSelectionModel.addListSelectionListener(this);
        setEnebledBySelection();
    }
}

-

MidiSequenceEditerDialog(原始)

        public Action saveMidiFileAction = getModel().new SelectedSequenceAction(
            "Save",
            "Save selected MIDI sequence to file"
        ) {
            @Override
            public void actionPerformed(ActionEvent event) {
                PlaylistTableModel playlistModel = getModel();
                SequenceTrackListTableModel sequenceModel = playlistModel.getSelectedSequenceModel();
                String fn = sequenceModel.getFilename();
                if( fn != null && ! fn.isEmpty() ) setSelectedFile(new File(fn));
                if( showSaveDialog((Component)event.getSource()) != JFileChooser.APPROVE_OPTION ) return;
                File f = getSelectedFile();
                if( f.exists() ) {
                    fn = f.getName();
                    if( ! confirm("Overwrite " + fn + " ?\n" + fn + " is OK?") ) return;
                }
                try ( FileOutputStream out = new FileOutputStream(f) ) {
                    out.write(sequenceModel.getMIDIdata());
                    sequenceModel.setModified(false);
                    playlistModel.fireSequenceModified(sequenceModel, false);
                }
                catch( IOException ex ) {
                    ex.printStackTrace();
                    showError( ex.getMessage() );
                }
            }
        };

最佳答案

ClassCastException 通常在将某个对象转换为给定类型时发生,但它在运行时不会具有该类型。

例如:

public void foo(Object o) {
   ((MyObject) o).someFunction();
}

这里,代码将编译,因为 Object 是所有对象的父类(super class),但您需要小心,您的对象在运行时将被键入为 MyObject。

编辑:

你会:

File[] index = ((JFileChooser) sequenceListSelectionModel).getSelectedFiles();

您确定可以将 sequenceListSelectionModel 转换为 JFileChooser 吗?

关于java - 如何解决 ClassCastException?也许是 JFileChooser 的类型转换错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43802319/

相关文章:

c# - 在 C# 中将委托(delegate)强制转换为 Func

java - 为什么 TreeSet.contains() 不起作用?

java - 控制 Android 媒体播放器

java - java中的FileWriter不写入txt文件

c++ - 是否可以使用 cout 从用户定义的类型自动转换为 std::string?

java - 使用 NewInstance 进行转换

java - "Iterable<Element> cannot be cast to List<Element>"- 't ` 列表 ` a type of ` 是可迭代的吗?

java - 实现以中间元素为轴心的快速排序

java - Ant和XML配置文件解析

python - 转换为 float 时出错,然后在 python 中转换为 int