Swing Optimale Höhe eine JTextPanes bei festgelegter Breite bestimmen

Nachtfalke

Aktives Mitglied
Hallo zusammen,

ich möchte in einer JTable mehrzeilige Zellen realisieren. Dafür packe ich ein JTextPane in die Zellen. Nun möchte ich das TextPane so dimensionieren, daß bei festgelegter Spaltenbreite die Höhe des TextPanes so eingestellt wird, daß der enthaltene Text genau hineinpaßt. Hat jemand eine Idee, wie ich das anstellen kann?
 

Michael...

Top Contributor
Grundsätzlich ist dazu ein TableCellRenderer basierend auf einem JTextPane notwendig. Auch die mehrzeilige Darstellung sollte damit funktionieren. Das einzige was Probleme machen könnte sind automatische Zeilenumbrüche. Im meine mich erinnern zu können, dass ich vor einigen Jahren damit gekämpft - und verloren - habe. Mit dem Ergebnis automatische Zeilenumbrüche nicht zu lassen und der Text dann "abgeschnitten" war.
 

Nachtfalke

Aktives Mitglied
Das mit dem CellRenderer ist klar. Habe ich auch schon implementiert. Mir geht es um das Setzen der optimalen Höhe bei fester Breite. Da fehlt mir der Ansatz.
 

Michael...

Top Contributor
Man kann die Komponente nach der PreferredSize "fragen" und dementsprechend die Höhe der Tabellenzeile setzen. Eventuell muss man vor die Größe setzen setSize(breitederTabellenspalte, Integer.MAX_Value)

Wichtig: Die Höhe der Tabellenspalte darf nur ausserhalb des Renderers gesetzt werden, sonst bekommt man ne Endlosschleife.
 

Nachtfalke

Aktives Mitglied
Funktioniert nicht. SetSize zeigt keine Wirkung. Lediglich wenn ich setMaximumSize verwendet, ändert sich die Breite des TextPanes. Dazu muss ich allerdings auch eine Höhe angeben.
 

bERt0r

Top Contributor
Es gibt die Funktion setRowHeight(int row,int height) im JTable:
Java:
table.setDefaultRenderer(Object.class, new TableCellRenderer()
		{
			JTextPane textPane=new JTextPane();
			@Override
			public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) 
			{
				if(value!=null)
				{
					textPane.setText(value.toString());
				}
				else
				{
					textPane.setText(null);
				}
				int height=textPane.getPreferredSize().height;
				if(table.getRowHeight(row)<height)
				{
					table.setRowHeight(row, height);
				}
				return textPane;
			}
			
		});
 

bERt0r

Top Contributor
Wenn du dir meinen Code angeschaut hättest, hättest du die Methode getPreferredSize bemerkt, welche dir genau das angibt was du suchst.
 

Nachtfalke

Aktives Mitglied
Sorry, mein Fehler. Ich hatte in der Hektik heute morgen nur die Überschrift gelesen. Ein weiteres Problem ist allerdings, daß der Text im JTextPane nicht vertikal zentriert wird, sondern am oberen Rand des Panes 'klebt'. Hast Du eventuell eine Idee, wie ich den vertikal mittig angezeigt bekommen kann?
 

KrokoDiehl

Top Contributor
Bezüglich der Textausrichtung hilft dir vielleicht dieser Link weiter.

Ansonsten frage ich mich, ob ein
Code:
setRowHeight()
im Renderer nicht auch zu einer Endlosschleife führt?
 

Nachtfalke

Aktives Mitglied
Vielleicht habe ich mich mit der Textausrichtung etwas missverständlich ausgedrückt. Ich habe folgende Konstellation:

Java:
public class textPaneTest {

  public static void main(String[] args) {

    final JTextPane pane = new JTextPane();

    pane.setText("Hello, World!");
    pane.insertIcon(new ImageIcon("myimage.png"));
    
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().add(pane, BorderLayout.CENTER);
    frame.setSize(360, 180);
    frame.setVisible(true);
  }
}

