Swing JTextPane in JScrollPane wird nicht ordentlich neugezeichnet

xehpuk

Top Contributor
Moin, Leute!

Ich möchte eine JTextPane mit Farbverlauf als Hintergrund haben. Dafür habe ich die Tipps hier befolgt.
Die JTextPane soll sich in einem JScrollPane befinden. Da bekam ich nun das Problem, dass die GradientPaint immer weiter in die Länge gezogen wurde, je mehr Zeilen der Text bekam. Sie soll jedoch "statisch" an einer Stelle bleiben, nämlich vom Anfang bis zum Ende des sichtbaren Bereichs des JTextPane gehen. Daher zeichne ich anhand des sichtbaren Bereichs des JTextPane neu.

Dafür nun folgender lauffähiger Code:
Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.JTextPane;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;

public class GradientTextPane extends JTextPane {
	@Override
	protected void paintComponent(Graphics g) {
		final boolean opaque = isOpaque();
		if (opaque) {
			final Graphics2D g2d = (Graphics2D) g.create();
			final Rectangle size = getVisibleRect();
			final int x1 = size.x;
			final int y1 = size.y;
			final int x2 = size.width + x1;
			final int y2 = size.height + y1;
			final GradientPaint gp = new GradientPaint(0, y1, Color.WHITE, 0, y2, Color.BLACK);
			System.out.println(x1 + "\t" + y1 + "\t" + x2 + "\t" + y2);
			g2d.setPaint(gp);
			g2d.fillRect(x1, y1, x2, y2);
			// Debugging: Rotes X kennzeichnet sichtbaren Bereich
			g2d.setColor(Color.RED);
			g2d.drawLine(x1, y1, x2, y2);
			g2d.drawLine(x2, y1, x1, y2);
			g2d.dispose();
			setOpaque(false);
		}
		super.paintComponent(g);
		setOpaque(opaque);
	}
	
	public static void main(String[] args) {
		final JPanel contentPane = new JPanel(new BorderLayout());
		final GradientTextPane textPane = new GradientTextPane();
		textPane.setEditable(false);
		final JScrollPane scrollPane = new JScrollPane(textPane, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
		contentPane.add(scrollPane, BorderLayout.CENTER);
		final JTextField textField = new JTextField();
		textField.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				final String message = textField.getText().trim();
				if (!message.isEmpty()) {
					final Document document = textPane.getDocument();
					try {
						document.insertString(document.getLength(), message + System.getProperty("line.separator"), null);
						textField.setText("");
					} catch (BadLocationException e1) {
						e1.printStackTrace();
						JOptionPane.showMessageDialog(contentPane, e1.getStackTrace(), e1.toString(), JOptionPane.ERROR_MESSAGE);
					}
				}
			}
		});
		contentPane.add(textField, BorderLayout.SOUTH);
		final JFrame frame = new JFrame("GradientTextPane");
		frame.setContentPane(contentPane);
		frame.setSize(250, 150);
		frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		frame.setVisible(true);
		textField.requestFocusInWindow();
	}
}
Ändere ich die Größe des JFrame, so wird der Farbverlauf auch ordentlich neugezeichnet. Wird jedoch die ScrollBar bewegt, hinterlässt dies "Schlieren", obwohl die JTextPane komplett neugezeichnet wird. Die in der Konsole stehenden Maße des sichtbaren Bereichs sehen ebenfalls korrekt aus.

Wo liegt der Fehler?
 

jgh

Top Contributor
der Fehler liegt darin, dass du keinen AdjustmentListener implementiert hast.

[java=50] scrollPane.getVerticalScrollBar().addAdjustmentListener(
new AdjustmentListener() {

@Override
public void adjustmentValueChanged(AdjustmentEvent e) {
textPane.repaint();

}
});
[/code]
 

xehpuk

Top Contributor
Danke für den Vorschlag.

Die Lösung ist aber leider nicht perfekt, weil es dort noch ab und zu flackert.

Das Problem liegt wohl darin, dass aus Performancegründen nicht alles neu gezeichnet wird, sondern der bisher sichtbare Bereich des JTextPane nach oben bzw. unten kopiert wird und nur der Bereich neu berechnet wird, der vorher nicht zu sehen war.

Ich habe schon versucht, den Clip des Graphics-Objekts zu ändern, was aber keinen Erfolg brachte und zudem sowieso nicht besonders cool ist, da so immer alles neu gezeichnet würde, obwohl etwa nur der Cursor neu gezeichnet werden soll.
 

xehpuk

Top Contributor
Ich habe die Lösung gefunden. Man muss den Hintergrund im Viewport des JScrollPane zeichnen.

