質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.62%

  • Java

    13473questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

JTableを用いたメモ帳の「Save/Open」機能の実装

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 607

DaiAoki30

score 50

現在、JavaのSwingでJTableを用いたメモ帳を作っています。(前回の質問

文字のフォントや行の追加・削除といった機能の実装ができ、次に「Save/Open」機能の実装をしようとしているのですが、やり方がよくわかりません。
参考書で勉強していて、シリアライズ・デシリアライズといったことが必要になってくると思ったのですが、いまいち理解しきれていない状況です。
参考書を見ながら見様見真似でやってみましたが、うまくいきませんでした。おそらく、writeObject( )の( )内がうまくいっていないのだと思います(他にも原因があるのかもしれません)。

FileOutputStream fileStream=new FileOutputStream("保存先ファイル名");
ObjectOutputStream os=new ObjectOutputStream(fileStream);
os.writeObject(ここに何を書けば良いかわかりません);
os.close( );

一応、writeObjectするクラスはSerializableインタフェースをインプリメントしました。(下のコードでいうとMemo)
そもそも、JTableにおいて、クラスとして保存するべきなのは何なのかといったことも理解しきれていないと思います。

考え方として、JTableの場合、何を保存対象とすれば良いのでしょうか?
今のところのコードの概要としては以下のようになっています。
public class Memo{
    public static void main(String[] args){
        new Memo( ).buildGUI( );
    }    
    public void buildGUI( ){
//ここにUIに関するコードを記述
    }
//いくつかのリスナークラスとレンダラークラス
}

または、シリアライズ・デシリアライズといった方法以外で適切なやり方があるのでしょうか?
よろしくお願いします。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

+1

writeObjectメソッドの引数には、Serializableをimplementsしたクラスのインスタンスを指定します。

DaiAoki30さんのメモ帳でうまく動作するかは分かりませんが、JTableSerializableをimplementsしているので、JTableのインスタンスをそのままwriteObjectできるはずです。
もしくは、Memoの中にJTableインスタンスを持たせても良いです。JTable以外にも保存する項目がある場合はこちらの方が良いでしょう。ただし、Memoに新しく項目を追加すると、Memoクラスの互換性が失われるので注意してください。

ただJTable内にSerializableでない項目が含まれているとダメだと思います。
うまくいかないようでしたら、JTableの中身のシリアライズ可能なオブジェクトだけを別の入れ物(HashMapなど)に移してMemoに保存することになります。
このやり方には一般的な方法はたぶん無いので、独自に考えることになります。


参考リンク:
Javaとシリアライズと互換性 - CLOVER
Java オブジェクト直列化仕様:5 - 直列化可能オブジェクトのバージョン管理


また、本題とは直接関係ありませんが、Java7以降であれば、try-with-resources機能を使って書くほうが良いです。こうすれば、writeObjectでエラーになっても必ずファイルがクローズされます。

// import省略

// Java7以降
try (FileOutputStream fileStream = new FileOutputStream("保存先ファイル名");
     ObjectOutputStream os = new ObjectOutputStream(fileStream)) {
    os.writeObject(jtable);
}
// os.close( ); 自動でcloseされるので不要


// Java6以前
FileOutputStream fileStream = new FileOutputStream("保存先ファイル名.dat");
try {
    ObjectOutputStream os = new ObjectOutputStream(fileStream);
    try {
        os.writeObject(jtable);
    } finally {
        os.close();
    }
} finally {
    fileStream.close();
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/09/26 20:12

    いつもご回答いただきありがとうございます。

    ひとまず、
    public class SaveItemListener implements ActionListener{
    public void actionPerformed(ActionEvent a){
    try(FileOutputStream fileStream=new FileOutputStream("Memo.ser");
    ObjectOutputStream os=new ObjectOutputStream(fileStream)){
    os.writeObject(table);
    }
    catch(Exception ex){
    ex.printStackTrace( );
    }
    }
    }

    としたところ、java.io.NotSerializableExceptionというエラーメッセージがでてきました。
    このエラーメッセージを調べたところ、シリアライズが正しく実装されていないために起きるものだということでしたので、JTableのインスタンスであるtableのままだとうまくいかないようでした。
    table以外は保存する必要がないため、何とかtableで保存したいと考えているのですが、この場合、tableに関連する例えばレンダラーといったクラスもSerializableをimplementsしなければならないのでしょうか?

    ここらへんの知識が全く備わっていないと自覚しているので、この機会にargiusさんがあげてくださったサイトで体系的に勉強していきたいと思います。

    キャンセル

  • 2015/09/26 20:37 編集

    ひとつ忘れていました。

    以前ご提案させていただいたMap方式ですが、少なくともフィールドがMap<Point, Font> map = new HashMap<>();の状態だとシリアライズできません。
    MapというインターフェイスはSerializableをextendsしていないからです。(インターフェイスなのでimplementsではない)

    シリアライズ可能にするには、こちらもHashMapにする必要があります。(HashMap<Point, Font> map = new HashMap<>();)
    また、Map内に格納されるオブジェクトもすべてシリアライズ可能である必要があります。(幸い、PointもFontもシリアライズ可能ですね。)

    保存・復元しなくても良いフィールドは、transient修飾子をつけることで、シリアライズ対象外となります。

    キャンセル

  • 2015/09/26 22:32

    ご回答ありがとうございます。

    MapをHashMapに変更して試してみましたが、やはりjava.io.NotSerializableExceptionというエラーが表示されてしまいました。
    リスナーなど、Serializableをimplementsできそうなクラスは全てやってみて試してみましたがダメでした。
    レンダラークラスの中にColorのインスタンスもあるのですが、こちらはSerielizableをimplementsする必要はあるのでしょうか?また、そのクラスがシリアライズ可能かどうかを判断する方法というのはあるのでしょうか?

    キャンセル

  • 2015/09/26 22:37

    横から失礼します。
    NotSerializableException:
    の後に、Serializableでないクラスのクラス名が出力されるので、
    そのクラスをSerializableにすれば良いはずです。

    キャンセル

  • 2015/09/26 22:45

    eripongさんの書かれているように、おそらくエラーメッセージに問題のクラス名が出ると思います。
    ※エラーメッセージはある程度多くの部分を書かないと問題解決に支障が出ますので注意しましょう。


    > シリアライズ可能かどうかを判断する方法というのはあるのでしょうか?
    標準クラスのことを言ってるのなら、APIドキュメントの「すべての実装されたインタフェース」のところにSerielizableがあればシリアライズ可能です。(Colorはimplements Serializableあり)
    自作クラスのことなら、前述したとおり、transient修飾子が付いていないフィールドがすべてシリアライズ可能であれば、シリアライズ可能なはずです。(スーパークラスがあれば当然そのスーパークラスのフィールドもすべてそうなっている必要がある。)

    キャンセル

  • 2015/09/27 00:26

    >eripongさん
    >argiusさん

    ご回答ありがとうございます。
    NotSerializableExceptionの後にとてつもなく長いエラーメッセージが表示されています。
    (以下に全て記載します)

    java.io.NotSerializableException: com.apple.laf.AquaPainter$AquaSingleImagePainter
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
    at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:441)
    at javax.swing.JComponent.writeObject(JComponent.java:5524)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:988)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
    at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:441)
    at javax.swing.table.JTableHeader.writeObject(JTableHeader.java:703)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:988)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
    at javax.swing.event.EventListenerList.writeObject(EventListenerList.java:259)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:988)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
    at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:441)
    at javax.swing.JTable.writeObject(JTable.java:5832)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:988)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
    at ForSera.Memo$SaveItemListener.actionPerformed(Memo.java:270)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2346)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    at javax.swing.AbstractButton.doClick(AbstractButton.java:376)
    at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:833)
    at com.apple.laf.AquaMenuItemUI.doClick(AquaMenuItemUI.java:157)
    at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:877)
    at java.awt.Component.processMouseEvent(Component.java:6525)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
    at java.awt.Component.processEvent(Component.java:6290)
    at java.awt.Container.processEvent(Container.java:2234)
    at java.awt.Component.dispatchEventImpl(Component.java:4881)
    at java.awt.Container.dispatchEventImpl(Container.java:2292)
    at java.awt.Component.dispatchEvent(Component.java:4703)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4898)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4533)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4462)
    at java.awt.Container.dispatchEventImpl(Container.java:2278)
    at java.awt.Window.dispatchEventImpl(Window.java:2750)
    at java.awt.Component.dispatchEvent(Component.java:4703)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
    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$1.doIntersectionPrivilege(ProtectionDomain.java:75)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
    at java.awt.EventQueue$4.run(EventQueue.java:731)
    at java.awt.EventQueue$4.run(EventQueue.java:729)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
    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)


    「at〜」となっているのがいわゆるエラー箇所という意味でしょうか?
    お恥ずかしいながら、あまりこれらのメッセージを気に留めたことがなかったので、どのように解釈すれば良いかわかりません。
    エラーメッセージに構文のようなものはあるのでしょうか?

    キャンセル

  • 2015/09/27 00:43

    atのところは「スタックトレース」というものです。
    メソッドの呼び出し履歴が最初の呼び出し元から逆順に出力されます。
    詳しくは「java スタックトレースの読み方」などで検索してみてください。
    場合によってはatの箇所が必要になることもありますが、
    今回の場合はcom.apple.laf.AquaPainter$AquaSingleImagePainterが重要です。

    例外が発生した場合、例外のクラス名の後ろに大抵なにかそのエラーに関連するメッセージが付いてきます。この例外は「インスタンスが直列化可能インタフェースを持つ必要がある場合にスローされます。」(APIドキュメント参照)なので、直列化可能インタフェースを持っていないクラス名が出力されているわけです。
    これが、eripongさんのおっしゃってたことです。

    で、AquaSingleImagePainterは他人のクラスなのでSerializable付けられませんね。おまけにMacでだけ使われるクラスです。
    中身を移すしかなさそうです。

    キャンセル

  • 2015/09/27 00:57

    この場合だと、com.apple.laf.AquaPainter$AquaSingleImagePainterが
    Serializableでは無い、と言っています。
    これが出るとなると、一つ一つ対応していくのは大変と思うので、
    tableを丸ごとserializeするのは諦めた方が良いかも知れません。

    また、このエラーメッセージは、例外スタックトレースと呼びます。
    Javaのデバッグでは、非常に有用なものなので、読み方は知っておいた方が良いです。
    「スタックトレースの見方」などでGoogle検索すると、解説記事が出てきますよ。

    http://d.hatena.ne.jp/wyukawa/20090301/1235914636
    http://d.hatena.ne.jp/jflute/20090224/1235473382
    などです。

    キャンセル

  • 2015/09/27 01:31

    ご回答ありがとうございます。

    スタックトレースの読み方について調べてきました。
    少し自信がない箇所があるので、理解が正しいか確認していただいてもよろしいでしょうか?

    例えば、
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
    の1184というのは、ObjectOutputStreamクラスの1184行目に問題があるということを示しているのでしょうか?


    また、eripongさんがおっしゃっていたことというのは、
    java.io.NotSerializableExceptionの場合は「:」の後ろにシリアライズ化されていないクラス名が出るということでしょうか?(今回の場合、com.apple.laf.AquaPainter$AquaSingleImagePainter)
    これが、他の例外になった場合は、:の持つ意味も変わってくるのでしょうか?


    AquaSingleImagePainterというクラスを明示的に使用していないのですが、なぜこのクラスがコードに含まれると判断されたのでしょうか?Macのデフォルトの設定か何かなのでしょうか?

    質問が多岐にわたってしまい申し訳ございません。
    よろしくお願いします。

    キャンセル

  • 2015/09/27 01:44


    シリアライズ不可能という問題が発生したのは確かですが、一番上のatが意味するのは「例外がスローされた場所」になります。
    ここでは、シリアライズ不可能なオブジェクトをwriteObjectしようとしたために例外をスローしています。


    コロン(:)自体は(たぶん)英語の文法によるもので、大抵の場合はコロンの右は左のものを説明する文章が入ります。
    スタックトレースでは、ほとんどの場合、「例外クラス名:説明」になりますが、説明が無い例外もあります。


    コードに含まれているわけでは無く、使用している、です。
    クラス名の先頭がcom.apple.laf.AquaXXXとなっていることから、JavaGUI(Swing) APIのMac用の実装に含まれるクラスと推測しました。

    キャンセル

  • 2015/09/27 01:48

    ちなみに、throwしている箇所のソースコードは下記で参照できます。
    http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/io/ObjectOutputStream.java#1184

    キャンセル

  • 2015/09/27 18:48

    ご回答ありがとうございます。

    うまくいかない原因がつかめました。
    writeObjectするクラス(インスタンス)内にあるものはシリアライズしなければならないのですね。また、今回のようにMac用のクラスなどが裏で働いているということも理解しました。

    実装するにあたって、JTableのインスタンスまるごとでは厳しいということでしたので、セルの情報を一度MapやListに格納して、そのMap(List)のインスタンスを保存するという形で考えていきたいと思います。
    少し時間がかかるかもしれませんが、コードを書いたらまた来ます。

    キャンセル

  • 2015/09/30 22:49 編集

    遅くなってしまい申し訳ございません。
    コレクションフレームワークのどれを使うべきかということで最初に悩んで、ArrayListを使うことにしました。順番通り格納されるということでしたので、セルの情報が前後しないと思ったからです。うまくいくかどうかは実装してみなければわかりませんが・・・。

    コードの主な流れとしては、
    ①ArrayList<Component> list=new ArrayList<Component>( );と宣言する
    ②JTableの各セルの情報をlist.add(セル情報);で追加する
    未完成なコードではありますが、以下のように考えてみました。
    for(int i=0 ; i<table.getColumnCount( ) ; i++){
    list.add(行がi,列が1のセル);
    list.add(行がi,列が2のセル);
    }

    私の作ろうとしているメモ帳は列数が2で固定で、行数はユーザーが追加ボタンや削除ボタンを押すことで変化します。
    そこで、getColumnCount( )で行数を受け取り、その分だけaddを繰り返すことで理論上は保存できるようになったかに思えるのですが、「行がi、列が1のセル」の情報をどのように引数として渡すのかがわかりませんでした。
    そのような方法がないのならそもそも考え方自体を変えなければならないことになってくると思うのですが・・・
    ご教授いただければ幸いです。

    キャンセル

  • 2015/09/30 23:22

    ArrayListは、配列ではないけれど配列のように要素0,要素1,要素2...要素nと要素を持つことはでき、配列と違ってサイズを自動的に増やすことはできますが、それ以外の情報は持つことができませんので、独自の「列単位のクラス」を作った方が良いと思います。
    例えば、RowDataというクラスにして、フィールドはComponent comp1, comp2にして、ArrayList<RowData>で持つようにすればできそうです。

    キャンセル

  • 2015/10/01 00:25

    ご回答ありがとうございます。

    argiusさんのご回答の中で、理解できたか不安な部分がいくつかあるので確認してもよろしいでしょうか。

    >それ以外の情報は持つことができませんので、独自の「列単位のクラス」を作った方が良いと思います。

    それ以外の情報というのは、どういう意味でしょうか?


    >例えば、RowDataというクラスにして、フィールドはComponent comp1, comp2にして、ArrayList<RowData>で持つようにすればできそうです。

    最終的にwriteObjectするインスタンスはArrayListになり、そのArrayListの中に列ごとのデータを格納したRowDateを格納するといった意味で捉えたのですが、その場合、わざわざArrayListに格納せずとも、RowDateクラスにSerializableをimplementsし、RowDateクラスのインスタンスをwriteObjectすれば良いと思いました。
    ですので、こちらも自分が何か理解する上で勘違いしている部分があるかと思います。

    キャンセル

  • 2015/10/01 01:33

    すみません、読み違えていました。2015/09/30 23:22のコメントは無視してください。

    それと、割と特殊なことをされているので、この辺になると、もう決まったやり方というのは無いですし、やってみないと分からないことも多いので、不確実な内容になることをご了承ください。


    「行がi、列が1のセル」の情報は、CellInfoのようなクラスを作って、その中に保存したい情報をコピーするようにする、というごく普通のやり方になると思います。コピーする情報はもちろんシリアライズ可能なものだけにします。
    JTable自体を保存できない以上、これしかないでしょうね。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    Javaのシリアライズサンプルが欲しい

    Javaでシリアライズについて質問があります。 Webアプリケーションのある状態を保管したい時、シリアライズしてファイルに保管すればよいと聞きました。 やり方が良く分からないの

  • 受付中

    InputStream→File 変換

    InputStreamからFileオブジェクトを生成する方法はありますか? 具体的な使用方法として getResourceAsStream() から得た InputStream を

  • 解決済

    soundAPIのClipを使う

    別のクラスから、 ClipSound cs = new ClipSound(); cs.setSound(fileName); cs.start();で効果音を再生したいのですが、

  • 解決済

    String型について(短いコードです)

    前提・実現したいこと String(参照型)について理解したい。 質問 以下のコードをコンパイル・実行すると 【UPDATED, ORIGINAL】となるのですが、

  • 解決済

    JavaのgetClassの仕様について

    下記のコードにて、キャストが型安全とならないのはなぜでしょうか。 下記のメソッド呼び出しにて、どのようにしてClassCastExceptionが発生し得るのか想像できません。

  • 解決済

    デシリアライズ ファイルから読み込んだ値を文字に直したい

    ファイルからArrayListを読み込んでいるのですが、取得できる値が Mem=[hello.Member@404b9385, hello.Member@6d311334] と

  • 解決済

    Java自体の脆弱性ってどんなものがあるんですか?

     質問内容 Javaの脆弱性はものすごい数上がっていますよね?具体的にどんな脆弱性があるんですか? どういう風に攻撃されるのかも予測がつかないので、具体的に教えていただけると嬉

  • 解決済

    Javaのマップゲームで立ち位置をセーブできるようにしたい

    ubuntuでJavaを使用して簡易的なRPGゲームを制作しています。 そこで、特定の位置に来たら(具体的に言うと添付した画像の位置に来たら)セーブをできるようにしたいです。

同じタグがついた質問を見る

  • Java

    13473questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。