In diesem Beispiel werden Text und Icon immer am unteren Rand zueinander ausgerichtet. Ich möchte aber, daß sie horizontal mittig zueinander ausgerichtet werden. Das linke Bild zeigt das Ergebis, das der obige Code produziert. Das rechte Bild zeigt wie ich es gerne hätte.

btw: setRowHeight im Renderer macht keine Probleme.
 

KrokoDiehl

Top Contributor
Gut, dann passt zumindest das :)

Zu der Sache mit dem Bild ... ich denke schon dass man die Ausrichtung von Text / Bild wenn dann nur über die Attribute am Dokument ändern kann, wenn man das Bild einfügt. Wie genau da bin ich überfragt. Es klingt jedenfalls nicht nach einer einfache Übung.
Workaround wäre ggfs. das Bild auf Höhe der Schriftart zu skalieren, falls sowas von dir als Alternative gesehen wird.
 

Nachtfalke

Aktives Mitglied
Nein, daß ist leider keine Alternative. Den Weg über die Attribute hatte ich mir auch schon überlegt und etwas rumprobiert, aber bis jetzt keine Möglichkeit gefunden. :(
 

Nachtfalke

Aktives Mitglied
Es geht nicht darum, den Text an sich auszurichten, sondern den Text in Relation zum Icon auszurichten (s. angehängte Screenshots aus meinem vorigen Posting).
 

bERt0r

Top Contributor
Java:
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextPane;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.text.AbstractDocument;
import javax.swing.text.BoxView;
import javax.swing.text.ComponentView;
import javax.swing.text.Element;
import javax.swing.text.IconView;
import javax.swing.text.LabelView;
import javax.swing.text.ParagraphView;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledEditorKit;
import javax.swing.text.View;
import javax.swing.text.ViewFactory;

public class TextPaneTable extends JFrame
{
	
	private JPanel contentPane;
	private JTable table;
	
	/**
	 * Launch the application.
	 */
	public static void main(String[] args)
	{
		EventQueue.invokeLater(new Runnable()
			{
				public void run()
				{
					try
					{
						TextPaneTable frame = new TextPaneTable();
						frame.setVisible(true);
					} catch (Exception e)
					{
						e.printStackTrace();
					}
				}
			});
	}
	
	/**
	 * Create the frame.
	 */
	public TextPaneTable()
	{
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		contentPane.setLayout(new BorderLayout(0, 0));
		setContentPane(contentPane);
		
		JScrollPane scrollPane = new JScrollPane();
		contentPane.add(scrollPane, BorderLayout.CENTER);
		
		table = new JTable();
		table.setModel(new DefaultTableModel(
			new Object[][] {
				{"Hallo\nWelt", "Welt Hallo"},
				{"Welt", "Hallo"},
				{"Hallo \nHallo\nHallo\nWelt", "Welt"},
				{"Welt Hallo", "Hallo\n\n\nWelt"},
				{"Hallo\n\nWelt", "Welt"},
				{"Welt", null},
			},
			new String[] {
				"New column", "New column"
			}
		));
		scrollPane.setViewportView(table);
		table.setDefaultRenderer(Object.class, new TableCellRenderer()
		{
			JTextPane textPane=new JTextPane();
			{
				textPane.setEditorKit(new MyEditorKit());
			}
			@Override
			public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) 
			{
				if(value!=null)
				{
					textPane.setText(value.toString());
				}
				else
				{
					textPane.setText(null);
				}
				int height=textPane.getPreferredSize().height;
				if(table.getRowHeight(row)<height)
				{
					table.setRowHeight(row, height);
				}
				
				
				return textPane;
			}
			
		});
	}
	
	class MyEditorKit extends StyledEditorKit {

	    public ViewFactory getViewFactory() {
	        return new StyledViewFactory();
	    }
	 
	    class StyledViewFactory implements ViewFactory {

	        public View create(Element elem) {
	            String kind = elem.getName();
	            if (kind != null) {
	                if (kind.equals(AbstractDocument.ContentElementName)) {

	                    return new LabelView(elem);
	                } else if (kind.equals(AbstractDocument.ParagraphElementName)) {
	                    return new ParagraphView(elem);
	                } else if (kind.equals(AbstractDocument.SectionElementName)) {

	                    return new CenteredBoxView(elem, View.Y_AXIS);
	                } else if (kind.equals(StyleConstants.ComponentElementName)) {
	                    return new ComponentView(elem);
	                } else if (kind.equals(StyleConstants.IconElementName)) {

	                    return new IconView(elem);
	                }
	            }
	 
	            return new LabelView(elem);
	        }
	    }
	}
	 
	class CenteredBoxView extends BoxView {
	    public CenteredBoxView(Element elem, int axis) {

	        super(elem,axis);
	    }
	    protected void layoutMajorAxis(int targetSpan, int axis, int[] offsets, int[] spans) {

	        super.layoutMajorAxis(targetSpan,axis,offsets,spans);
	        int textBlockHeight = 0;
	        int offset = 0;
	 
	        for (int i = 0; i < spans.length; i++) {

	            textBlockHeight+= spans[i];
	        }
	        offset = (targetSpan - textBlockHeight) / 2;
	        for (int i = 0; i < offsets.length; i++) {
	            offsets[i] += offset;
	        }
	    }
	}
}
Und so siehts aus:
Anhang anzeigen 4175
 