Dafür erstellt man sich einen anonymen JViewport und überschreibt dort die [c]paintComponent(Graphics)[/c]. Dann fügt man ihm die nicht opaque JTextPane hinzu und setzt ihn schließlich über [c]JScrollPane.setViewport(JViewport)[/c].
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Swing JTextPane mit JScrollPane auf JPanel scrollen nicht AWT, Swing, JavaFX & SWT 6
xehpuk Swing Line-wrapping von JTextPane (in JScrollPane) AWT, Swing, JavaFX & SWT 3
P Swing Sichtbaren teil eines JTextPane herausbekommen (mit JScrollPane) AWT, Swing, JavaFX & SWT 2
M Swing JTextPane mit JScrollPane soll aussehen wie JLabel AWT, Swing, JavaFX & SWT 3
J Problem mit JTextPane & JScrollPane (horizontal) AWT, Swing, JavaFX & SWT 3
A JScrollPane in JTextPane AWT, Swing, JavaFX & SWT 2
H Scroll-Problem bei JScrollPane+JTextPane AWT, Swing, JavaFX & SWT 2
T JTextPane in JScrollPane NICHT autom. nach unten scrollen AWT, Swing, JavaFX & SWT 3
B Stylen eines JTextPane funktioniert nicht AWT, Swing, JavaFX & SWT 1
T JTextPane ignoriert HTML Zeilenumbruch <br> tag wegen eigenem HTMLEditorKit AWT, Swing, JavaFX & SWT 5
J Swing JTextpane aktuallisiert nicht den setText? AWT, Swing, JavaFX & SWT 9
M Strings im JTextPane vergleichen und mit StyledDocument formatieren AWT, Swing, JavaFX & SWT 3
X JTextPane automatischer Zeilenumbruch IM Wort AWT, Swing, JavaFX & SWT 2
R GUI Element in einer Methode aktualisieren (JTextPane) AWT, Swing, JavaFX & SWT 13
M Swing JTextPane, Bilder und Text-flow AWT, Swing, JavaFX & SWT 2
D Swing Breite einer HTML Tabelle in einer JTextPane AWT, Swing, JavaFX & SWT 6
S Swing Warum funktioniert der automatische Zeilenumbruch mit arabischen Zeichen beim JTextPane nicht AWT, Swing, JavaFX & SWT 3
S Swing JtextPane sau langsam AWT, Swing, JavaFX & SWT 15
C JTextPane scrollt mit setText() immer nach oben AWT, Swing, JavaFX & SWT 2
S Swing Style Attribute aus JTextPane kopieren AWT, Swing, JavaFX & SWT 1
E JTextPane Focus AWT, Swing, JavaFX & SWT 1
TheJavaKid JTextPane: komplexe Formatierung (links) AWT, Swing, JavaFX & SWT 2
B Swing JTextPane - Einfärbungen auf "default" AWT, Swing, JavaFX & SWT 2
A Swing Einrücken mehrerer Zeilen per Tab in einem JTextPane/JTextArea AWT, Swing, JavaFX & SWT 3
T JtextPane Zeile aktualisieren AWT, Swing, JavaFX & SWT 3
T Hintergrundbild in JTextPane fixieren AWT, Swing, JavaFX & SWT 2
M Swing JTextPane frisst Anführungszeichen AWT, Swing, JavaFX & SWT 2
M Swing JTextPane + Scrollbar = Fragen AWT, Swing, JavaFX & SWT 15
H Swing JTextPane hat unästhetisches Scrollbar AWT, Swing, JavaFX & SWT 3
R Swing Renderproblem bei HTML in einer JTextPane AWT, Swing, JavaFX & SWT 12
N Swing JTextPane zur Anzeige von HTML AWT, Swing, JavaFX & SWT 2
E Swing jTextPane Text datei anzeigen AWT, Swing, JavaFX & SWT 7
Tobse Swing [JTextPane] Farbliche Hervorhebung AWT, Swing, JavaFX & SWT 9
X Swing JTextPane bei Größenänderung Formatierung behalten AWT, Swing, JavaFX & SWT 11
0 JTextPane copy/paste trotz editable(false) ? AWT, Swing, JavaFX & SWT 10
T Swing JTextPane Tastatureingabe abfangen AWT, Swing, JavaFX & SWT 4
B Durchsichtiges JScroll und JTextPane AWT, Swing, JavaFX & SWT 4
S Swing JTextPane append formatprobleme AWT, Swing, JavaFX & SWT 5
C JTextPane / JEditorPane ohne Keywords farbig machen AWT, Swing, JavaFX & SWT 4
C Zeilenumbruch von JTextPane wird nicht erkannt AWT, Swing, JavaFX & SWT 2
S JEditorPane oder JTextPane? AWT, Swing, JavaFX & SWT 2
P Aktuelle Zeile in JTextPane farblich hervorheben AWT, Swing, JavaFX & SWT 3
J JTextPane Background setzen AWT, Swing, JavaFX & SWT 6
T Text in JTextPane vertikal (!) zentrieren AWT, Swing, JavaFX & SWT 4
M Zugriff paralleler Threads auf selbes JTextPane AWT, Swing, JavaFX & SWT 6
M JTextPane - bewegungsloses Hintergrundsbild (Duplikat) AWT, Swing, JavaFX & SWT 2
B JTextPane formatierten Inhalt speichern AWT, Swing, JavaFX & SWT 2
E JTextPane setText ignoriert \n AWT, Swing, JavaFX & SWT 6
C Swing JTextPane zeigt HTML-Text aus Variable nicht an :( AWT, Swing, JavaFX & SWT 3
T Zeichen zählen JTextPane AWT, Swing, JavaFX & SWT 4
K Swing JTextPane Formatierungen SyntaxHighlighting AWT, Swing, JavaFX & SWT 11
F Mit TAB JTextPane wechseln AWT, Swing, JavaFX & SWT 5
J JSlider auf JTextPane? AWT, Swing, JavaFX & SWT 2
S Buchstabenpositionen in JTextPane erhalten..? AWT, Swing, JavaFX & SWT 5
I JTextPane und Hyperlink (ohne JEditorPane) AWT, Swing, JavaFX & SWT 5
T Swing JTextArea, JTextPane, JEditorPane...Unterschied?! AWT, Swing, JavaFX & SWT 3
A Swing JTextPane sehr langsam AWT, Swing, JavaFX & SWT 6
P Drucken von Jtextpane mit Seitenangabe AWT, Swing, JavaFX & SWT 1
A JTextPane: Text hinzufügen AWT, Swing, JavaFX & SWT 9
E Swing JTextPane Inhalt(Text und Bilder) als HTML text bekommen AWT, Swing, JavaFX & SWT 3
K Swing jTextPane zeilenumbruch AWT, Swing, JavaFX & SWT 2
Stillmatic JTextPane langsam? AWT, Swing, JavaFX & SWT 5
E Swing JTextPane linewrap AWT, Swing, JavaFX & SWT 4
M Swing [JTextPane] Cursor lässt sich nicht mit Pfeiltasten bewegen AWT, Swing, JavaFX & SWT 3
T Swing xml in JTextPane mit EditorKit, StyledDocument & co. AWT, Swing, JavaFX & SWT 3
M Cursor setzen im JTextPane AWT, Swing, JavaFX & SWT 3
M Formatierungsfehler JTextPane WARUM ?? AWT, Swing, JavaFX & SWT 4
JavaKaffee Array auslesen in jTextPane? AWT, Swing, JavaFX & SWT 9
E JTextPane Bold Italic und Co AWT, Swing, JavaFX & SWT 6
M JTextPane Ende des Feldes AWT, Swing, JavaFX & SWT 4
D JTextPane - Text andersfarbig unterstreichen AWT, Swing, JavaFX & SWT 7
P Probleme mit JTextpane AWT, Swing, JavaFX & SWT 7
M Größe von JTextPane manuell bei Bedarf anpassen AWT, Swing, JavaFX & SWT 6
bugmenot JTextPane String stimmt nicht mit übergebenem String überein AWT, Swing, JavaFX & SWT 9
C JTextPane <br oder <p> statt \n AWT, Swing, JavaFX & SWT 2
C JTextPane HTML und eigene Tags AWT, Swing, JavaFX & SWT 10
G JTextPane durchsichtig? AWT, Swing, JavaFX & SWT 6
GilbertGrape Fehler bei HTML in JTextPane AWT, Swing, JavaFX & SWT 2
S JTextPane: Probem mit AlignmentAction AWT, Swing, JavaFX & SWT 3
B JTextPane und Image importieren in HTML String. AWT, Swing, JavaFX & SWT 2
J JTextPane mit genau 80 Zeichen breite definieren? AWT, Swing, JavaFX & SWT 3
J Html in JTextPane anzeigen? AWT, Swing, JavaFX & SWT 2
Steev JTextPane mit Textformatierung funktioniert nicht AWT, Swing, JavaFX & SWT 5
S JTextPane - markierten Text Formatieren AWT, Swing, JavaFX & SWT 11
P HTMLDocument in einem JTextPane. Anhängen von HTML-Code AWT, Swing, JavaFX & SWT 2
M Makierten Text in JTextPane zentrieren AWT, Swing, JavaFX & SWT 2
F JTextPane aktive Zeile AWT, Swing, JavaFX & SWT 2
G insert & JTextPane AWT, Swing, JavaFX & SWT 4
J JTextPane bekommt keinen Focus! AWT, Swing, JavaFX & SWT 3
S Farben eienr JTextPane dynamisch zuweisen AWT, Swing, JavaFX & SWT 2
R JTextPane scrollen vermeiden AWT, Swing, JavaFX & SWT 2
B Feste Breite einer JTextPane, die HTML anzeigt AWT, Swing, JavaFX & SWT 8
B Swing Logging: Ein/Ausblenden eines scrollenden JTextPane AWT, Swing, JavaFX & SWT 2
F Java JTextPane AWT, Swing, JavaFX & SWT 13
Saxony JTextPane - letzte Zeile löschen AWT, Swing, JavaFX & SWT 4
TheJavaKid LineWrap & WrapStyleWord in JTextPane AWT, Swing, JavaFX & SWT 3
G Zeilenabstand bei HTML-Texten in JLabel/JTextPane AWT, Swing, JavaFX & SWT 7
O Swing Xml highlightning mit JTextPane und Regular expressions AWT, Swing, JavaFX & SWT 5
J JTextPane Alignment AWT, Swing, JavaFX & SWT 6
Y entfernten String einer JTextPane per DocumentListener AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen

Neue Themen


Oben