Text in JTextPane vertikal (!) zentrieren

T

TobyNick

Gast
Hallo Leute,
ich verzweifel bald -.- Ich habe schon so viel dazu gesucht und schon scheinbar Lösungen, die dann doch nicht so wollten, wie ich. Und falls es hier doch noch schon ein Thema dazu geben sollte, dann bitte ich das zu entschuldigen. :)
Also hier mein Problem (ich erklärs mal ausführlich):

Ich habe ein Fenster (JFrame), das ich in 3 Teile gleichgroße Teile vertikal aufteilen will. Das geht ja ganz gut mit dem GridLayout (new GridLayout(3, 1)). In das unterste Teil, sollen ein paar Buttons (das ist nicht das Problem). In den zwei oberen Teilen, soll - unabhängig voneinander - Text dargestellt werden. Also sollen die beiden Teile gleich funktionieren, und somit haben sie das gleiche problem, deswegen erklär ich es jetzt nur für einen teil. ;-)
Und zwar soll der Text so dargestellt werden, dass er in der Mitte steht (horizontal und vertikal zentriert). Das horizontale kriege ich hin: Ich lasse den Text in einem JTextPane darstellen und setze StyleConstants.setAlignment auf StyleConstants.ALIGN_CENTER.
Die vertikale Zentrierung soll jetzt so geschehen: Zuerst müsst ihr wissen, dass der Text immer unterschiedlich sein kann. Mal über mehrere Zeilen, mal nur eine Zeile. Also, wenn es nur eine Zeile ist, dann soll es einfach in der Mitte stehen. Wenn der Text über mehrere Zeilen geht, soll er weiterhin zentriert bleiben (sich sozusagen nach unten und nach oben gleichzeitig ausbreiten und nicht nur nach unten). Und wenn er dann noch so lang wird, dass er nicht mehr in diesen drittel Fensterteil passt, dann soll gescrollt werden (mit JScrollPane kann man das ja machen). Mein Problem ist nur das es genau so funktionieren soll. Ich habe schon Tips gelesen mit GridBagLayout oder BoxLayout (und dann oberhalb und unterhalb des Textes ein verticalGlue). Aber das hat alles nichts gebracht im Hinblick auf dieses spezielle Problem. Die Sache ist halt das das JTextPane merken muss, wenn der Text über den Rand hinausgeht, dass es sich dann vergrößert und wenn es merkt, dass es sich nicht mehr vergrößern kann, weil es an den Rand stößt, dass dann der JScrollPane zum Einsatz kommt. Ich hoffe ihr versteht, was ich meine. Entschuldigt den langen Text. :) Ich mein es kann doch nicht so schwer sein einen Text mittig darzustellen. -.-

Danke schon mal für jede Hilfe :)
 

ellessedil

Mitglied
Hi,
interessantes Problem.
Meine Lösung ist vielleicht nicht schön, aber meiner Meinung nach elegant ;o).
Dein Vorschlag in Richtung des GridBagLayouts war schon richtig, wobei in diesem Fall die Klasse Box das viel einfacher erledigt. Der Text wird zwar nicht durch die TextPane zentriert, aber "who cares?" ;o)

Hier die Lösung.
Java:
import java.awt.Color;
import java.awt.Dimension;
import java.util.Timer;
import java.util.TimerTask;

import javax.swing.Box;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyleContext;

public class StandInTheMiddle extends JPanel {
	private static final long serialVersionUID = 7643726218850672636L;

	public StandInTheMiddle() {
		Box box = Box.createVerticalBox();

		JScrollPane sp = new JScrollPane(box);
		sp.setPreferredSize(new Dimension(320, 240));
		sp.getViewport().setBackground(Color.WHITE);

		box.add(Box.createVerticalGlue());

		StyleContext.NamedStyle centerStyle = StyleContext.getDefaultStyleContext().new NamedStyle();
		StyleConstants.setAlignment(centerStyle, StyleConstants.ALIGN_CENTER);

		final JTextPane tp = new JTextPane();
		tp.setLogicalStyle(centerStyle);
		tp.setText("Erste Zeile.");

		box.add(tp);

		tp.setMaximumSize(new Dimension(sp.getPreferredSize().width, 50));

		box.add(Box.createVerticalGlue());
		
		add(sp);
		
		Timer t = new Timer();
		t.schedule(new TimerTask() {
			
			@Override
			public void run() {
				tp.setText(tp.getText() + "\n eine Zeile mehr");			
			}
		}, 3000, 1000);
	}

	public static void main(String[] args) {
		JFrame frame = new JFrame("TextFrame");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		frame.getContentPane().add(new StandInTheMiddle());

		frame.pack();

		frame.setLocationRelativeTo(null);
		frame.setVisible(true);
	}
}
 
T

TobyNick

Gast
DANKE! Es funktioniert!
Nur eine Sache noch nicht. Die kannst du auch an deinem Programm testen. Kommentier mal die Timer-Zeilen aus (die sind jetzt nicht wichtig). Und gib bei tp.setText irgendwas ganz langes ein, ohne Zeilenumbruch. Also ein ganz langes Wort sozusagen und ganz spät erst ein leerzeichen oder zeilenumbruch. Z.b. "sdghiusdfgiusdfhgisudhfuasifhdasifuhdsiuvhiguhdfibuhsdicuhsivuhdfviuhdcisuahfgiurenhuvinfi \n sdfjiugjfgiufgjiugs"
Dann ist das ein bisschen komisch. Wüsstest du woran das liegt? Oder was man dagegen tun kann?
 