Nachtfalke

Aktives Mitglied
Irgendwie habe ich das Gefühl, daß Du mich immernoch nicht verstehst. Wenn ich in Deinem Beispiel ein Icon einfüge, dann sieht das so aus wie in dem linken Bild. Ich möchte aber, daß es so aussieht wie in dem rechten Bild.
 

bERt0r

Top Contributor
Das ist nicht das Problem deiner Textpane, sondern deines Inhalts. Sowas kannst du z.B mit HTML erreichen, wenn du "<html><img src='http://www.java-forum.org/images/buttons/reply.gif' align=middle>Hallo Welt</body></html>" in deine Textpane gibst. Contenttype muss dann natürlich auf text/html gesetzt sein.
 

Nachtfalke

Aktives Mitglied
Habe ich auch schon in Erwägung gezogen. Geht aber in diesem Fall auch nicht, weil die entsprechenden PNG-Dateien in einem JAR-File verpackt sind.
 

bERt0r

Top Contributor
Wenn du nur einzeilige Texte hast, kannst du auch einfach ein JLabel mit icon und text in deine TextPane einfügen:
Java:
table.setDefaultRenderer(Object.class, new TableCellRenderer()
			{
				JTextPane textPane = new JTextPane();
				JLabel label=new JLabel();
				Icon icon;
				{
					try
					{
						icon=new ImageIcon(new URL("http://www.java-forum.org/images/buttons/reply.gif"));
						label.setIcon(icon);
					}
					catch(Exception e)
					{
						e.printStackTrace();
					}
				}
				@Override
				public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
						boolean hasFocus, int row, int column)
				{
					textPane.setText(null);
					if (value != null)
					{
						label.setText(value.toString());
						textPane.insertComponent(label);
					}
					int height = textPane.getPreferredSize().height;
					if (table.getRowHeight(row) < height)
					{
						table.setRowHeight(row, height);
					}
					
					return textPane;
				}
				
			});
 

Nachtfalke

Aktives Mitglied
Weiß ich. JLabels habe ich ja derzeit im Einsatz. Da das Ganze aber als eine Vorschau auf eine HTML-Ausgabe dienen soll, muss der Text umgebrochen werden, wenn er nicht in eine Zeile passt. Daher habe ich angefangen, mit JTextPanes zu experimentieren. Inzwischen habe ich diverse Probleme (Hintergrundfarbe, optimale Größe etc.) gelöst. Es hängt nur noch an der korrekten Ausrichtung des Textes zu den Icons.
 

bERt0r

