JonixLUG Forum
Programmazione => Java => Topic started by: Gas75 on February 04, 2017, 05:48:14 PM
-
Salve.
Ieri sono riuscito a costruire l'interfaccia grafica del mio primo programmino in Java, e ho anche assegnato a un button la semplice funzione di ripulire i TextField di input. Ora viene la parte difficile! ;D
Sono riuscito a incorporare il codice di esecuzione che già funzionava nel programma a riga di comando nel sorgente del JFrame, ma non riesco a fargli stampare l'output in una TextArea che ho creato apposta. Il problema principale è che, siccome il programma stampa un numero di righe variabile a seconda di un valore int immesso dall'utente, questa stampa in TextArea deve stare in un apposito ciclo for, ma in tale posizione il nome della TextArea non piace a NetBeans.
Sono partito da un costrutto di questo tipo:
public class <name-of-class> extends JFrame
{ private JTextArea <name-of-textarea> = new TextArea(<optional-size-info>);
public <name-of-class>()
{ this.add(<name-of-textarea>);
<name-of-textarea>.append(<text-to-display>);
}
}
ma probabilmente non rispecchia il mio caso... Forse perché la JTextArea nel mio caso è definita nel private void initComponents() come
OutputArea = new javax.swing.JTextArea();
oltre che in coda al codice (non modificabile):
private javax.swing.JTextArea OutputArea;
Se commento this.add, non ho più errori secondo NetBeans, ma sulla console (non nella TextArea, poiché nel codice c'è il vecchio System.out.prinln per le eccezioni) visualizzo il messaggio previsto in caso valore immesso negativo, anche se lo immetto positivo.
Come posso orientarmi per risolvere?
-
Credo di avere risolto :): il blocco di codice era giusto ma andava messo nell'ActionPerformed del JButton, non nel main della classe! ::)
Purtroppo ora succede un effetto strano: l'output avviene nella JTextArea, che però appare dietro il JTabbedPane che costituisce l'interfaccia grafica, e posizionato in alto a sinistra, lasciando un riquadro "disattivato" dove dovrebbe stare... :o
-
Ho sistemato i vari oggetti swing in un layout di tipo Grid Bag, ma il problema persiste.
-
Credo di avere risolto :): il blocco di codice era giusto ma andava messo nell'ActionPerformed del JButton, non nel main della classe! ::)
e mi pare giusto :)
Purtroppo ora succede un effetto strano: l'output avviene nella JTextArea, che però appare dietro il JTabbedPane che costituisce l'interfaccia grafica, e posizionato in alto a sinistra, lasciando un riquadro "disattivato" dove dovrebbe stare... :o
Posta uno screenshot
trova le righe del "riquadro disattivato", forse hai scritto semplicemente qualche riga prima/dopo
-
http://studiotecnico75.altervista.org/test/Problema_JTextArea.jpg (http://studiotecnico75.altervista.org/test/Problema_JTextArea.jpg)
Risale a prima che inserissi il Grid Bag Layout, ma il risultato è identico...
Da quanto ho appena letto tra le API di Java, se ho capito bene, dovrebbe dipendere dal setViewportView, che dev'essere indicato in termini di X e Y, sennò il contenuto viene posizionato di default in alto a sinistra (X=0, Y=0), come in effetti succede a me.
Nel mio caso, il codice interessato, dovrebbe essere il seguente:
OutputArea.setEditable(false);
OutputArea.setColumns(20);
OutputArea.setFont(new java.awt.Font("Monospaced", 0, 12));
OutputArea.setRows(5);
OutputArea.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
jScrollPane1.setViewportView(OutputArea);
dove jScrollPane1 è il necessario "contenitore" della JTextArea OutputArea.
-
Ho un aggiornamento circa il problema.
In sostanza, dopo la stampa dell'output, la JScrollPane collassa e le tre righe superiori occupano tutto lo spazio (in altezza) disponibile. Ho provato a impostare dei Weight Y, dando 40% allo JScrollPane e suddividendo il resto equamente tra gli altri oggetti, e dopo l'output questi ultimi si prendono tutta l'altezza, mentre la JTextArea torna visibile se azzero i contenuti dei vari campi, ma sempre spostata (di 29 pixel in alto, per la cronaca) rispetto al suo contenitore.
-
la JScrollPane collassa
Che in gergo significa?
Il debugger che dice?
Prova a stampare un output delle cordinate che inserisci (OutputArea)
Se ottieni 2 valori numerici puoi escludere questa ipotesi.
-
Collassa nel senso che sparisce dalla GUI e gli altri swing si ripartiscono l'altezza disponibile.
Se svuoto i campi (textfield, checkbox e textarea) con un apposito button dedicato, ricompare la textarea ma in secondo piano rispetto agli altri oggetti e nella posizione dov'era finita stampando l'output.
Prova a stampare un output delle cordinate che inserisci (OutputArea)
Se ottieni 2 valori numerici puoi escludere questa ipotesi.
Non credo di avere capito... :(
-
OutputArea.setEditable(false);
OutputArea.setColumns(20);
OutputArea.setFont(new java.awt.Font("Monospaced", 0, 12));
OutputArea.setRows(5);
OutputArea.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
jScrollPane1.setViewportView(OutputArea);
System.out.println( “ Le coordinate esistono e sono: “ + OutputArea);
Non conosco bene questo linguaggio, cerca di ottenere un output delle variabili per capire se esistono o se ci sono errori.
-
Il debug non pare rilevare nulla se non l'avvio e la fine dell'esecuzione.
Ho stampato poi questa roba qua...
javax.swing.JTextArea[,0,0,0x0,invalid,layout=javax.swing.plaf.basic.BasicTextUI$UpdateHandler,alignmentX=0.0,alignmentY=0.0,
border=javax.swing.plaf.synth.SynthBorder@1132ad42,flags=288,maximumSize=,minimumSize=,preferredSize=,caretColor=,
disabledTextColor=DerivedColor(color=142,143,145 parent=nimbusDisabledText offsets=0.0,0.0,0.0,0 pColor=142,143,145,
editable=false,margin=java.awt.Insets[top=0,left=0,bottom=0,right=0],
selectedTextColor=DerivedColor(color=255,255,255 parent=nimbusSelectedText offsets=0.0,0.0,0.0,0 pColor=255,255,255,
selectionColor=DerivedColor(color=57,105,138 parent=nimbusSelectionBackground offsets=0.0,0.0,0.0,0 pColor=57,105,138,
colums=26,columWidth=0,rows=8,rowHeight=0,word=false,wrap=false]
-
Ho stampato poi questa roba qua...
se è l'output di OutputArea non funziona perché come dicevi tu stesso prima, vuole 2 valori numerici.
Da quanto ho appena letto tra le API di Java, se ho capito bene, dovrebbe dipendere dal setViewportView, che dev'essere indicato in termini di X e Y, sennò il contenuto viene posizionato di default in alto a sinistra (X=0, Y=0), come in effetti succede a me.
-
Aspetta... L'output di OutputArea è corretto in base all'esecuzione del codice, quella lunga stringa è uscita nella console invocando il println che mi hai suggerito prima.
Del resto, anche assegnando i due valori, l'output avviene 29 pixel sopra il bordo superiore dell'area JScrollPane, il cui ruolo sembra essere puramente "grafico" dato che lo scroller funziona fintanto che la textarea è vuota. Inoltre se l'elaborazione richiede varie righe di risposta, la textarea "sparisce" e si vede il riquadro dello scrollpane con solo una fascia in basso bianca.
Nel frattempo sono riuscito a "bloccare" gli spostamenti degli oggetti swing dopo l'output (eccetto la textarea) attraverso i row weights.
Purtroppo la textarea non pare gestibile poiché dovrebbe starsene buona nello scrollpane e non prevede row weights.
-
Problema risolto.
L'errore era questo
this.add(jScrollPane1);
poiché add si riferisce a this che è il "contenitore principale" (il JFrame) e quindi appena il codice viene eseguito la textarea veniva erroneamente "reimparentata" col JFrame... Infatti l'errore iniziale vedeva la textarea intravedersi dietro le linguette del JTabbedPane, quindi nel JFrame.