ellessedil

Mitglied
ja es liegt an der von mir gelobten Box ;o) Die verändert warum auch immer die Breite durch den überlangen String.
Wenn Du die PreferredSize der Box änderst, bekommst dieses Problem in den Griff, aber dadurch bekommst Du einige andere...
Die Box macht mir schon immer Schwierigkeiten, wenn man dort feste Werte vergibt...
Leider muss ich grad weg, schaue auch erst morgen wieder hier rein. Aber schau mal unter:
How to Use BoxLayout (The Java™ Tutorials > Creating a GUI With JFC/Swing > Laying Out Components Within a Container)

Vielleicht hilft das, ansonsten schau ich morgen nochmal danach.
 

ellessedil

Mitglied
ok, also das Problem ist, dass das Boxlayout penibel auf Preferred und Max-Size reagiert. Mit diesem überlangen String reagiert die PreferredSize der TextPane auf einen X-Wert, der die Anzeige des Strings in einer Zeile ermöglicht. Daher wurde auch die Box größer. Hab bissl rumgewurschtelt und es ein wenig andersherum probiert. In meinem Beispiel hast Du nun eine Box, die eine JScrollPane mit VerticalGlue umspannt, um sie in der Mitte zu halten. Solange der Text "größer" wird, passe ich die Größe der ScrollPane bis zu ihrem Maximum an, was den gewünschten Effekt bringt, aber irgendwie nicht mehr ganz so schön ist. Das Borderlayout drumherum kann man irgendwie auch nicht weglassen, manchmal ist mir Java ein Rätsel ;o)
Code:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.util.Timer;
import java.util.TimerTask;

import javax.swing.Box;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyleContext;

public class StandInTheMiddle extends JPanel {
	private static final long serialVersionUID = 7643726218850672636L;

	int maxWidth = 320;
	int maxHeight = 240;

	public StandInTheMiddle() {
		setPreferredSize(new Dimension(maxWidth, maxHeight));

		setLayout(new BorderLayout());

		final Box box = Box.createVerticalBox();

		box.add(Box.createVerticalGlue());

		StyleContext.NamedStyle centerStyle = StyleContext.getDefaultStyleContext().new NamedStyle();
		StyleConstants.setAlignment(centerStyle, StyleConstants.ALIGN_CENTER);

		final JTextPane tp = new JTextPane();
		tp.setBackground(Color.blue);
		tp.setMaximumSize(new Dimension(maxWidth - 5, 50));
		tp.setLogicalStyle(centerStyle);

		tp.setText("sdghiusdfgiusdfhgisudhfuasifhdasifuhdsiuvhiguhdfibuhsdicuhsivuhdfviuhdcisuahfgiurenhuvinfi \n sdfjiugjfgiufgjiugs ");

		tp.repaint();
		tp.revalidate();

		final JScrollPane sp = new JScrollPane(tp);
		sp.setMaximumSize(new Dimension(maxWidth, 240));
		sp.getViewport().setBackground(Color.WHITE);

		box.add(sp);

		box.add(Box.createVerticalGlue());

		add(box, BorderLayout.CENTER);

		Timer t = new Timer();
		t.schedule(new TimerTask() {

			@Override
			public void run() {
				tp.setText(tp.getText() + "\n eine Zeile mehr");

				box.revalidate();
			}
		}, 3000, 1000);
	}

	public static void main(String[] args) {
		JFrame frame = new JFrame("TextFrame");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		frame.getContentPane().add(new StandInTheMiddle());
		frame.pack();

		frame.setLocationRelativeTo(null);
		frame.setVisible(true);
	}
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Swing JTextPane, Bilder und Text-flow AWT, Swing, JavaFX & SWT 2
E Swing jTextPane Text datei anzeigen AWT, Swing, JavaFX & SWT 7
C Swing JTextPane zeigt HTML-Text aus Variable nicht an :( AWT, Swing, JavaFX & SWT 3
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
D JTextPane - Text andersfarbig unterstreichen AWT, Swing, JavaFX & SWT 7
S JTextPane - markierten Text Formatieren AWT, Swing, JavaFX & SWT 11
M Makierten Text in JTextPane zentrieren AWT, Swing, JavaFX & SWT 2
D JTextPane Text anklickbar machen bzw. Hyperlink erstellen? AWT, Swing, JavaFX & SWT 5
F Vertikaler Text in einem JTextPane AWT, Swing, JavaFX & SWT 3
D Text in JTextPane vergrößern AWT, Swing, JavaFX & SWT 12
M JTextPane schreibt keinen farbigen Text! AWT, Swing, JavaFX & SWT 7
P JTextPane ALIGN_JUSTIFIED zeigt den Text zentriert an? AWT, Swing, JavaFX & SWT 8
0 Mehrfarbigen Text in JTextPane einfügen AWT, Swing, JavaFX & SWT 2
N JTextPane und Text zu bereits existierenden Text hinzufügen? AWT, Swing, JavaFX & SWT 8
Z JTextPane (text/html): Schrift festlegen AWT, Swing, JavaFX & SWT 5
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
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

Ähnliche Java Themen

Neue Themen


Oben