Text rendern

Status
Nicht offen für weitere Antworten.

Kr0e

Gesperrter Benutzer
Hi,

ich wollte mal fragen, wie eine JTextArea z.b. den Text darstellt.
Hintergrund:

Ich programmiere eine 3d GUI für jMonkeyEngine und will nun ein Textfeld
programmieren...
Ich erzeuge zuerst ein BufferedImage einer beliegen Größe...
Dann gehts los und ich zeichne die Textzeichen mit dem Graphics-Object des
BufferedImage rein. Kein Problem!

Aber bei mehr als 1000 Zeichen wird das schon extrem lahm! Vorallem müsste ich ja
um den vollständigen Inhalt anzuzeigen ein genügend großes BufferedImage erzeugen,
was sowieso nicht möglich ist, da mein Programm nicht 300 mb (aufwärts) Speicher nur für
eine TextBox einnehmen sollte!

Aber wenn ich eine JTextArea mit hilfe eines JDesktopPane und einem JInternalFrame auf ein
Image zeichne, dann klappt das natürlich wunderbar... Der Text ist in wenigen Momenten geladen...

Wie geht das ? Oder bzw. kann ich nur eine JTextArea Komponente anzeigen iwie ? Ganz ohne JFrame usw... ?

Gruß Chris
 

javimka

Top Contributor
Ohne JFrame, JDialog oder JApplet wird das nicht funktionieren. Die JTextArea verfügt einfach nicht über die Fähigkeit ein Fenster zu sein. Aber warum ist das ein Problem? Deine BufferedImage-Methode ist sicher nicht langsamer, weil es in einem JFrame angezeigt werden muss. Ich glaube eher, dass die JTextArea dafür einfach viel performanter programmiert wurde. Waren ja kaum die Dümmsten, die sich die JTextArea überlegt haben ;)
 

Kr0e

Gesperrter Benutzer
Ne, jetzt hast du mich falsch verstanden!

Also, ich habe garkein JFRame! Ich habe ein OpenGL Textur!
So, mein Ziel war dies mit einem BufferedImage zu füllen, wo ich dann zuvor was drauf geschrieben habe sozusagen...
Aber is eben zu lahm. Genau deshalb will ich ja JTextArea nehmen...

Hab das jetzt auch schon hinbekommen. Einfach JTextArea erstellen und die paint Methode auf ein BufferedImage benutzen.

Aber ich würde dies gerne noch in Verbindung mit einem JScrollPane benutzen, um wie gesagt mehr als bloß 256x256 Platz zu haben. Aber wenn ich eine JTextArea einem JScrollPane hinzufüge.. und dann die paint Methode vom JScrollPane aufrufe, wird die JTextArea nicht mitgezeichnet... Als ob JScrollPane sich selbst zeichnet aber dann nicht die JTextArea...

Gruß Chris
 

javimka

Top Contributor
wie rufst du denn die paint-Methode von der Scrollpane auf? Mit repaint?

So ganz habe ich aber immer noch nicht verstanden, was am Schluss raus kommen soll. Willst du denn jetzt, dass die JTextArea auf das BufferedImage zeichnet oder einfach normal in der Scrollpane liegt? Oder willst du nur Teile aus der TextArea auf das Image zeichnen und diesen Teil mit der Scrollpane auswählen?
Poste doch mal den Code der überschriebenen paint-Methode von der TextArea.
 

Kr0e

Gesperrter Benutzer
Hi,

@Marco13:

