JXtable zapisywanie stanu

0

Witam

Używam JXtable z pakietu swingx 1.6.4. JXtable umożliwia użytkownikowi programu na ukrywanie lub pokazywanie wybranych kolumn.
Jak zapisać aktualny stan widocznych kolumn aby użytkownik po ponownym włączeniu programu nie musiał ponownie wyłączać niechcianych kolumn?

0

JXTable implementuje Serializable, spróbuj zapisać jako obiekt.

0

Serializacja nie działa. Program się zawiesza i oczywiście pojawia się dużo błędów


try
      {
         FileOutputStream fileOut =
         new FileOutputStream("..\\test.txt");
         ObjectOutputStream out = new ObjectOutputStream(fileOut);
         out.writeObject(resultList);
         out.close();
         fileOut.close();
         
      }catch(IOException i)
      {
          i.printStackTrace();
      } 
0

Jakich błędów?

0
java.io.NotSerializableException: org.jdesktop.swingx.decorator.CompoundHighlighter
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1164)
	at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)
	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483)
	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
	at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1346)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1154)
	at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)
	at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:422)
	at java.util.Vector.writeObject(Vector.java:1012)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:940)
	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1469)
	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
	at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)
	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483)
	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
	at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)
	at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:422)
	at javax.swing.JTable.writeObject(JTable.java:5829)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:940)
	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1469)
	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
	at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330)
	at plugins.guard_plugin.ui.guardUserListing.jButton1ActionPerformed(guardUserListing.java:600)
	at plugins.guard_plugin.ui.guardUserListing.access$500(guardUserListing.java:37)
	at plugins.guard_plugin.ui.guardUserListing$7.actionPerformed(guardUserListing.java:173)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
	at java.awt.Component.processMouseEvent(Component.java:6297)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3275)
	at java.awt.Component.processEvent(Component.java:6062)
	at java.awt.Container.processEvent(Container.java:2039)
	at java.awt.Component.dispatchEventImpl(Component.java:4660)
	at java.awt.Container.dispatchEventImpl(Container.java:2097)
	at java.awt.Component.dispatchEvent(Component.java:4488)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4575)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4236)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4166)
	at java.awt.Container.dispatchEventImpl(Container.java:2083)
	at java.awt.Window.dispatchEventImpl(Window.java:2489)
	at java.awt.Component.dispatchEvent(Component.java:4488)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:668)
	at java.awt.EventQueue.access$400(EventQueue.java:81)
	at java.awt.EventQueue$2.run(EventQueue.java:627)
	at java.awt.EventQueue$2.run(EventQueue.java:625)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
	at java.awt.EventQueue$3.run(EventQueue.java:641)
	at java.awt.EventQueue$3.run(EventQueue.java:639)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:638)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)


 

No i program zawiesza się.

Jak wykonam

System.out.println(resultList);

To program wypisuje tylko jedną linijkę w której nie ma żadnej informacji o kolumnach

 
ścieżka_do_klasy_$1[,0,0,854x265,alignmentX=0.0,alignmentY=0.0,border=,flags=251658568,maximumSize=java.awt.Dimension[width=2147483647,height=300],minimumSize=,preferredSize=,autoCreateColumnsFromModel=true,autoResizeMode=AUTO_RESIZE_ALL_COLUMNS,cellSelectionEnabled=false,editingColumn=-1,editingRow=-1,gridColor=javax.swing.plaf.ColorUIResource[r=128,g=128,b=128],preferredViewportSize=,rowHeight=18,rowMargin=1,rowSelectionAllowed=true,selectionBackground=javax.swing.plaf.ColorUIResource[r=51,g=153,b=255],selectionForeground=javax.swing.plaf.ColorUIResource[r=255,g=255,b=255],showHorizontalLines=true,showVerticalLines=true]
 
0

Błąd jest tylko jeden:java.io.NotSerializableException: org.jdesktop.swingx.decorator.CompoundHighlighter. Klasa JXTable zawiera pola (np. highlighters), które niestety nie implementują interfejsu Serializable.
System.out.println(resultList); jest równoważne z System.out.println(resultList.toString());, a metoda toString() nie ma obowiązku opisywać wszystkich właściwości obiektu. Obawiam się niestety, że informacja o kolumnach jest w polu highlighters i serializacja nie pomoże.

0

Dopisz dodatkowy niewielki obiekt w którym będziesz składował te informacje np. przekopiowane z highlighters i dopiero ten obiekt serializuj. Przy ładowaniu apki musisz go wczytać - jak normalną konfigurację.

0

No dobrze ale w dalszym ciągu nie wiem jakie zmienne ma pobrać z JXTable zapisać, i jak je po odczytaniu wgrać aby przywrócić poprzedni stan tabeli.

np

getModel() i później setModel nie działa

0

Tutaj jest przykład jak zrobić coś o co mi chodzi

http://carsten-oland.blogspot.com/2009/08/persisting-jxtables-column-control.html

Klasę XProperties pobrałem stąd

https://java.net/projects/jdnc-incubator/sources/svn/content/trunk/src/kleopatra/java/org/jdesktop/appframework/swingx/XProperties.java?rev=3362

Jednak ten kod nie działa. Wyrzuca błąd

WARNING: No saved state for org.jdesktop.swingx.JXTable[testTable,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.0,border=,flags=251658568,maximumSize=,minimumSize=,preferredSize=,autoCreateColumnsFromModel=true,autoResizeMode=AUTO_RESIZE_SUBSEQUENT_COLUMNS,cellSelectionEnabled=false,editingColumn=-1,editingRow=-1,gridColor=javax.swing.plaf.ColorUIResource[r=122,g=138,b=153],preferredViewportSize=,rowHeight=18,rowMargin=1,rowSelectionAllowed=true,selectionBackground=javax.swing.plaf.ColorUIResource[r=184,g=207,b=229],selectionForeground=sun.swing.PrintColorUIResource[r=51,g=51,b=51],showHorizontalLines=true,showVerticalLines=true]
 

Czy ktoś ma jakiś pomysł jak to naprawić

1 użytkowników online, w tym zalogowanych: 0, gości: 1