# JTextPane: Text hinzufügen



## ankmanu (23. Jan 2010)

Hi,

ich habe bisher folgendes Programm(layout) geschrieben(Ausschnitt):

```
import java.awt.*;
import javax.swing.*;

public class RobProgMAIN extends JFrame implements ActionListener  
{
public static void main(String[] argv)
{
RobProgMAIN mainApp = new RobProgMAIN();
}
private JTextField textField2;
private JTextPane textPane1;
private JTextPane textPane2;
private JTextPane textPane3;
JLabel label;
JButton button1;
JButton button2;

public RobProgMAIN()
{
super("6-Achs Roboterarm");
setExtendedState(Frame.MAXIMIZED_BOTH);
getContentPane().setLayout(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);

// Create the labels...
label = new JLabel(" Bitte 'Start' zum Starten drücken ");
label.setLocation(10,10);
label.setSize(label.getPreferredSize());

JLabel jl6 = new JLabel("Lade-/Speicherpfad des aufgenommenen Bildes:");
jl6.setLocation(450,150);
jl6.setSize(jl6.getPreferredSize());


//Create the TextPanes..
String content1 = "Programm wurde erfolgreich gestartet\n";
JTextPane textPane1 = new JTextPane();
textPane1.setText(content1);
textPane1.setLocation(10,50);
textPane1.setSize(410,620);

String content2 = "Tetxbeispiel1";
JTextPane textPane2 = new JTextPane();
textPane2.setText(content2);
textPane2.setLocation(850,480);
textPane2.setSize(410,190);

JTextField textField3 = new JTextField("C://WebcamPicture.jpg");
textField3.setLocation(450,170);
textField3.setSize(150,20);
textField3.setEditable(false);

// Create the two buttons...
button1 = new JButton("START");
button1.setBounds(450, 320, 330, 100);
button2 = new JButton("Notaus");
button2.setBounds(10, 680, 1255, 50);
button2.setBackground(new Color(255, 0, 0));
button2.setForeground(new Color(0, 0, 0));
// Add the action listeners
button1.addActionListener(this);
button2.addActionListener(this);

// Add the objects to the content pane...
getContentPane().add(label);
getContentPane().add(jl6);
getContentPane().add(button1);
getContentPane().add(button2);
getContentPane().add(textField3);
getContentPane().add(textPane1);
getContentPane().add(textPane2);

try{textPane2.getDocument().insertString(textPane2.getDocument().getLength(), 
  "Test zum anfügen von Text...\n", null);}
catch(Exception egf){/** sollte nie passieren*/}

setVisible(true);
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource() == button1)
{              
label.setText("Programm gestartet...");
label.setSize(label.getPreferredSize());
try{
CamBildErstellen cbe = new CamBildErstellen ();}
catch(Exception ex){
System.out.println("Klasse CamBildErstellen konnte nicht geladen werden!!!");}
}
else if(e.getSource() == button2)
{              
label.setText("Programm wurde angehalten!");
label.setSize(label.getPreferredSize());
//HIER SOLL NUN TEXT ZU TEXTPANE1 HINZUGEFÜGT WERDEN, ABER WIE?

}  
}
}
```
Wie kann ich an der Stelle //HIER SOLL... Text zu TextPane1 hinzufügen?
Habe es bisher mit folgendem versucht:

```
try{textPane1.getDocument().insertString(textPane1.getDocument().getLength(), 
  "KLAPPT LEIDER NICHT\n", null);}
catch(Exception egf){/** sollte nie passieren*/}
```
und mit:

```
textPane1.setText("KLAPPT LEIDER AUCH NICHT");
```

Beim ausführen kommen immer ca. 10 Fehler, warum ist das so, denn weiter oben (vor public void actionPerformed) klappt es ja auch mit dem ersten Muster?

Weiß jemand eine Lösung für das Problem?

Vielen Dank im Vorraus 

manu


----------



## javimka (23. Jan 2010)

Was für ein Fehler kommt denn? Eine Exception?


----------



## ankmanu (23. Jan 2010)

Hi,

bei einmaligen pressen vom Button kommt:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at RobProgMAIN.actionPerformed(RobProgMAIN.java:201)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
	at java.awt.Component.processMouseEvent(Component.java:6263)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3255)
	at java.awt.Component.processEvent(Component.java:6028)
	at java.awt.Container.processEvent(Container.java:2041)
	at java.awt.Component.dispatchEventImpl(Component.java:4630)
	at java.awt.Container.dispatchEventImpl(Container.java:2099)
	at java.awt.Component.dispatchEvent(Component.java:4460)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
	at java.awt.Container.dispatchEventImpl(Container.java:2085)
	at java.awt.Window.dispatchEventImpl(Window.java:2475)
	at java.awt.Component.dispatchEvent(Component.java:4460)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

ich habe bei //HIER SOLL... nur folgenden abschnitt eingefügt:

```
textPane1.setText(textPane1.getText() + "Button pressed test");
```

Viele Grüße

manu


----------



## javimka (24. Jan 2010)

Das Problem ist, dass textpanel1 beim Aufruf null ist.

Schau dir in deinem Code die Zeile 37 an, da steht: [c]JTextPane textPane1 = new JTextPane();[/c]. Losche das "JTextPane" am Anfang, so dass es so aussieht. [c]textPane1 = new JTextPane();[/c]. Dann funktioniert es.

Das gleiche gilt auch für die textPane2 und 3 in den Zeilen 43 und 48. Nimm die Klasse am Anfang der Zeile weg.


----------



## ankmanu (24. Jan 2010)

Hi,

super, jetzt klappt es einwandfrei!

