PDA

Visualizza la versione completa : [JAVA] JComboBox Exception


tommisceddu
16-02-2004, 12:22
ciao a tutti,
ho problema sui JComboBox, devio assolutamente gestire le eccezzioni che saltano al momento in cui trascino il mouse da un item ad un altro del combo, e quando uso i tasti direzionali e il TAB per muovermi all'interno del combo.
ho provato con un try & catch che gestisce "Exception" ma non mi risolve il problema!

cosa devo fare?

anx721
16-02-2004, 14:01
Quali sono le eccezioni, in quali metodi vengono sollevati???

(Siate più esaustivi quando chiedete aiuto :quote: )

tommisceddu
16-02-2004, 18:35
L'eccezione che viene sollevata è la seguente:

Exception occurred during event dispatching:
java.lang.NullPointerException
at javax.swing.plaf.basic.BasicComboBoxUI.selectNextP ossibleValue(BasicComboBoxUI.java:1030)
at com.sun.java.swing.plaf.windows.WindowsComboBoxUI. selectNextPossibleValue(WindowsComboBoxUI.java:73)
at javax.swing.plaf.basic.BasicComboBoxUI$DownAction. actionPerformed(BasicComboBoxUI.java:1349)
at javax.swing.SwingUtilities.notifyAction(SwingUtili ties.java:1384)
at javax.swing.JComponent.processKeyBinding(JComponen t.java:2078)
at javax.swing.JComponent.processKeyBindings(JCompone nt.java:2115)
at javax.swing.JComponent.processKeyEvent(JComponent. java:2041)
at javax.swing.JComboBox.processKeyEvent(JComboBox.ja va:1060)
at java.awt.Component.processEvent(Component.java:355 3)
at java.awt.Container.processEvent(Container.java:116 4)
at java.awt.Component.dispatchEventImpl(Component.jav a:2593)
at java.awt.Container.dispatchEventImpl(Container.jav a:1213)
at java.awt.Component.dispatchEvent(Component.java:24 97)
at java.awt.LightweightDispatcher.processKeyEvent(Con tainer.java:2155)
at java.awt.LightweightDispatcher.dispatchEvent(Conta iner.java:2135)
at java.awt.Container.dispatchEventImpl(Container.jav a:1200)
at java.awt.Window.dispatchEventImpl(Window.java:926)
at java.awt.Component.dispatchEvent(Component.java:24 97)
at java.awt.EventQueue.dispatchEvent(EventQueue.java: 339)
at java.awt.EventDispatchThread.pumpOneEventForHierar chy(EventDispatchThread.java:131)
at java.awt.EventDispatchThread.pumpEventsForHierarch y(EventDispatchThread.java:98)
at java.awt.EventDispatchThread.pumpEvents(EventDispa tchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThre ad.java:85):Mentre il codice del programma (molto sminuito) è il seguente
private JComboBox combo = new JComboBox ();
...
...
combo.addActionListener (new ActionListener()
{
public void actionPerformed (ActionEvent e)
{
combo_actionPerformed (e);
}
});
...
...
private void combo_actionPerformed (ActionEvent e)
{
switch (combo.getSelectedIndex ())
{
case 0: label.setText ("Scegliere opzione");
break;

case 1: label.setText ("Item_1");
break;

case 2: label.setText ("Item_2");
break;
}
style ();
}
...
...
private void style ()
{
try
{
UIManager.setLookAndFeel(UIManager.getSystemLookAn dFeelClassName());
SwingUtilities.updateComponentTreeUI(this);
}
catch (Exception ex)
{
System.err.println("Impossibile impostare il LookAndFeel del sistema");
}
}il problema ho trovato che sta nel metodo style() infatti se commento il suo corpo il programma non solleva eccezioni, però io volevo utilizzare lo stile Windows e non quello Java. come devo fare?
Beh ora non penso che non sia stato esaustivo! :D

anx721
16-02-2004, 20:18
Il cambiamento del Lokk&Feel provoca spesso problemi, e acluni dipendono da bug delle Swing, come documentato sul sito della sun; ho trovato un bug report che parla di una NullPointerExcpetion durante il cambiamento del Look6Feel di JComboBox, ma si riferisce al jdk 1.2.2, tu hai questa versione? Un utente suggerisce di rendere la JComboBox non editabile durante il cambiamento:



if(combo.isEditable())
{
combo.setEditable(false);
style();
combo.setEditable(true);
}


Ma non so se risolve il problema. Quello che ti posso dire che con la versione che ho io (jdk 1.4.2) il tuo codice non mi lancia eccezioni e il look&Feel cambia senza problemi

:ciauz:

tommisceddu
17-02-2004, 00:17
io sto usando la 1.3.1 perchè con la 1.4.1 avevo dei problemi e alcune cose non mele faceva fare. tipo l'utilizzo di un programma esterno che ho creato in C per la parte testuale del programma che permette di visualizzare una schermata fino alla pressione di un tasto, che in Java non sapevo come fare. Cavolo invece di migliorare con la 1.4.1. si và peggiorando!!! boh!

Comunque grazie per l'aiuto e se magari mi dai qualche dritta per la pressione del tasto per continuare mi risolveresti due problemi insieme perchè così passerei alla 1.4.1 e risolverei la questione dei JComboBox

anx721
17-02-2004, 13:18
Che intendi per schermata? Un pannello nel Frame principale? O intendi una schermata sulla consolle?

tommisceddu
18-02-2004, 01:18
in pratica per la versione testuale del mio programma ho bisogno di far visualizzare una determinata situazione delle prenotazioni avvenute su un volo aereo, che farà vedere un riassunto tipo:

prima classe
lato finestrino ==> 4 posti disponibili
lato corridoio ==> 7 posti disponibili

seconda classe
lato finestrino ==> 4 posti disponibili
lato corridoio ==> 7 posti disponibili
centrali ==> 10 posti disponibili

quindi vorrei che la schermata di DOS (che penso sia quella che tu chiami consolle) in cui il tutto appare, resti come sia fino alla pressione di un tasto.

press any key to continue ...

come posso farlo con Java, senza l'ausilio di programmi esterni e quindi senza violare così la portabilità del programma finale?

anx721
18-02-2004, 02:29
Far continuare dopo la pressione di un qualsiasi carattere non so come si possa fare perchè non c'è un'interfaccia grafica e quindi non ci sono componenti verso cui sono indirizzati gli eventi della tastiera, e non so se in effetti si possa fare, se però ti accontenti del messaggio : "Premi invio per continuare":



System.out.println("Premi invio per continuare");
BufferedReader b = new BufferedReader(new InputStreamReader(System.in));
b.readLine();

tommisceddu
18-02-2004, 18:17
se funziona correttamente, va bene lo stesso!
ora lo provo grazie mille

tommisceddu
19-02-2004, 02:09
funziona perfettamente grazie!

però a questo punto ti devo chiedere un ultimissima cosa! per non violare la portabilità del mio programma mi servirebbe qualcosa che si comportasse come un clear screen, questo come il "premere un tasto per continuare ..." prima lo facevo tramite il richiamo di un programma fatto in C che però è in un linguaggio macchina e quindi non è portabile.

conosci qualche modo per risolvere il problema oltre a fare un
System.out.println ()per circa 25 volte?

Loading