PDA

View Full Version : [Java] creare lista JComboBox piu velocemente


Reflex86
29-11-2008, 10:40
Dunque, il problema è banale ma non riesco a risolverlo

Praticamente mi occorre creare un JComboBox che permetta di scegliere un valore da 1 a 9999, e questo oggetto va a finire in una maschera che viene replicata per 12 volte.

String[] combolist = new String[10000];
for (int i=1; i<10000; i++)
combolist[i] = ""+i;
final JComboBox combo = new JComboBox(combolist);

Ora il problema è che ci mette una eternità a caricare il programma visto che deve rifare la medesima cosa per 12 volte, esiste un modo piu veloce per fare il tutto? Spulciando tra i metodi non ho trovato nulla che potesse fare al caso mio

Grazie

Don[ITA]
29-11-2008, 12:30
Ma ripeti 12 volte il codice che hai scritto per caso?

Reflex86
29-11-2008, 12:49
Ti spiego, praticamente è una interfaccia grafica che deve gestire 12 oggetti separati. Quindi quel codice che ho postato sopra è nel costruttore di questa classe e quando creo l'interfaccia, vengono aggiunti 12 oggetti in un tabbedpane che racchiude tutto

ma ci mette veramente troppo, se tolgo quel ciclo impiega qualcosa come 15 secondi in meno ad avviarsi (su 25 totali).. lo so che il tempo è relativo, però è buon indice che qualcosa non quadra

Don[ITA]
29-11-2008, 15:11
15 secondi per eseguire quel ciclo??? :eek:
Sicuro che non siano millisecondi??