Wie kann ich nun auch aus einer anderen Klasse text hinzufügen, das müsste doch auch gehen oder??

viele grüße

manu


----------



## Semox (25. Jan 2010)

Hallo ankmanu

Das geht auf jeden Fall. Ist nur die Frage, wie Du das da in der "anderen" Klasse machst mit dem Text. Wird das aus einer Datei gelesen? Aus der Konsole? Quasi zur Laufzeit aus irgeneiner Variable in einen StringBuffer geschrieben? Dann hängt es wohl in einem Objekt und das kann sicherlich per append() o.ä. übergeben werden.

Viele Grüße,
Semo


----------



## ankmanu (25. Jan 2010)

Hi,

also danke schon mal für die Antwort.
Es sieht wie folgt aus:
Klasse 1: (sehr gekürzt)

```
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.Graphics;
import java.awt.Image;
import java.applet.Applet;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import java.io.File;
import javax.swing.filechooser.FileFilter;

public class RobProgMAIN extends JFrame implements ActionListener  
{
public static void main(String[] argv)
{
RobProgMAIN mainApp = new RobProgMAIN();
}
private JTextPane textPane1;

public RobProgMAIN()
{
super("6-Achs Roboterarm");
JMenuBar mbar = new JMenuBar();
JMenu menudatei = new JMenu("Datei");
JMenu menuinformation = new JMenu("Information");
beenden = new JMenuItem("Beenden");
beenden.addActionListener(this);
menudatei.add(beenden);
ueber = new JMenuItem("...über");
ueber.addActionListener(this);
menuinformation.add(ueber);
mbar.add(menudatei);
mbar.add(menuinformation);
setJMenuBar( mbar );

setExtendedState(Frame.MAXIMIZED_BOTH);
getContentPane().setLayout(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);

//Create the TextPane..
String content9 = "";
textPane1 = new JTextPane();
textPane1.setText(content9);
textPane1.setLocation(10,220);
textPane1.setSize(410,430);
textPane1.setEditable(false);

// Create the button...
button1 = new JButton("START");
button1.setBounds(450, 320, 350, 100);
 
// Add the action listeners of the buttons...
button1.addActionListener(this);
 
// Add the objects to the content pane...
getContentPane().add(button1);
getContentPane().add(textPane1);

setVisible(true);
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource() == button1)                                                            	/**Button 1 Aktion*/
{try{                                                                              		/**Zur nächsten Klasse wechseln */
Klasse_2  kl2 = new Klasse_2 ();
}
catch(Exception ex){
System.out.println("Klasse 2 konnte nicht geladen werden!!!");
}}
}
```
Und Klasse 2: (auch sehr gekürzt)

```
public class Klasse_2
{
  
    public Klasse_2()
    {
        /**Hier soll nun Text in das TextPane der anderen Klasse eingefügt werden....*/
    }

}
```
Wie kann ich nun Text von Klasse 2 ins TextPane von Klasse 1 übertragen?
Ich habe keine Datei, woraus der Text entnommen wird, er sollte einfach direkt eingetragen werden...
Wenn das nicht geht, bin ich natürlich bereit, auch eine solche "Textdatei" zu erstellen (wenn ich auch nicht weiß wie das geht ...   )

Viele Grüße
manu


----------



## Semox (26. Jan 2010)

Hallo Manu

Klar geht das. Stelle mal vor man müßte erst alles in eine Datei schreiben, bevor man die Daten bekäme, die man braucht... 

Also Du brauchst Getter und Setter. Das Prinzip ist Dir klar? Du erhältst aus dem Textfeld die Daten, die in einen String gepackt werden. Dieser String überschreibt ein Setter Objekt einer anderen Methode. Damit Du aber aus einer anderen Klasse auf den Inhalt wieder zugreifen kannst, mußt Du eine Methode benutzen. Denn ein String Objekt kann man IMO nicht einfach auslesen. Ist auf jeden Fall unschön. Darum hier ein Beispiel.


```
public class Klasse2 {

	String text;
	
	public void setString(String inhaltVonsDerBox) {
		inhaltVonsDerBox = text;  // String wird überschrieben
	}
	
	public String getString() { 
		return inhaltVonsDerBox;  // hier holt sich die andere Klasse den Inhalt wieder ab
	}
}
```


```
public class RobProgMAIN {

	public RobProgMAIN() {
		Klasse2 textWillich = new Klasse2();  // es ensteht ein Objekt auf Basis der anderen Klasse
		textWillich.getString(); // so... Inhalt ist nun abgeholt und will verwendet werden...
	}
}
```

Hoffe das hilft?

Grüße,
Semo


----------



## ankmanu (26. Jan 2010)

Hi,

danke, aber so klappt es bei mir irgendwie nicht...
Kannst du mir mal ein konkretes Beispiel geben? (Einfach mit dem Text "Hallo Welt")

Viele Grüße

manu


----------



## Semox (28. Jan 2010)

Hallo

Ich dachte das wäre schon konkret. Hmm, na jut. Denn kiek mal weiter unten... ;-)


```
public class Hauptklasse {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		System.out.println(TuWas.getInhalt());
	}

}
```


```
public class TuWas {

	private static String inhalt = "Dieser String kommt aus Deinem Textfeld.";

	public void setInhalt(String inhalt) {
		// Mittels des Setters kannst Du beliebig und bequem den Text von inhalt
		// aendern.
		this.inhalt = inhalt;
	}

	public static String getInhalt() {
		// Diese Methode soll einfach nur den Inhalt vom String inhalt
		// zurueckgeben, damit man den String auch in der Hauptklasse verwenden
		// kann.
		return inhalt;
	}

}
```

Das sollte gehen. Ist getestet.

Grüße,
Semo


----------

