jock (Normal User)
Pro
Messaggi: 71
Iscritto: 15/01/2010
|
Ciao a tutti, sto sviluppando un notepad a schede fino a qui tutto bene, il problema sorge che ogni scheda deve contenere una JTextarea specifica nel senso con un nome univoco, per poi andare a salvare eventualmente il testo, pensavo di usare un vettore di JTextarea ma non so quante schede potrebbe aprire un utente, pensavo di usare vector ma non so come impostare in questo caso il codice, sapreste darmi qualche consiglio?
p.s.
Nella JTextarea si possono contare le righe come molti editor di testo per eventualmente andare a correggere eventuali errori?
Ringrazio anticipatamente...
|
|
bububs (Normal User)
Expert
Messaggi: 253
Iscritto: 11/03/2010
|
Ciao allora è semplice, fai così:
Per gestire le JTextAree coi Vector fai così:
Codice sorgente - presumibilmente Java |
Vector<JTextArea> aree = new Vector<JTextArea>();
|
Per contare le righe di una JTextArea fai così:
Codice sorgente - presumibilmente Plain Text |
JTextArea.getLineCount();
|
|
|
jock (Normal User)
Pro
Messaggi: 71
Iscritto: 15/01/2010
|
Per contare le righe io dicevo una cosa del genere, per ogni riga di testo a sinistra c'è il numero di riga a dx...
http://zetcode.com/articles/images/netbeans.png
Invece non capisco per inserire l'elemento nel vettore, faccio cosi:
Codice sorgente - presumibilmente Java |
Vector<JTextArea> aree = new Vector<JTextArea>(); ... i++; ma poi per inserirlo nel tab come devo fare io faccio cosi pane.add("Tab",aree.get(i));
|
mi da questo errore
Codice sorgente - presumibilmente Delphi |
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 1 at java.util.Vector.get
|
|
|
bububs (Normal User)
Expert
Messaggi: 253
Iscritto: 11/03/2010
|
Allora eccoti un esempio per quanto riguarda le righe: (l'ho caricato su mediafire)
http://www.mediafire.com/?ef5j9rsdux17e1s
Per i vector mi metti il pezzo di codice interessato, tutto se è possibile così te lo correggo
|
|
jock (Normal User)
Pro
Messaggi: 71
Iscritto: 15/01/2010
|
Ti ringrazio
Note.java
Codice sorgente - presumibilmente Java |
package note; public class Note{ public static void main (String[] args ){ Board f = new Board(); f.setTitle("Note"); f.setSize(500,500); f.setVisible(true); //f.setResizable(false); f.setLocationRelativeTo(null); }}
|
Board.java
Codice sorgente - presumibilmente Java |
package note; import java.io.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; public class Board extends JFrame{ int tab = 0; public Board(){ barra.add(file); file.add(nuovo); file.add(apri); file.add(salva); file.addSeparator(); file.add(esci); setJMenuBar(barra); add(pane); pane. setTabLayoutPolicy(JTabbedPane. SCROLL_TAB_LAYOUT);Nuovo(); }}); Nuovo(); }}); setDefaultCloseOperation (JFrame. EXIT_ON_CLOSE);} public void Nuovo(){ tab++; int selIndex = pane.getSelectedIndex(); selIndex = pane.getTabCount()-1; pane.setSelectedIndex(selIndex); } }
|
Il problema sta qua
Codice sorgente - presumibilmente Java |
Dovrei assegnare un nome univoco per ogni JTextarea che metto in ogni tab che creo, io pensavo di usare vector tu cosa mi consigli e poi dovrei implementarlo con quella cosa delle righe... Ultima modifica effettuata da jock il 15/04/2012 alle 19:37 |
|
bububs (Normal User)
Expert
Messaggi: 253
Iscritto: 11/03/2010
|
Certo che il problema sta la perchè come si vede tu gli assegni ogni volta una nuova istanza "libera", cioè non è "registrata" e quindi su cui non puoi far riferimento.
Ma non hai neanche provato ad usare il mio consiglio, sbaglio? Perchè nel codice non c'è traccia di nessuno dei miei consigli (non è una predica nè )
Comunque sia, il problema si risolve come ti ho detto nei primi post, ovvero in questo modo molto semplice:
Codice sorgente - presumibilmente Java |
..... public class Board extends JFrame{ [b]Vector<JTextArea> aree = new Vector<JTextArea>();[/b] int tab = 0; ......
|
e successivamente così:
Codice sorgente - presumibilmente Java |
...... public void Nuovo(){ tab++; [b ]aree. add(new JTextArea("aree.get("+(tab -1)+")"));[/b ]//stampo per verificare solamente che si tratta di ogni istanza del vector, cioè di textarea [b]pane.add("Tab"+tab,aree.get(tab-1));[/b] int selIndex = pane.getSelectedIndex(); selIndex = pane.getTabCount()-1; pane.setSelectedIndex(selIndex); } ......
|
L'ho provato e funziona perfettamente
Adesso ti chiedo SOLO di provare ad applicare la classe che ti ho messo su mediafire ed applicarla.
Qualora tu riuscissi o meno fammelo sapere sempre qui e io sarò come sempre disponibile ad aiutare Ultima modifica effettuata da bububs il 15/04/2012 alle 23:22 |
|
jock (Normal User)
Pro
Messaggi: 71
Iscritto: 15/01/2010
|
Ti ringrazio sei un genio!!!
Ci sono alcune cose che vorrei implementare posso farti alcune domande...
1)Ho messo il metodo apri sarebbe apri file con implementazione del conta righe il problema che quando apro il file mi conta solo la prima riga..
Codice sorgente - presumibilmente Java |
package note; import java.io.*; import java.util.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; import javax.swing.text.Element; public class Board extends JFrame{ int tab = 0; int select = 0; Vector<JTextArea> line = new Vector<JTextArea>(); Vector<JTextArea> aree = new Vector<JTextArea>(); Vector<JScrollPane> jsp = new Vector<JScrollPane>(); public Board(){ barra.add(file); file.add(nuovo); file.add(apri); file.add(salva); file.addSeparator(); file.add(esci); setJMenuBar(barra); add(pane); pane. setTabLayoutPolicy(JTabbedPane. SCROLL_TAB_LAYOUT);Nuovo(); Linee(); }}); Nuovo(); }}); Apri(); }}); Save(); }}); select = pane.getSelectedIndex(); aree.get(select).requestFocusInWindow(); Linee(); }}); setDefaultCloseOperation (JFrame. EXIT_ON_CLOSE);} public void Linee(){ int caretPosition = aree.get(select).getDocument().getLength(); Element root = aree. get(select ). getDocument(). getDefaultRootElement(); for(int i = 2; i < root.getElementIndex( caretPosition ) + 2; i++){ text += i + System. getProperty("line.separator");} return text; } @Override line.get(select).setText(getText()); } @Override line.get(select).setText(getText()); } @Override line.get(select).setText(getText()); }}); } public void Nuovo(){ tab++; line. get(tab -1 ). setBackground(Color. LIGHT_GRAY);line.get(tab-1).setEditable(false); jsp.get(tab-1).getViewport().add(aree.get(tab-1)); jsp.get(tab-1).setRowHeaderView(line.get(tab-1)); jsp. get(tab -1 ). setVerticalScrollBarPolicy(JScrollPane. VERTICAL_SCROLLBAR_ALWAYS);pane.add("Tab"+(tab),jsp.get(tab-1)); int selIndex = pane.getSelectedIndex(); selIndex = pane.getTabCount()-1; pane.setSelectedIndex(selIndex); } public void Apri(){ try{ int n = fileChooser.showOpenDialog(this); File f = fileChooser. getSelectedFile(); tab++; line. get(tab -1 ). setBackground(Color. LIGHT_GRAY);line.get(tab-1).setEditable(false); aree.get(tab-1).read(r,null); jsp.get(tab-1).getViewport().add(aree.get(tab-1)); jsp.get(tab-1).setRowHeaderView(line.get(tab-1)); jsp. get(tab -1 ). setVerticalScrollBarPolicy(JScrollPane. VERTICAL_SCROLLBAR_ALWAYS);pane.add(f.getName(),jsp.get(tab-1)); int selIndex = pane.getSelectedIndex(); selIndex = pane.getTabCount()-1; pane.setSelectedIndex(selIndex); } public void Save(){ try{ int n = fileChooser.showSaveDialog(this); File f = fileChooser. getSelectedFile(); write.append(aree.get(select).getText()); write.flush(); write.close(); } }
|
Come posso risolvere?
2)Quando apro un file e lo modifico e clicco su salva vorrei che mi salvasse il file senza che mi chieda il percorso o quando creo un nuovo file e lo salvo per la prima volta cambiando anche il nome della tab con nomedelfile.estenzione e la seconda volta lo ri-salvo venga ri-salvato nello stesso percorso di prima pensavo di usare un vettore se è 0 vuol dire che non esiste un percorso se è diverso prendo il percorso esistente, secondo potrebbe funzionare? O ci sono soluzioni più eleganti?
Ultima modifica effettuata da jock il 16/04/2012 alle 19:40 |
|
bububs (Normal User)
Expert
Messaggi: 253
Iscritto: 11/03/2010
|
Grazie
Per il primo punto sto vedendo come risolverlo. Comunque riesci a spiegarti meglio nel secondo punto. Grazie
|
|
jock (Normal User)
Pro
Messaggi: 71
Iscritto: 15/01/2010
|
Ci proverò...
es.
Apro una nuova scheda e incomincio a scrivere poi ammettiamo che lo vorrei salvare e faccio salva, mi chiede dove vorrei salvarlo ed uso la funziona Save, la seconda volta che faccio salva vorrei che non mi chiedesse più dove salvarlo ma che lo salvasse direttamente dove l'ho avevo salvato in precedenza...
La stessa cosa quando apro un file faccio salva, vorrei fare in modo che non mi chiedesse più il percorso del file ma che lo salvasse direttamente nel percorso dove si trova il file, con lo stesso nome e la stessa estensione...
p.s.
Non so se funziona che ne pensi di http://fifesoft.com/rsyntaxtextarea/ cosi potrei implementare anche Syntax highlighting
Ho scaricato i file il problema che non mi trova la libreria...
Ultima modifica effettuata da jock il 18/04/2012 alle 7:15 |
|