Hi, nein leider nicht :( JMEDesktop ist keine Texture sondern ein Quad. Also ein 3D-Gegenstand, ich benutze Multitexturing, das ich dann auf einen beliebigen Gegenstand (Z.b. auch eine Kugel usw) legen kann ...

Ich habe an einer eigenen Implementation von JMEDesktop gearbeitet, allerdings gab es dort den selben Fehler wie bei JMEDesktop... Unter Mac klappt die Tastatureingabe nicht :(

Daher habe ich ein eigenes Inputsystem geschrieben, dass dies regelt...

Das Problem besteht eigentlich lediglich darin, ein virtuelles Fenter zu erzeugen wenn man so will...
Ich hatte gehofft es gäbe da bereits Ansätze für.. und damit meine ich schöne ! JMEDesktop wirkt wie ein kompletter
Workaround!

Gruß Chris

PS:

@javimka:
Ich würde ganz gerne das SCrollPane anzeigen lassen in dem BufferedImage mit der TextArea die gerade mit den Scrollbalken ausgewählt ist... Quasi dasselbe Verhalten wie sonst auch.

Mein Code(Der nicht klappt..) war recht simpel:

Java:
JTextArea text = new JTextArea("Hallo123");
JScrollPane p = new JScrollPane(text);
p.setSize(500, 500);

p.paint(image.createGraphics());

Aber dies klappt nicht... ich versuche inzwischen weiter an einem Workaround für die Tastatureingabe bei Mac zu arbeiten...
 

Kr0e

Gesperrter Benutzer
Also um das Problem nochmal etwas zu fokusieren!

Kennt irgendwer eine möglichkeit, ein Frame odeR JFrame oder was auch immer so abzuleiten, dass in ein BufferedImage gerendert wird ? Oder in ein Graphics Object ? Das kann doch ansich nicht so schwer sein!

Sun hat doch Swing schon extra so abstract gehalten... Da muss doch was zu mache nsein!

Gruß Chris
 

javimka

Top Contributor
Habs mal versucht. Ist ein ziemliches Gebastel und sieht auch noch nicht perfekt aus. Aber falls es tatsächlich das ist, was du willst, kannst du die Details vielleicht noch justieren.
Java:
import java.awt.BorderLayout;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;


public class ScrollPaneImage extends JPanel {

	private JScrollPane scr;
	
	public ScrollPaneImage() {
		JTextArea txa = new JTextArea("Hier ist ein Text\nmit mehreren zeilen\n");
		scr = new JScrollPane(txa);
		txa.setSize(txa.getPreferredSize());
		
		scr.getHorizontalScrollBar().setSize(scr.getHorizontalScrollBar().getPreferredSize());
		scr.getVerticalScrollBar().setSize(scr.getVerticalScrollBar().getPreferredSize());
		scr.getViewport().setSize(scr.getViewport().getPreferredSize());
		scr.setSize(scr.getPreferredSize());
		
		scr.getHorizontalScrollBar().setLocation(0,scr.getViewport().getHeight());
		scr.getVerticalScrollBar().setLocation(scr.getViewport().getWidth(),0);
	}
	
	@Override
	public void paintComponent(Graphics g) {
		scr.paint(g);
	}
	
	public static void main(String[] args) {
		ScrollPaneImage pnl = new ScrollPaneImage();
		JFrame frame = new JFrame();
		frame.add(pnl);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(200,200);
		frame.setLocationRelativeTo(null);
		frame.setVisible(true);
	}
}
 

Marco13

Top Contributor
@javimka: Wo kommt da jetzt ein Image vor? ???:L

@Kr0e: ScrollPanes sind ein bißchen eklig, da hatte ich bei Swogl auch einige Schwierigkeiten. Bei einer ScrollPane wird intern ziemlich low-levelig rumgedengelt, um das Scrollen schneller zu machen. Kannst mal schauen, ob es was bringt, einen anderen JViewport (Java 2 Platform SE 5.0)) als den standardmäßig eingestellten zu verwenden.
 

Kr0e

Gesperrter Benutzer
Hi,

danke für den Aufwand, in der Tat, das scheint zu funktionieren... Danke!
Ich hoffe dass ich dass jetzt auch auf andere Komponenten anwenden kann...

@Marco13:

Hmm, ich hätte da sowieso mal eine generelle Frage:
Was genau passiert eigentlich beim scrollen ?
Wird der komplette Ausschnitt neugezeichnet nur dann halt um ein paar Pixel verschoben ?

Ich hab jetzt mal verscuht (nur zum test) eine art eigene Textbox zu schreiben, ohne Swing
Komponenten ... Nur mit einem BufferedImage und der Graphics2D API... Und dabei stoße ich jetzt
genau an diese Grenzen... Die Geschwindigkeit! Ich meine, man kann ja leider nicht einfach einen Teil
eines Images höher schieben und dann darunter eine neue Zeile schreiben... Höchstens kopieren und dann neuzeichnen, aber das dauert... Ich würde wirklich gerne wissen, wie das Java intern regelt.. Oder is das sogar
OS Sache? Sprich, hat da Java selbst garnicht mehr viel mit zu tun ? Also mit dem Scrollen...
Das sieht man ja auch an einem Browser z.b.... Man öffnet eine Internetseite mit massig vielen Daten, Bildern und endlos viel Text... Dennoch kann man scrollen und scrollen, ohne dass die CPU über 10-20 Prozent geht... Und ich verstehe nicht, wie das möglich ist...

Gruß Chris
 

Marco13

Top Contributor
Naja, viel mehr als das, was aus der oben verlinkten Doku von JViewport hervorgeht, kann ich da spontan auch nicht sagen (ganz oben ist der "Algorithmus" beschrieben, der dort Angewendet wird). Für genauere Infos müßte man sich den Quellcode von JViewPort mal genauer ansehen. Der "Haupt-Trick" ist aber offenbar, dass wenn man den Inhalt z.B. um 10 Pixel nach oben scrollt, der gesamte schon gezeichnete Inhalt nur um 10 Pixel nach oben "kopiert" wird (also nicht neu gezeichnet, sondern nur kopiert), und nur die 10 neuen Pixelreihen wirklich neu gezeichnet werden. Dabei wird "graphics.copyArea" verwendet - ich weiß nicht, ob diese Methode auch bei einem BufferedImage-Graphics so funktioniert, wie das hierfür notwendig ist... Oder ob man das Umkopieren beim BufferedImage irgendwie effizient "per Hand" machen könnte....
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Text innerhalb von Rectangle rendern AWT, Swing, JavaFX & SWT 3
P JTextfield Text durch Keylistener verändern AWT, Swing, JavaFX & SWT 4
G Problem mit der Anzeige von jLabel. Unlesbar wenn der Text geändert wird. AWT, Swing, JavaFX & SWT 28
C JToggleButton disabled Text Color AWT, Swing, JavaFX & SWT 11
H JavaFX Label.Text mit bind an DoubleProperty binden AWT, Swing, JavaFX & SWT 3
H JList.setEnabled(false) - Text soll nicht grau sein AWT, Swing, JavaFX & SWT 2
FrittenFritze Text in Flying Saucer selectierbar machen AWT, Swing, JavaFX & SWT 0
Mojo7310 Ändern von Text in JLabel mit einem Button AWT, Swing, JavaFX & SWT 11
raeuchertofu Text von JTextfield und JLabel ändern AWT, Swing, JavaFX & SWT 2
H JavaFX Gedrehter Text auf Canvas (Positionierung) AWT, Swing, JavaFX & SWT 6
F Best-Practise: JTable Text in Zelle zu groß AWT, Swing, JavaFX & SWT 2
I Rich Text drucken AWT, Swing, JavaFX & SWT 0
B Text mit Absatz + OK-Button, der Fenster wieder schließt AWT, Swing, JavaFX & SWT 7
R Text vom Jlabel wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
N Promt Text der Combobox AWT, Swing, JavaFX & SWT 0
M JavaFX javaFX Label-Text wird nicht gesetzt AWT, Swing, JavaFX & SWT 3
sascha-sphw JavaFX ListCell höhe verändert sich beim ändern der Text-Farbe AWT, Swing, JavaFX & SWT 14
N In Textdatei Text anfügen per GUI AWT, Swing, JavaFX & SWT 3
N Textdatei GUI, Text in Textarea anzeigen mehrere Zeilen AWT, Swing, JavaFX & SWT 1
R Swing JTextField nicht-kopierbarer Text AWT, Swing, JavaFX & SWT 1
S Text-Info in der Taskbar anzeigen AWT, Swing, JavaFX & SWT 15
E Warum wird Text im JTextArea erst am Programmende angezeigt ? AWT, Swing, JavaFX & SWT 1
S Swing JLabel Text mit der Zeit ändern AWT, Swing, JavaFX & SWT 1
Hatsi09 JButton text layout AWT, Swing, JavaFX & SWT 9
B Text im Tetfeld in einer TableView darstellen AWT, Swing, JavaFX & SWT 20
C JCheckBox disabled text color AWT, Swing, JavaFX & SWT 9
ralfb1105 JavaFX Wie Text Label in neuem Window von Main Stage setzen? AWT, Swing, JavaFX & SWT 6
CptK Swing Button: ImageIcon unter den Text AWT, Swing, JavaFX & SWT 4
K Swing Text eines Lables in einer Methode ändern AWT, Swing, JavaFX & SWT 13
L JavaFX TableView kein content text ändern AWT, Swing, JavaFX & SWT 2
L JavaFX Anderer Text, wenn kein Platz ist. AWT, Swing, JavaFX & SWT 1
K JavaFX TextInputDialog Button Text ändern AWT, Swing, JavaFX & SWT 1
S 2D-Grafik affine Transformation für Text-Shape AWT, Swing, JavaFX & SWT 0
B JavaFX Text wird nicht angezeigt, kein Fehler AWT, Swing, JavaFX & SWT 2
J Text in ein Textfeld eingeben und speichern AWT, Swing, JavaFX & SWT 27
xYurisha JLabel Text einer geöffneten Gui über eine andere Klasse ändern! AWT, Swing, JavaFX & SWT 3
C Swing Spinner als TableCellEditor - Text zu klein AWT, Swing, JavaFX & SWT 2
H JavaFX - Button und Text - Falsche Darstellung AWT, Swing, JavaFX & SWT 3
DaCrazyJavaExpert Swing Extern den Text eines nicht fetsgelegten Buttons bekommen. AWT, Swing, JavaFX & SWT 12
zhermann FX Label text wird nicht richtig angezeigt AWT, Swing, JavaFX & SWT 12
I JavaFX formatierter Text in PDF speichern AWT, Swing, JavaFX & SWT 4
T JavaFX Text des ProgressIndicators ändern AWT, Swing, JavaFX & SWT 2
E Swing Text verschwindet AWT, Swing, JavaFX & SWT 1
G JavaFX - Während AudioRecording keine Text eingabe TextField möglich AWT, Swing, JavaFX & SWT 6
G Rectangle Breite richtet such an die Breite vom Text AWT, Swing, JavaFX & SWT 1
Sanni94 JavaFX Kann man eine Grafik in einen Text einbinden? AWT, Swing, JavaFX & SWT 2
S JTextArea Text nach oben wandern lassen AWT, Swing, JavaFX & SWT 7
F Icons neben Text in Listview setzen AWT, Swing, JavaFX & SWT 2
K Rich Text FX von TomasMikula AWT, Swing, JavaFX & SWT 0
M Text in einem Label fett setzen AWT, Swing, JavaFX & SWT 4
S JAVAFX HTMLEditor wrap text AWT, Swing, JavaFX & SWT 1
J JavaFX Translation Text/Label AWT, Swing, JavaFX & SWT 2
K Swing JTable mit ImageIcon und Text in einer Zelle AWT, Swing, JavaFX & SWT 1
A JavaFX HTMLEditor in Text umwandeln AWT, Swing, JavaFX & SWT 2
M Swing jButton Text verschwindet AWT, Swing, JavaFX & SWT 2
J JavaFX Bestimmte Zellen im TableView ändern (Farbe und Text) AWT, Swing, JavaFX & SWT 1
2 JLabel - setText ändert den Text nicht AWT, Swing, JavaFX & SWT 4
B Jlabel Text von anderen Klasse aus ändern AWT, Swing, JavaFX & SWT 9
stylegangsta JLabel anzuzeigenden Text zentrieren AWT, Swing, JavaFX & SWT 9
javampir Java FX Text verschwindet nicht AWT, Swing, JavaFX & SWT 9
Tausendsassa Text changed event handler jTextField AWT, Swing, JavaFX & SWT 3
Tom299 JavaFX Text oder Label benutzen AWT, Swing, JavaFX & SWT 4
E To get a color text on the TextArea AWT, Swing, JavaFX & SWT 4
E To get color text on the TextArea AWT, Swing, JavaFX & SWT 5
M Swing JTextPane, Bilder und Text-flow AWT, Swing, JavaFX & SWT 2
Z AWT JLabel setzt kein neuen Text AWT, Swing, JavaFX & SWT 6
D Event Handling Aus einer anderen Klasse heraus einen Text des JLabels ändern. AWT, Swing, JavaFX & SWT 12
T JavaFX Editable Combobox Text-Selektierung nach Trigger AWT, Swing, JavaFX & SWT 4
S JLabel-Text in Methode setzen? AWT, Swing, JavaFX & SWT 2
F JPanel "zeichnet" keinen Text AWT, Swing, JavaFX & SWT 14
U WYSIWYG Text-Editor für JFrames AWT, Swing, JavaFX & SWT 8
C Button Text in JList neue Zeile AWT, Swing, JavaFX & SWT 6
T MausClick soll TExt ändern AWT, Swing, JavaFX & SWT 6
J Text bei Eingabe löschen AWT, Swing, JavaFX & SWT 5
A SWT Auto completion in text box AWT, Swing, JavaFX & SWT 5
C Geloest: JTextfield: Titel automatisch entfernen, sobald Text eingegeben wird AWT, Swing, JavaFX & SWT 1
I Text zur Linie zeichnen AWT, Swing, JavaFX & SWT 1
J JavaFX JavaFX Probleme bei der Anzeige von Text AWT, Swing, JavaFX & SWT 18
X AWT Text der mit Graphics "drawString(...)" geschreiben wurde wieder löschen. AWT, Swing, JavaFX & SWT 6
O Swing Text aus Textfield auslesen AWT, Swing, JavaFX & SWT 8
B Text auf Display ausgeben [LWJGL] AWT, Swing, JavaFX & SWT 2
G Text im textfeld in einem Editor anzeigen AWT, Swing, JavaFX & SWT 18
S TextArea get Selected row(Text) AWT, Swing, JavaFX & SWT 6
A Radio Buttons sollen den Text der text Area bestimmen AWT, Swing, JavaFX & SWT 9
BRoll JButton Text nicht ausblenden ("...") AWT, Swing, JavaFX & SWT 2
J LayoutManager Text Spielerein GUI AWT, Swing, JavaFX & SWT 2
H Javafx - Styled Text AWT, Swing, JavaFX & SWT 5
M Text Area 1. Zeile oben AWT, Swing, JavaFX & SWT 4
A Swing Focus der Radio Buttons + text bleibt gleich und gleichzeitige ausgabe zweier Objekte in 1. Fenster AWT, Swing, JavaFX & SWT 3
R JavaFX Automatischer Zeilenumbruch in Text AWT, Swing, JavaFX & SWT 13
P JList/JScroolPane Text verschieben und text wrappen AWT, Swing, JavaFX & SWT 3
F Dialog mit Titel, Text und Ok Button AWT, Swing, JavaFX & SWT 2
T Swing HTML Text aus JLabel ohne "HTML-Tags" in String einlesen AWT, Swing, JavaFX & SWT 5
TheJavaKid DocumentListener soll Text in JTextField ändern AWT, Swing, JavaFX & SWT 4
K JEditorPane Text einfügen AWT, Swing, JavaFX & SWT 4
A Text (String) zu einer Box hinzufügen AWT, Swing, JavaFX & SWT 16
B SWT Text - zeilenumbruch AWT, Swing, JavaFX & SWT 2
TheWhiteShadow Swing Document Text Position in Pixel AWT, Swing, JavaFX & SWT 2
J Swing Text kürzendes JLabel AWT, Swing, JavaFX & SWT 12
J Swing TextArea mit nicht-editierbarem Text AWT, Swing, JavaFX & SWT 7

Ähnliche Java Themen

Neue Themen


Oben