-1

Я пытаюсь отправить объект JPanel на сервер . При этом я получаю ошибку -java.io.NotSerializableException: javax.swing.filechooser.WindowsFileSystemView

java.io.NotSerializableException: javax.swing.filechooser.WindowsFileSystemView 

Это код, который я написал.

private JPanel gui; 
public URL url = null; 
public URLConnection conn = null; 
ObjectOutputStream writer; 

url = new URL(EndUserFrame.uri); 
conn = url.openConnection(); 
conn.setDoOutput(true); 
writer = new ObjectOutputStream(new BufferedOutputStream(
conn.getOutputStream())); 
writer.writeObject(gui); 

Как исправить эту ошибку?

  1. Я указываю файлы на удаленном ПК в формате дерева, добавляя его на панель и затем отправляя по сети. Однако отправляю ли я JFrame или JPanel или FileSystemView или JTree Я получаю ту же ошибку.
+0

Для записи объекта в OutputStream объект должен быть сериализации. Я ваш случай JPanel не сериализуем. – Kanti

+0

Я указываю файлы на удаленном ПК в формате дерева, добавляя его на панель и затем отправляя по сети. Однако, отправляю ли я JFrame или JPanel или FileSystemView или JTree, я получаю ту же ошибку. – raghavanm

+0

Чтобы прочитать или записать объект из объекта ObjectIputStream/ObjectOutputStream, объект должен быть сериализуемым ... – Kanti

ответ

1

Я с указанием файлов в удаленном компьютере в формате дерева, добавить его в панель, а затем отправить его по сети. Однако отправляю ли я JFrame или JPanel или FileSystemView или JTree Я получаю ту же ошибку.

DefaultTreeModelimplementsSerializable. Должно быть возможно сериализовать это по сети.

E.G. сериализации древовидной модели с использованием XMLEncoder.

Serialize a TreeModel

import java.awt.*; 
import javax.swing.*; 
import javax.swing.border.EmptyBorder; 
import javax.swing.tree.*; 
import java.io.*; 
import java.beans.XMLEncoder; 

public class SerializeTreeModel { 

    private JComponent ui = null; 

    SerializeTreeModel() { 
     initUI(); 
    } 

    public void initUI() { 
     if (ui != null) { 
      return; 
     } 

     ui = new JPanel(new BorderLayout()); 
     ui.setBorder(new EmptyBorder(4, 4, 4, 4)); 

     JTree tree = new JTree(); 
     tree.setVisibleRowCount(18); 
     DefaultTreeModel treeModel = (DefaultTreeModel) tree.getModel(); 
     ByteArrayOutputStream outStream = new ByteArrayOutputStream(); 
     XMLEncoder xmlEncoder = new XMLEncoder(outStream); 
     xmlEncoder.writeObject(treeModel); 
     xmlEncoder.flush(); 
     ui.add(new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, 
       new JScrollPane(tree), 
       new JScrollPane(new JTextArea(outStream.toString(), 2, 64)))); 
    } 

    public JComponent getUI() { 
     return ui; 
    } 

    public static void main(String[] args) { 
     Runnable r = new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (Exception useDefault) { 
       } 
       SerializeTreeModel o = new SerializeTreeModel(); 

       JFrame f = new JFrame("Serialize a TreeModel"); 
       f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
       f.setLocationByPlatform(true); 

       f.setContentPane(o.getUI()); 
       f.pack(); 
       f.setMinimumSize(f.getSize()); 

       f.setVisible(true); 
      } 
     }; 
     SwingUtilities.invokeLater(r); 
    } 
} 

Смотрите также File Browser GUI, в котором один из основных компонентов является деревом.

1

Как исправить эту ошибку?

Исправить не удалось. Вы не можете сделать это. Многие классы Swing и AWT просто не сериализуемы.

Если вам действительно нужно отправить макеты экрана Swing (или что-то в этом роде), вам нужно будет извлечь информацию, которую вы пытаетесь отправить, в другую (сериализуемую) структуру данных.

С другой стороны, некоторые классы Swing являются serializable; см ответ @ Андрей Томпсона

Смежные вопросы