|
|
|
|
Bonjour,
e crée un petit éditeur de texte pour m'entraîner en java et je rencontre un problème concernant la gestion des onglets.
Je sais créer de nouveaux onglets, je sais ouvrir un fichier qui s'affichera dans le premier onglet que j'ai créé mais je ne sais pas ouvrir un fichier dans le n-ème onglet.
Pour celà il faudrait que je sois capable dans ma fonction ouvrir d'identifier le JTextArea qui est compris dans l'onget actuellement ouvert.
Je suppose qu'il y a tout comme en C++ une méthode en java qui permet de connaître l'onglet actuellement ouvert et surtout d'accèder au JTextArea qu'il contient.
J'ai cherché mais je n'ai pas trouvé.
Merci de votre aide. :-)
Configuration: Linux Mozilla 1.9.1.5
Salut
|
Salut,
|
Salut,
|
Voici quelques fragments du code qui devrait vous permettre de voir ce qui ne va pas dans mon programme :
// Déclaration de ma table d'onglets
private JTabbedPane onglets = new JTabbedPane();
// Nouveau correspond à un JMenuItem
nouveau.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
onglets.add("Onglet", new JTextArea());
}
});
Et donc dans j'essaie à l'aide d'un listener, de charger dans l'onglet courant un fichier stocké sur l'ordinateur.
class actionOuvrir implements ActionListener
{
public void actionPerformed(ActionEvent e) {
JFileChooser fileChoose = new JFileChooser();
fileChoose.setCurrentDirectory(new File("~"));;
String fichier = null;
int resultatOuvrir = fileChoose.showDialog(fileChoose, new String("Ouvrir"));
if (resultatOuvrir == JFileChooser.APPROVE_OPTION) {
fichier = fileChoose.getSelectedFile().toString();
FileInputStream fis;
try {
fis = new FileInputStream(fichier);
int n;
while ((n = fis.available())> 0) {
byte[] b = new byte[n];
int result = fis.read(b);
if (result == -1) break;
String s = new String(b);
// Ici la ligne manquante pour insérer la chaine s dans mon onglet
}
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
}
}
}
J'ai essayé d'utiliser onglets.getSelectedIndex() mais celà ne semble pas me laisser la possibilité de modifier le JTextArea (pas d'appel possible de la méthode setText(). En tout cas merci pour votre réactivité. |
Pas le temps de regarder ton code maintenant, car je dois m'en aller, mais si tu vx accéder à un JTextArea, pourquoi as-tu besoin d'accéder à un tab ?
|
J'accède à un tab parce que c'est ce qui me parait être le plus naturel. Je me trompe peut-être.
|
Bonsoir Ben,
|
Voici notre tit exemple:
package fonctions;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;
public class BenBanana extends JFrame {
private static final long serialVersionUID = 1L;
class MyJTextPane extends JPanel {
private static final long serialVersionUID = 1L;
JTextArea ta;
public MyJTextPane() {
setLayout(new BorderLayout());
ta = new JTextArea();
add(ta, BorderLayout.CENTER);
}
public JTextArea getTextArea() {
return ta;
}
}
public static void main(String[] args) {
final BenBanana mf = new BenBanana();
mf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mf.setBounds(20, 20, 500, 500);
mf.setLayout(new BorderLayout());
final JTabbedPane tabbedPane = new JTabbedPane();
JPanel p1 = mf.new MyJTextPane();
JPanel p2 = mf.new MyJTextPane();
tabbedPane.add("First pane", p1);
tabbedPane.add("Second one", p2);
mf.add(tabbedPane, BorderLayout.CENTER);
JPanel southPane = new JPanel();
JButton infoBtn = new JButton("Get info");
infoBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// afficher le contenu du JTextArea actif (1 ou 2)
BenBanana.MyJTextPane selectedTab = ((BenBanana.MyJTextPane) tabbedPane
.getSelectedComponent());
JOptionPane.showMessageDialog(mf, "Current active JTA reads:\n"
+ selectedTab.getTextArea().getText());
}
});
southPane.add(infoBtn);
mf.add(southPane, BorderLayout.SOUTH);
mf.setVisible(true);
}
}
Enjoy et n'hésite pas de poser des questions au cas où. Ah, concernant ton Mais cela me forcerait à les stocker dans un tableau, et donc dans une structure de taille fini, ce qui rendrait mon programme (encore) moins flexible. ==> pas obligé d'utiliser un tableau (taille fixe). Tu peux utiliser très bien un List (qui fonctionne de la même manière qu'un vector du STL) ++ |
Yeah ça marche nickel.
|