|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Nov 2004
Messaggi: 691
|
[JAVA-Swing] setTooltipText buggato dopo aver effettuato una deserializzazione
Ciao a tutti raga, rieccomi di nuovo con un problema da
Posto un pezzetto di codice... Il background loader per caricare un'istanza di un Player da file. Player naturalmente implementa serializable: Codice:
private class LoadPlayerTask extends org.jdesktop.application.Task<Object, Void> {
private FileContents fileContents = null;
LoadPlayerTask(org.jdesktop.application.Application app) {
super(app);
FileOpenService fos = null;
fos = (FileOpenService)ServiceManager.lookup("javax.jnlp.FileOpenService");
this.fileContents = fos.openFileDialog(null, null);
}
@Override protected Player doInBackground() {
ObjectInputStream ois = null;
try {
ois = new ObjectInputStream(this.fileContents.getInputStream());
Object o = ois.readObject();
Player p = (Player)o;
return p;
} catch (Exception ex) {
ex.printStackTrace();
} finally {
if(ois!=null){
try {
ois.close();
} catch (IOException ex) {}
}
}
return null;
}
@Override protected void succeeded(Object result) {
try {
if (this.get() != null) {
Player p = (Player)this.get();
OutputFrameView outputFrame = new OutputFrameView();
outputFrame.setVisible(true);
outputFrame.setSlotIconAndTooltip(p);
outputFrame.setComputationResult(p);
} else {
JOptionPane.showMessageDialog(null,
"Error loading the selected Player.",
"Error",
JOptionPane.ERROR_MESSAGE);
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
Codice:
private void setSlotIconAndTooltip(GearSlots gearSlot, Item item){
// assign a value to imageIcon and borderIcon ...
if(gearSlot.compareTo(WoWConstants.GearSlots.HEAD)==0 && item.getItemId()!=-1){
this.headIcon.setIcon(imageIcon);
this.headBorderIcon.setIcon(borderIcon);
this.headIcon.setToolTipText("Lightning Flash Pendant");
}
// ....
}
In pratica, settare html tooltips non funziona più dopo aver deserializzato un oggetto... Non so più che pesci prendere... Rob |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
Da un Item, a sua volta serializzato con Player? Ammesso che la serializzazione di Player sia implementata correttamente: prova a controllare/stampare i campi di un Player prima di serializzarlo e dopo averlo deserializzato. Hai provato a controllare quello che succede in modalità debug? Inoltre "non funziona più" è un po' generico, cosa succede di preciso? Viene lancaiata qualche eccezione? Semplicemente non c'è il tooltip? Boh...
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
|
#3 | |||
|
Senior Member
Iscritto dal: Nov 2004
Messaggi: 691
|
Quote:
Quote:
Quote:
Ho fatto un video per mostrarti il problema:http://www.youtube.com/watch?v=01TDZTr7mN4 Quello che vedrai nel video: 1) creo un Player e lo serializzo/salvo su hd 2) se riapro il software e deserializzo il player come prima azione, set tooltip text con in pasto html è definitivamente broken 3) se prima chiamo set tooltip text con in pasto html, e poi deserializzo, non smette di funzionare Ultima modifica di tylerdurden83 : 02-03-2011 alle 13:16. |
|||
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Sto andando a pranzo, se ho tempo dopo do un'occhiata.
Però penso che non sia la serailizzazione/deserializzazione di Player il problema (ammesso che serializzare Player non significhi serializzare componenti grafici Swing). Forse il problema sta nell'inizializzazione/funzionamento di un componente Swing (il tooltip) quando la sua proprety "text" è testo normale contro testo formattato html. Magari le due cose sono mutuamente esclusive: indagherei in questa direzione.
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Nov 2004
Messaggi: 691
|
Quote:
Non sono sicuro di seguirti, ma continuo a non capire cosa cambi tra il chiamare setTooltipText, deserializzare, e richiamarlo (così funziona), rispetto a deserializzare e chiamarlo (cosi diventa broken fino a che non chiudo l'applicazione).... |
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
Ho una perplessità nata dall'osservazione del 2° e del 3° (e ultimo) run che fai dell'applicativo. La situazione di partenza comune ai due run è che - l'applicazione ha già girato almeno una volta - il file con il player serializzato è presente sul disco locale - l'applicazione non è in esecuzione Nel 2° run io vedo questo: - lanci l'applicazione - carichi il player > nella finestra [Optimal Setup] mancano i tooltip alle immagini e manca anche il testo nell'area centrale - lanci la ricerca [SEARCH] > vengono visualizzate le row ma mancano i tooltip e anche i testi nelle celle Nel 3° run invece vedo questo: - lanci l'applicazione - lanci la ricerca [SEARCH] > viene visualizzato il risultato della ricerca correttamente - carichi il player > viene visualizzata la finestra [Optimal Search] normalmente Da queste osservazioni io ho l'impressione che il problema non riguardi strettamente i tooltip in formato html e la sua deserializzazione... (il 3° run mostra come una semplice inversione di due operazioni renda funzionante quello che nel 2° run non funziona, a parità di condizioni e sempre se non mi sono perso qualcosa).
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Nov 2004
Messaggi: 691
|
Lo pensavo anche io! Tuttavia:
1) stampando quello che passo a setTooltipText, vedo la stringa corretta 2) ho sostituito this.headIcon.setToolTipText(tooltip); con this.headIcon.setToolTipText("Lightning Flash Pendant"); e this.neckIcon.setToolTipText(tooltip); con this.neckIcon.setToolTipText("<html><body>Lightning Flash Pendant</body></html>");. In pratica, non uso per niente l'oggetto deserializzato, ma setto i tooltip a delle stringhe costanti. Quella senza tag html va, l'altra no... Guarda questo bug Li dice: Quote:
Ultima modifica di tylerdurden83 : 03-03-2011 alle 18:45. |
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Ho provato anche io a lanciare l'esempio del bug:
- tooltip prima finestra va (deve andare) - tooltip seconda finestra che è appena stat serializzata non va - tooltip terza finestra che è la deserializzazione della seconda va Non lo credo, per vari motivi. Primo, il bug è "fix-released" il che vuol dire che è stato sistemato, Secondo, nel tuo caso non c'è alcuna serializzazione di componenti grafici (il tool tip non viene serializzato) stando a quanto hai detto, quindi non rientra nel caso preso in esame da quel vecchio bug. E terzo, come ho riportato sopra, a parità di condizioni (2° e 3° caso illustrati dal tuo video, che lavorano con un Player deserializzato) in un caso funziona, nell'altro no e la differenza tra i due casi è l'ordine di esecuzione delle operazioni. Per non parlare del fatto che nel tuo caso non sono solo i tooltip a non funzionare!
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Nov 2004
Messaggi: 691
|
doppio post...
Ultima modifica di tylerdurden83 : 03-03-2011 alle 22:08. |
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Nov 2004
Messaggi: 691
|
Quote:
Si si sono solo i tooltip/renderer e solo se prendono html in input (persino una string statica, se tra html tag, non va), il resto va tutto. |
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
E se inverti l'ordine con cui esegui le due operazioni al run 2 il problema non si manifesta (testimoniato nel run3) o no? Puoi chiarire questi due punti per picere, sennò non riesco a seguirti
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Nov 2004
Messaggi: 691
|
Quote:
Corretto, se prima kiamo set tooltip text va, se prima deserializzo, non va piu. Cosa puo far si che settooltiptext con una stringa html ben formata non abbia alcun effetto (tantomeno eccezione)? Ultima modifica di tylerdurden83 : 03-03-2011 alle 22:46. |
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Nov 2004
Messaggi: 691
|
Ho fatto un altro esempio e video ancora piu esplicativo.
Codice: Codice:
package varioustests;
import java.awt.*;
import java.io.*;
import javax.jnlp.*;
import javax.swing.*;
import wowgearoptimizer.model.Player;
import wowgearoptimizer.wowconstants.WoWConstants.GearSlots;
public class MyToolTipTest extends JFrame {
public static int positionOffset = 0;
public MyToolTipTest (String id) {
setTitle("Tool Tip Test: ");
JButton button = new JButton ("This is a button with tool tip text: ");
getContentPane().add(button);
button.setToolTipText(id);
getContentPane().setLayout(new FlowLayout(FlowLayout.CENTER));
pack();
setVisible(true);
this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
positionWindow();
}
public void positionWindow (){
Point position = new Point(positionOffset, positionOffset);
positionOffset += 100;
setLocation (position);
}
static void ThisWorks(){
try {
MyToolTipTest toolTipTest1 = new MyToolTipTest("<html><body>tooltip con html</body></html>");
Thread.sleep(6000L);
FileOpenService fos = (FileOpenService)ServiceManager.lookup("javax.jnlp.FileOpenService");
FileContents fileContents = fos.openFileDialog(null, null);
ObjectInputStream ois2 = new ObjectInputStream(fileContents.getInputStream());
Player player2 = (Player) ois2.readObject();
MyToolTipTest toolTipTest2 = new MyToolTipTest(player2.getItemForGearSlot(GearSlots.CHEST).getCurrentTooltip());
MyToolTipTest toolTipTest3 = new MyToolTipTest("tooltip senza html");
MyToolTipTest toolTipTest4 = new MyToolTipTest("<html><body>tooltip con html</body></html>");
} catch (Exception ex) {
ex.printStackTrace();
}
}
static void ThisDoesntWork(){
try {
FileOpenService fos = (FileOpenService)ServiceManager.lookup("javax.jnlp.FileOpenService");
FileContents fileContents = fos.openFileDialog(null, null);
ObjectInputStream ois2 = new ObjectInputStream(fileContents.getInputStream());
Player player2 = (Player) ois2.readObject();
MyToolTipTest toolTipTest1 = new MyToolTipTest(player2.getItemForGearSlot(GearSlots.CHEST).getCurrentTooltip());
MyToolTipTest toolTipTest2 = new MyToolTipTest("tooltip senza html");
MyToolTipTest toolTipTest3 = new MyToolTipTest("<html><body>tooltip con html</body></html>");
} catch (Exception ex) {
ex.printStackTrace();
}
}
static public void main(String args[]){
//ThisWorks();
ThisDoesntWork();
}
}
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Usa XMLEncoder/Decoder per serializzare i componenti swing. Se vuoi personalizzarli con delle proprietà ad hoc, basta che le "bean-izzi"
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Nov 2004
Messaggi: 691
|
Non sto (de)serializzando componenti swing però...
Ultima modifica di tylerdurden83 : 04-03-2011 alle 01:36. |
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Nov 2004
Messaggi: 691
|
Codice:
static void ThisAlsoWorks(){
try {
String message = "<html><body>This is my serialized object</body></html>";
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(message);
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream oins = new ObjectInputStream(bais);
Object o = oins.readObject();
MyToolTipTest2 toolTipTest = new MyToolTipTest2(message);
Thread.sleep(5000L);
FileOpenService fos = (FileOpenService)ServiceManager.lookup("javax.jnlp.FileOpenService");
FileContents fileContents = fos.openFileDialog(null, null);
ByteArrayOutputStream baos2 = new ByteArrayOutputStream();
ObjectOutputStream oos2 = new ObjectOutputStream(baos2);
oos2.writeObject(message);
ByteArrayInputStream bais2 = new ByteArrayInputStream(baos2.toByteArray());
ObjectInputStream oins2 = new ObjectInputStream(bais2);
Object o2 = oins2.readObject();
MyToolTipTest2 toolTipTest2 = new MyToolTipTest2(message);
} catch (Exception ex) {
ex.printStackTrace();
}
}
Da questo esempio che tutti possono lanciare si nota come se si va sul primo frame prima che il thread.sleep termina, il tooltip compare correttamente. Poi compare il file chooser, si sceglie un file a caso tanto non è usato, e poi compare il secondo frame. Tutti e due con tooltip funzionanti. Tuttavia, se non si mousehover il primo frame prima che la thread.sleep termina e il file chooser compare, entrambi i frame non avranno mai i tooltip visualizzati. Video dimostrativo Ultima modifica di tylerdurden83 : 04-03-2011 alle 02:44. |
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Mi spiace, non conosco jnlp, quindi non riesco a immaginare quale sia il problema.
Però adesso hai un punto di riferimento preciso dal quale partire per trovare un workaround. P.S.: bella la GUI del tuo applicativo
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Nov 2004
Messaggi: 691
|
Quote:
Penso ci sia poco da fare in realtà, sto usando l'ultimo jar con quella classe. Non riesco più a trovare dove aprire bug da quando oracle ha acquistato sun... Vuoi vedere che ti apro persino un bug! |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:21.




