Top Contributor
Für deine spezielle Anforderung wirst du wohl einiges in der JTextPane umschreiben müssen. Vielleicht hilft dir dieser link bei der Thematik: Table of Content
Es könnte aber auch möglich und vielleicht einfacher sein, ein Panel mit deinem gewünschten layout zu produzieren und das dann in die Textpane zu adden. Ist nur sehr umständlich und unschön.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
W JavaFX Button - optimale Breite berechnen AWT, Swing, JavaFX & SWT 1
W Swing Optimale Fenstergröße festlegen AWT, Swing, JavaFX & SWT 4
KrokoDiehl Swing Optimale Spaltenbreite auf Doppelklick (JTable) AWT, Swing, JavaFX & SWT 2
R JTextArea in JTable und die optimale Zeilenhöhe AWT, Swing, JavaFX & SWT 11
L Swing TextPanel Schrift untereinander und auf einer Höhe AWT, Swing, JavaFX & SWT 3
Jose05 Javafx Label Höhe=Breite AWT, Swing, JavaFX & SWT 1
sascha-sphw JavaFX ListCell höhe verändert sich beim ändern der Text-Farbe AWT, Swing, JavaFX & SWT 14
X JavaFX AreaChart area höhe wird nicht richtig dargestellt AWT, Swing, JavaFX & SWT 2
R Java FX - Fxml - relative Größenangaben für Breite und Höhe einer TextArea AWT, Swing, JavaFX & SWT 8
J JavaFX TableView - Höhe der Zeilen AWT, Swing, JavaFX & SWT 3
B JFreeChart Gantt Höhe Tasks AWT, Swing, JavaFX & SWT 1
Z Java Draw -JFrame finde nicht die Mitte & höhe, breite AWT, Swing, JavaFX & SWT 7
S SWT TableCell mit Composite als Inhalt / Höhe der Cell/Row AWT, Swing, JavaFX & SWT 5
T Swing JScrollPane in JPanel - Breite dynamisch, Höhe fix - wie? AWT, Swing, JavaFX & SWT 2
A LayoutManager Höhe von NORTH beim BorderLayout ändern AWT, Swing, JavaFX & SWT 4
M Wie ermittele ich die Breite und Höhe meines Displays in Pixel AWT, Swing, JavaFX & SWT 3
T LayoutManager GridBagLayout - zwei jTable mit unterschiedlicher Höhe AWT, Swing, JavaFX & SWT 2
P Höhe der TitleBar vom JFrame AWT, Swing, JavaFX & SWT 2
Landei Swing JToolbar: Textfelder mit normaler Höhe? AWT, Swing, JavaFX & SWT 2
T jpanel höhe netbeans.... AWT, Swing, JavaFX & SWT 5
J Problem mit der Höhe eines Panels AWT, Swing, JavaFX & SWT 11
G Swing Höhe des View eines JScrollPane fest auf Höhe des JScrollPane setzen! AWT, Swing, JavaFX & SWT 4
H LayoutManager Auf gleicher Höhe anordnen AWT, Swing, JavaFX & SWT 4
_dp jTextArea/jTextPanel Auto Höhe AWT, Swing, JavaFX & SWT 5
D JPanel höhe setzen AWT, Swing, JavaFX & SWT 2
H variable Höhe einer JTextArea (als Renderer/Editor) als Zelle einer JTable AWT, Swing, JavaFX & SWT 9
F Swing Höhe eines Headers einer JTable anpassen AWT, Swing, JavaFX & SWT 4
N Höhe einstellen JScrollPane AWT, Swing, JavaFX & SWT 3
F 2D-Grafik Problem mit höhe||breite eines JFrames AWT, Swing, JavaFX & SWT 4
G JTable Multiple Row Header Example - Probleme mit der Höhe der Zellen AWT, Swing, JavaFX & SWT 4
E Wie Breite und Höhe eines Panels festlegen? AWT, Swing, JavaFX & SWT 5
S Für Breite und Höhe werden 0.0 angezeigt AWT, Swing, JavaFX & SWT 2
C Swing JTextArea mit fester Breite und angepasster Höhe??? AWT, Swing, JavaFX & SWT 8
B Höhe eines Buttons festlegen AWT, Swing, JavaFX & SWT 7
G JList Höhe? AWT, Swing, JavaFX & SWT 2
P Breite und Höhe des contentPane abfragen AWT, Swing, JavaFX & SWT 3
Y Einzigartigkeit des GridBagLayout - individuelle Höhe/Breite AWT, Swing, JavaFX & SWT 4
S Tabelle soll sich auch in der Höhe resizen? AWT, Swing, JavaFX & SWT 4
T Breite des Containers ist gegeben - wie die Höhe berechnen? AWT, Swing, JavaFX & SWT 3
H JTabbedPane Höhe-Problem AWT, Swing, JavaFX & SWT 3
S [BorderLayout]WEST/EAST sollen über ganze Höhe gehen; AWT, Swing, JavaFX & SWT 3
G Linie nach Höhe einer Zahl zeichnen? AWT, Swing, JavaFX & SWT 3
A JTextFiled-Breite und Höhe ändern AWT, Swing, JavaFX & SWT 3
S Feste Breite und Höhe für einen formatierten Text. AWT, Swing, JavaFX & SWT 5
G Höhe eines JPanels ermittlen AWT, Swing, JavaFX & SWT 3
S JFrame Fenster höhe der Titelzeile? AWT, Swing, JavaFX & SWT 13
G Klasse Image - Höhe und Breite ermitteln AWT, Swing, JavaFX & SWT 12
B BorderLayout.WEST (JTree strecken in Höhe) AWT, Swing, JavaFX & SWT 2
D Jtable Header Höhe setzen ? AWT, Swing, JavaFX & SWT 2
B JEditorPane: Höhe für bestimmte Breite bestimmen AWT, Swing, JavaFX & SWT 4
M Höhe von eines Strings in Pixeln (nicht Höhe einer Zeile) AWT, Swing, JavaFX & SWT 12
K Höhe und Breite eines Panels im GridBagLayout ermitteln AWT, Swing, JavaFX & SWT 9
javasdann Höhe von Titlebar in jInternalFrame ändern AWT, Swing, JavaFX & SWT 5
J DefaultTableCellRenderer & Höhe AWT, Swing, JavaFX & SWT 3
D JLabel mit fester Breite und beliebiger Höhe AWT, Swing, JavaFX & SWT 4
O warum ist die Höhe meines JPanels 0? AWT, Swing, JavaFX & SWT 8
L wie kann man die Höhe und Breite von JList festlegen AWT, Swing, JavaFX & SWT 3
C Titel-Balken höhe?! AWT, Swing, JavaFX & SWT 4
C Höhe der Titelleiste in JInternalFrame AWT, Swing, JavaFX & SWT 4
jojoge wie kann ich in eine Benennung eines JButtons eine Variable einbauen? AWT, Swing, JavaFX & SWT 6
MartinNeuerlich Kann mir jemand, der einen Mac mit einem m1 oder m2-Chip hat, eine POM geben mit der Javafx-Fullscreen beim Mac mit m-Chip funktioniert? AWT, Swing, JavaFX & SWT 1
berserkerdq2 Buttons und Shapes sehen ja nach Screengröße klein oder zu groß aus, jemand eine Idee, was man tun kann? AWT, Swing, JavaFX & SWT 1
ExceptionOfExpectation Mit einer laufenden GUI Applikation eine Datei in dem Rechner löschen AWT, Swing, JavaFX & SWT 2
Jose05 Aus einer normalen Java Klasse eine FXML-Klasse laden AWT, Swing, JavaFX & SWT 12
_user_q Gibt es eine Möglichkeit, in Java alle möglichen Zeichen automatisch tippen zu lassen? AWT, Swing, JavaFX & SWT 13
J Ich kriege eine Fehler Messesage bei meinem Media Player AWT, Swing, JavaFX & SWT 8
I Einbindung eines jpg/png/icons in eine GUI AWT, Swing, JavaFX & SWT 1
mrbody234 ArrayList<Message> in eine TableView visualisieren AWT, Swing, JavaFX & SWT 2
U Gibt es eine Möglichkeit statt concatenate einen anderen Befehl zu nutzen? AWT, Swing, JavaFX & SWT 9
D Tastaturabfragen CTRL+t, CTRL+E bei eine JTable, bestehend aus JTextAteas AWT, Swing, JavaFX & SWT 4
G JavaFX Wert aus DB lesen, wenn erfolgreich automatisch eine fxml laden, möglich? AWT, Swing, JavaFX & SWT 2
Lukas2904 Wie speicher ich eine Einstellung? AWT, Swing, JavaFX & SWT 1
T Getter und Setter für eine Stage AWT, Swing, JavaFX & SWT 6
P Zwei JTables auf eine A4-Seite mit einstellbaren Rändern AWT, Swing, JavaFX & SWT 9
Monokuma 2D-Grafik Imageimport durch eine gezeichnete Form ersetzen AWT, Swing, JavaFX & SWT 16
M Eine Datei auf den Apache Server hochladen - über das Menü im JavaProgramm AWT, Swing, JavaFX & SWT 7
B JavaFX Warum wird hier eine NullPointer-Exception geworfen? AWT, Swing, JavaFX & SWT 7
VPChief Gibt es eine möglichkeit Dateien aus der jar datei zu kopieren? AWT, Swing, JavaFX & SWT 46
B Swing Sudoku: Laden / Speichern von Zahlen aus/in mehrere JTextFields aus/in eine(r) Textdatei AWT, Swing, JavaFX & SWT 9
P Swing Icon einfügen wirft eine Fehlermeldung AWT, Swing, JavaFX & SWT 3
F Variablen an eine Form binden? AWT, Swing, JavaFX & SWT 2
V Swing für jedes Kästchen eine eigene Farbe AWT, Swing, JavaFX & SWT 2
F Wie bekomme ich den Wert der ComboBox in eine Variable gespeichert welche ich für meinen ActionListener nutzen kann? AWT, Swing, JavaFX & SWT 3
W JavaFX Warum kriege ich eine Exception? AWT, Swing, JavaFX & SWT 23
karlmasutra JavaFX Zugriff auf eine erzeugte Scene aus einer anderen Klasse AWT, Swing, JavaFX & SWT 1
Informatiknoob AWT Zahlenraten (eine Zahl zwischen 1 und 10) AWT, Swing, JavaFX & SWT 1
A eine Fehler AWT, Swing, JavaFX & SWT 9
TheJavaKid Auf eine Zeichnung im Canvas reagieren AWT, Swing, JavaFX & SWT 13
A JavaFX Daten in eine HTML-Table mit JS schreiben AWT, Swing, JavaFX & SWT 3
B JavaFX TableView eine Zeile markieren AWT, Swing, JavaFX & SWT 5
J jButton soll nach klicken eine Variable um 1 erhöhen AWT, Swing, JavaFX & SWT 2
J Compiler in der JavaFX stop() Methode warten lassen bist eine Aktion in einer anderen Scene gemacht AWT, Swing, JavaFX & SWT 5
J Swing JavaProgramm für Verschlüssen für eine Datei AWT, Swing, JavaFX & SWT 19
xYurisha JLabel Text einer geöffneten Gui über eine andere Klasse ändern! AWT, Swing, JavaFX & SWT 3
J JavaFX Die Webview stellt eine Webseite nicht dar AWT, Swing, JavaFX & SWT 0
M JavaFX Ein Labeltext eine zeitlang anzeigen dann weiter machen AWT, Swing, JavaFX & SWT 3
F Event wenn Maus eine JList verlässt AWT, Swing, JavaFX & SWT 13
I JAVAFX - Übergabe der Inhalte an eine Scene - Wo ist der Vorteil gegenüber Swing? AWT, Swing, JavaFX & SWT 2
Joker4632 JFrame in eine Runnable auslagern? AWT, Swing, JavaFX & SWT 4
A JScrollPane soll JPanel mit JButtons enthalten und eine Scollbar anzeigen AWT, Swing, JavaFX & SWT 1

Ähnliche Java Themen

Neue Themen


Oben