Oppure

Loading
15/04/12 7:49
jock
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... :)

aaa
15/04/12 10:45
bububs
Ciao allora è semplice, fai così:
Per gestire le JTextAree coi Vector fai così:
Vector<JTextArea> aree = new Vector<JTextArea>();


Per contare le righe di una JTextArea fai così:
JTextArea.getLineCount();


Io ti consiglierei invece di usare i Vector le ArratList perchè il primo è deprecato oramai. La differenze sono minime.

Documentazioni Ufficiali:
Jtextarea:docs.oracle.com/javase/1.4.2/docs/api/javax/swing/…
vector:docs.oracle.com/javase/6/docs/api/java/util/…
arraylist:docs.oracle.com/javase/6/docs/api/java/util/…
aaa
15/04/12 11:45
jock
Per contare le righe io dicevo una cosa del genere, per ogni riga di testo a sinistra c'è il numero di riga a dx...
zetcode.com/articles/images/…

Invece non capisco per inserire l'elemento nel vettore, faccio cosi:
Vector<JTextArea> aree = new Vector<JTextArea>();
JTabbedPane tab = new JTabbedPane();
...
i++;
aree.addElement(new JTextArea());
ma poi per inserirlo nel tab come devo fare io faccio cosi
pane.add("Tab",aree.get(i));


mi da questo errore
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 1
	at java.util.Vector.get
aaa
15/04/12 16:38
bububs
Allora eccoti un esempio per quanto riguarda le righe: (l'ho caricato su mediafire)
mediafire.com/

Per i vector mi metti il pezzo di codice interessato, tutto se è possibile così te lo correggo ;)
aaa
15/04/12 17:36
jock
Ti ringrazio ;)

Note.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
package note;

import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class Board extends JFrame{
JMenuBar barra = new JMenuBar();
JMenu file = new JMenu("File");
JMenuItem nuovo = new JMenuItem("Nuovo");
JMenuItem apri = new JMenuItem("Apri");
JMenuItem salva = new JMenuItem("Salva");
JMenuItem esci = new JMenuItem("Esci");
JTabbedPane pane = new JTabbedPane();
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();

esci.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
System.exit(0);
}});

nuovo.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
Nuovo();
}});

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

public void Nuovo(){
tab++;
pane.add("Tab"+tab,new JTextArea());
int selIndex = pane.getSelectedIndex();
selIndex = pane.getTabCount()-1;
pane.setSelectedIndex(selIndex);    
}
}


Il problema sta qua
pane.add("Tab"+tab,new JTextArea());

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 15/04/12 17:37
aaa
15/04/12 21:20
bububs
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 :yup: (non è una predica nè :k: )
Comunque sia, il problema si risolve come ti ho detto nei primi post, ovvero in questo modo molto semplice:
.....
public class Board extends JFrame{
        JMenuBar barra = new JMenuBar();
        JMenu file = new JMenu("File");
        JMenuItem nuovo = new JMenuItem("Nuovo");
        JMenuItem apri = new JMenuItem("Apri");
        JMenuItem salva = new JMenuItem("Salva");
        JMenuItem esci = new JMenuItem("Esci");
        JTabbedPane pane = new JTabbedPane();
        [b]Vector<JTextArea> aree = new Vector<JTextArea>();[/b]
        int tab = 0;
......

e successivamente così:
......
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 :rotfl:

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 :k:
Ultima modifica effettuata da bububs 15/04/12 21:22
aaa
16/04/12 17:35
jock
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..
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{
JMenuBar barra = new JMenuBar();
JMenu file = new JMenu("File");
JMenu help = new JMenu("?");
JMenuItem nuovo = new JMenuItem("Nuovo",new ImageIcon("img/new.png"));
JMenuItem apri = new JMenuItem("Apri",new ImageIcon("img/open.png"));
JMenuItem salva = new JMenuItem("Salva",new ImageIcon("img/save.png"));
JMenuItem esci = new JMenuItem("Esci",new ImageIcon("img/exit.png"));
JMenuItem info = new JMenuItem("Info",new ImageIcon("img/info.png"));
JTabbedPane pane = new JTabbedPane();
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();


esci.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
System.exit(0);
}});

nuovo.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
Nuovo();
}});

apri.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
Apri();
}});

salva.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
Save();
}});

pane.addChangeListener(new ChangeListener(){
public void stateChanged(ChangeEvent e){
select = pane.getSelectedIndex();
aree.get(select).requestFocusInWindow();
Linee();
}});

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

public void Linee(){
aree.get(select).getDocument().addDocumentListener(new DocumentListener(){
public String getText(){
int caretPosition = aree.get(select).getDocument().getLength();
Element root = aree.get(select).getDocument().getDefaultRootElement();
String text = "1" + System.getProperty("line.separator");
for(int i = 2; i < root.getElementIndex( caretPosition ) + 2; i++){
text += i + System.getProperty("line.separator");
}
return text;
}

@Override
public void changedUpdate(DocumentEvent de){
line.get(select).setText(getText());
}

@Override
public void insertUpdate(DocumentEvent de){
line.get(select).setText(getText());
}
 
@Override
public void removeUpdate(DocumentEvent de){
line.get(select).setText(getText());
}});    
}

public void Nuovo(){
tab++;
line.add(new JTextArea("1"));
line.get(tab-1).setBackground(Color.LIGHT_GRAY);
line.get(tab-1).setEditable(false);
aree.add(new JTextArea());
jsp.add(new JScrollPane());
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{
JFileChooser fileChooser = new JFileChooser();
int n = fileChooser.showOpenDialog(this);
if(n == JFileChooser.APPROVE_OPTION){
File f = fileChooser.getSelectedFile();
Reader r = new FileReader(f);
tab++;
line.add(new JTextArea("1"));
line.get(tab-1).setBackground(Color.LIGHT_GRAY);
line.get(tab-1).setEditable(false);
aree.add(new JTextArea(""+(tab-1)));
aree.get(tab-1).read(r,null);
jsp.add(new JScrollPane());
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);
}}catch(Exception ex){}
}

public void Save(){
try{
JFileChooser fileChooser = new JFileChooser();
int n = fileChooser.showSaveDialog(this);
if(n == JFileChooser.APPROVE_OPTION) {
File f = fileChooser.getSelectedFile();
BufferedWriter write = new BufferedWriter(new FileWriter(f));
write.append(aree.get(select).getText());
write.flush();
write.close();
}}catch(Exception ex){}
}

}

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 16/04/12 17:40
aaa
17/04/12 21:11
bububs
Grazie ;)
Per il primo punto sto vedendo come risolverlo. Comunque riesci a spiegarti meglio nel secondo punto. Grazie :k:
aaa