Cmq posta anche il resto del codice così vediamo dove stà l'intoppo che ti rallenta così tanto :) anche perchè 25 secondi per far partire un'applicazione mi sembrano un attimo tanti :(

Reflex86
05-12-2008, 10:45
public class Program {
public program(){

...

final JComboBox nominalflow_combo = new JComboBox(LIST);

...

}
private static final String LIST[];
static{
LIST = new String[9999];
for (int i=0; i<9999; i++)
LIST[i] = ""+(i+1);
}
}

Genero quindi un combobox utilizzando un array statico.

il programma principale, crea 12 istanze dell'oggetto program che va a sbattere nella interfaccia dentro un tabbedpane.

public class main {

Program[] unit = new Program[PROGRAM_MAX];
for (int i=0; i<PROGRAM_MAX; i++){
unit[i] = new Program();
}

JTabbedPane tabbedPane = new JTabbedPane();
for (int i=0; i<PROGRAM_MAX; i++)
tabbedPane.addTab("Program "+(i+1), null, unit[i].getPanel(),"Program nr: "+(i+1));

...




ora, se io al posto di new JComboBox(LIST) credo un combobox vuoto JComboBox() la differenza per caricare il programma è di ben 17 secondi (!!!) possibile che per popolare 12 box mi ci metta così tanto? Probabilmente mi sfugge qualcosa..

banryu79
05-12-2008, 11:49
Ehm, ma così, per curiosità, PROGRAM_MAX quanto vale?

Un'altra cosa.
Potresti per favore spiegare a cosa serve una ComboBox che permette all'utente di scegliere un valore compreso tra 1 e 9999?

Reflex86
05-12-2008, 13:30
PROGRAM_MAX vale 12

e per la combo mi serve così perchè è più immediato selezionare in questo modo il valore, cmq non mi pare normale che ci metta cosi tanto per popolare delle liste, sbaglio?

banryu79
05-12-2008, 14:55
PROGRAM_MAX vale 12

Quindi questo ciclo istanzia 12 oggetti di tipo Program:

public class main {

Program[] unit = new Program[PROGRAM_MAX];
for (int i=0; i<PROGRAM_MAX; i++){
unit[i] = new Program();
}

JTabbedPane tabbedPane = new JTabbedPane();
for (int i=0; i<PROGRAM_MAX; i++)
tabbedPane.addTab("Program "+(i+1), null, unit[i].getPanel(),"Program nr: "+(i+1));

...


Notiamo che un oggetto Program istanzia al suo interno quasi 10.000 stringhe uniche (tutti i numeri da 0 a 9999, cioè tutte le stringhe che li rappresentano a partire dalla stringa "0" fino alla stringa "9999").
Questo di per se non sarebbe il collo di bottiglia [intendo il fatto di istanziare 10.000 stringhe].

Tu stesso hai notato in precedenza:

...ora, se io al posto di new JComboBox(LIST) credo un combobox vuoto JComboBox() la differenza per caricare il programma è di ben 17 secondi (!!!)...

Il problema infatti è questo.
Passare come argomento al costruttore di JComboBox un array (in questo specifico caso di String) significa il processo di costruzione del Combo Box Model associato a quel JComboBox sarà un tantino pesantuccio se l'array contiene un numero notevole di items.

Prova un po' a ficcare solo 100 String nell'array LIST invece delle 10.000 attuali e dovresti notare una certa differenza di tempistica (e questo a prescindere dal fatto che così facendo istanzierai solo 100 String invece che 10.000: l'istanziazione delle 10.000 String di per se non deve essere un problema, il problema è appunto creare un Combo Model così esageratamente grande, quando mai ti è capitato di vedere ComboBox con 10.000 items??? A me MAI fin'ora)...

Sospetto che il problema sia concettuale, cioè che tu stia usando lo strumento sbagliato per raggiungere il risultato che ti serve ottenere, il che ci porta alla seconda domanda che ti ho fatto:

e per la combo mi serve così perchè è più immediato selezionare in questo modo il valore, cmq non mi pare normale che ci metta cosi tanto per popolare delle liste, sbaglio?

A parte il fatto che selezionare un valore da una lista di 10.000 items non mi sembra poi così "immediato" (metti che voglio l'item numero 4.789, la lista a cascata che compare sotto il ComboBox parte dal valore 1 e me ne mostra solo un tot. quanto mi tocca "scrollare" di rotellina o cliccare sulla freccetta "giù" prima di arrivare al valore che mi serve? Non faccio molto, molto prima a scrivere direttamente io il valore?) per ottenere questo scopo stai:
1- istanziando 10.000 String;
2- creando un(in realtà 12) Combo Model enorme di 10.000 items;

Non è che forse te la puoi cavare con qualche altro controllo?
Per esempio uno Spinner (http://java.sun.com/docs/books/tutorial/uiswing/components/spinner.html)?

Nota: sto scrivendo di fretta.
A scanso di equivoci: chiedo scusa se i toni possono sembrare provocatori, non ho alcuna intenzione di offenderti o fare del sarcasmo, le osservazioni che ho postato le ho postate con l'intento di far cadere la tua attenzione su determinate problematiche nella speranza di stimolare da parte tua delle riflesisoni utili.
Magari avevi già pensato a tutto questo e io non ho capito bene la situazione: capita, sono nubbio :D

Ciao.

Reflex86
05-12-2008, 15:13
mmm hai perfettamente ragione, non pensavo fosse così oneroso il dover creare quei combobox comunque, ora mi studio un po' JSpinner e vedo se può fare al caso mio e come modificare il resto del codice eventualmente, ti ringrazio per la dritta :)

Considerando che il programma in tutto impiega qualcosa come 48 secondi a caricare mi sa che dovrò fare un bel po' di alleggerimenti :doh: Sicuramente sbaglio qualcosa a livello di gestione degli eventi, ma eventualmente aprirò un altro thread, cmq provo così e vediamo se posso limare quei 17 secondi :D

banryu79
05-12-2008, 15:31
...
Considerando che il programma in tutto impiega qualcosa come 48 secondi a caricare mi sa che dovrò fare un bel po' di alleggerimenti :doh: Sicuramente sbaglio qualcosa a livello di gestione degli eventi, ma eventualmente aprirò un altro thread...


Probabilmente c'è qualche altro problema.
Prova a controllare:
- i cicli;
- il codice che hai inserito nei metodi di gestione degli eventi dei vari Listener;

Se hai qualche sospetto su qualche pezzo di codice, specie per i Listener, non aprire un altro thread (nn c'è n'è veramente bisogno) ma posta qui sotto, io quando e per quello che posso ti do una mano volentieri.