Exception beim LineWrapping

Status
Nicht offen für weitere Antworten.

Arbon

Bekanntes Mitglied
Hallo. Ich hab ein JLabel, welches automatisch einen Zeilenumbruch implementieren soll. Ich habe dazu folgendes gefunden:
forums.sun.com/thread.jspa?threadID=623043&tstart=32519
Das besagte Programm funktioniert auch ohne Probleme. Wenn ich es aber in meinen Chat integrieren will, funktioniert es nicht mehr. Ich verwende die Klasse wie folgt:

PS: Die Klasse TextWrapper entspricht dem in der oberen Seite angegeben "class SizeTestLabel extends JLabel", lediglich der Konstruktor wurde abgeändert (Text wird nicht am Anfang festgelegt), was aber eigendlich keine Probleme verursachen sollte.

Code:
	/**
	 * The Class MyListRenderer.
	 */
	class MyListRenderer extends TextWrapper implements ListCellRenderer {

		public MyListRenderer() {
                        super();
			setOpaque(true);
		}

		/** The Constant serialVersionUID. */
		private static final long serialVersionUID = -6477398272501139124L;

		/*
		 * (non-Javadoc)
		 * 
		 * @see
		 * javax.swing.ListCellRenderer#getListCellRendererComponent(javax.swing
		 * .JList, java.lang.Object, int, boolean, boolean)
		 */
		public Component getListCellRendererComponent(JList list, Object value,
				int index, boolean isSelected, boolean cellHasFocus) {
			setSize(0, 25);
			changeText("<html>" + value.toString() + "</html>");
			try {
				if (!((ClientTextListObject) value).isHeader()) {
					setBackground(isSelected ? Color.blue : Color.white);
					setForeground(isSelected ? Color.white : Color.black);
				} else {
					setBackground(isSelected ? Color.blue : Color.lightGray);
					setForeground(isSelected ? Color.white : Color.red);
				}
			} catch (ClassCastException ex) {
				setBackground(isSelected ? Color.blue : Color.white);
				setForeground(isSelected ? Color.white : Color.black);
			}
			return this;
		}
	}

Dabei tritt immer folgende Exception auf:
Code:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at arm.chat.TextWrapper.findFontSize(TextWrapper.java:61)
	at arm.chat.TextWrapper.changeText(TextWrapper.java:82)
	at arm.chat.client.TextPanel$MyListRenderer.getListCellRendererComponent(TextPanel.java:69)
	at javax.swing.plaf.basic.BasicListUI.updateLayoutState(BasicListUI.java:1349)
	at javax.swing.plaf.basic.BasicListUI.maybeUpdateLayoutState(BasicListUI.java:1299)
	at javax.swing.plaf.basic.BasicListUI.getPreferredSize(BasicListUI.java:566)
	at javax.swing.JComponent.getPreferredSize(JComponent.java:1632)
	at javax.swing.ScrollPaneLayout.layoutContainer(ScrollPaneLayout.java:769)
	at java.awt.Container.layout(Container.java:1398)
	at java.awt.Container.doLayout(Container.java:1387)
	at java.awt.Container.validateTree(Container.java:1485)
	at java.awt.Container.validate(Container.java:1457)
	at javax.swing.RepaintManager.validateInvalidComponents(RepaintManager.java:670)
	at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:127)
	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
	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)
 

Arbon

Bekanntes Mitglied
wie bereits erwähnt wurde diese Methode von dem Link oben übernommen. Hier ist sie nochmal wie sie jetzt bei mir akutell aussieht:

Code:
package arm.chat;

import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.font.FontRenderContext;
import java.awt.font.LineBreakMeasurer;
import java.awt.font.TextAttribute;
import java.awt.font.TextLayout;
import java.text.AttributedCharacterIterator;
import java.text.AttributedString;
import javax.swing.JLabel;

public class TextWrapper extends JLabel
{
    /**
	 * 
	 */
	private static final long serialVersionUID = -4952477986216129011L;
	String text;
    Font font;
    final int PAD  = 20;
    final float SIZE = 6.0f;
 
    public TextWrapper()
    {
        font = new Font("lucida sans regular", Font.PLAIN, 24);
    }
 
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                            RenderingHints.VALUE_ANTIALIAS_ON);
        g2.setFont(font);
        FontRenderContext frc = g2.getFontRenderContext();
        AttributedString as = new AttributedString(text);
        as.addAttribute(TextAttribute.FONT, font);
        AttributedCharacterIterator iterator = as.getIterator();
        LineBreakMeasurer measurer = new LineBreakMeasurer(iterator, frc);
        float wrappingWidth = getWidth() - 2*PAD;
        float x = PAD, y = PAD;
        while(measurer.getPosition() < text.length())
        {
            TextLayout layout = measurer.nextLayout(wrappingWidth);
            y += layout.getAscent();
            float dx = layout.isLeftToRight() ?
                           0 : wrappingWidth - layout.getAdvance();
            layout.draw(g2, x + dx, y);
            y += layout.getDescent() + layout.getLeading();
        }
    }
 
    private void findFontSize()
    {
        int h = getHeight();
        float y = 0;
        Font lastFont = font;
        float size = SIZE;
        while(y + PAD <= h)
        {
            y = PAD;
            Font testFont = font.deriveFont(++size);
            Graphics2D g2 = (Graphics2D)getGraphics();
            g2.setFont(testFont);
            FontRenderContext frc = g2.getFontRenderContext();
            AttributedString as = new AttributedString(text);
            as.addAttribute(TextAttribute.FONT, testFont);
            AttributedCharacterIterator iterator = as.getIterator();
            LineBreakMeasurer measurer = new LineBreakMeasurer(iterator, frc);
            float wrappingWidth = getWidth() - 2*PAD;
            while(measurer.getPosition() < text.length())
            {
                TextLayout layout = measurer.nextLayout(wrappingWidth);
                y += layout.getAscent();
                y += layout.getDescent() + layout.getLeading();
            }
            if(y + PAD <= h)
                lastFont = testFont;
        }
        font = lastFont;
        repaint();
    }
 
    public void changeText(String s)
    {
        text = s;
        findFontSize();
    }
}
 

Arbon

Bekanntes Mitglied
g2.setFont(testFont);
also bei zeile 68

Wenn ich allerdings das Beispiel von dem Link dort oben compiliere, funktinoiert es :/. Ich hab ja eigendlich nicht wirklich as geändert daran.
 
G

Gast

Gast
Nur ein schnellschuss aber:

public TextWrapper()
{
font = new Font("lucida sans regular", Font.PLAIN, 24);
}

ich würde erstmal auch im Konstruktor der abgeleiteten Klasse den super()-Konstruktor aufrufen
Also

public TextWrapper()
{
super();!!!!!!!!!
font = new Font("lucida sans regular", Font.PLAIN, 24);
}

Vielleicht liegts ja daran
 

Arbon

Bekanntes Mitglied
leider nicht :/
Gäbe es vl noch alternativen zum JLabel, das eine Methode setLineWrap bietet, also eine Textkomponente? Die Vorraussetzung ist halt das es html tags beherrscht, auch den img-tag um smilies einzubinde.
 
G

Gast

Gast
Was ist überhaupt dein testFont, warum nicht gleich ein "richtiger Font", also dein Sans Serif.

Ansonsten bietet JTextArea nen LineWrap, aber weiss nicht wegen Html Bescheid
 
G

Gast

Gast
ahh egeal wegen dem testfont, hab jetzt verstanden worauf das hinauslaufen soll
 

Ebenius

Top Contributor
Anonymous hat gesagt.:
public TextWrapper()
{
super();!!!!!!!!!
font = new Font("lucida sans regular", Font.PLAIN, 24);
}
Ich weiß ja nicht, ob die Ausrufezeichen etwas daran ändern... ;-) Aber der Default-Super-Konstruktor wird implizit gerufen, wenn nichts anderes dasteht. Also: weglassen macht das gleiche.

Ursache des Problems
getGraphics() gibt null zurück. Warum ist das so? getGraphics() gibt immer null zurück, wenn die Komponente (noch) nicht displayable ist.

Im Beispiel aus dem Link wird changeText() bzw. findFontSize() von einem ActionListener ausgeführt. Das heißt, das passiert erst, wenn jemand einen Button drückt. In diesem Moment wird alles schon angezeigt und damit gibt getGraphics() auch ein Graphics-Objekt zurück.

In Deinem Beispiel wird changeText() bzw. findFontSize() aus einer getListCellRendererComponent()-Methode ausgeführt. Die Komponente hat zum Zeitpunkt des Aufrufs der Methode keinen vollständigen Hierarchybaum (also liegt nicht auf einem Window). Deswegen gibt es auch zu diesem Zeitpunkt keine Graphics-Instanz.

Lösung des Problems
Du kannst changeText() und findFontsize() um ein Graphics2D-Argument erweitern. In der Renderer-Methode holst Du Dir das Graphics-Objekt von der JList.

Mal sehen, ob ich recht habe...
 
G

Gast

Gast
Letzter Versuch :)
setz mal den Zugriffspezifiezierer von font auf protexted, weil du mit ableitung arbeitest wird das vielleiiicchhhht ja font nicht weitervererbt -> NullPointer

also:
public class TextWrapper extends JLabel
{
/**
*
*/
private static final long serialVersionUID = -4952477986216129011L;
PROTECTED String text;
PROTECTED Font font;
PROTECTD final int PAD = 20;
PROTECTD final float SIZE = 6.0f;
 
G

Gast

Gast
Ohh, deine Antwort noch nich gesehen, aber danke für den Hinweis mit dem super(), wusste ich nicht.

OK, Wettbewerb, mal sehen ob ich recht habe (;
 

Ebenius

Top Contributor
Anonymous hat gesagt.:
setz mal den Zugriffspezifiezierer von font auf protexted, weil du mit ableitung arbeitest wird das vielleiiicchhhht ja font nicht weitervererbt -> NullPointer
Vielleicht schneit's auch und das ist der Grund. ;-) Ich bin mir ziemlich sicher, dass meine Lösung oben stimmt... Arbon mach hin! Ich bin gespannt...
 
G

Gast

Gast
Wahrscheinlich habe ich nicht recht, wenn ich es mir recht überlege ):
 

Arbon

Bekanntes Mitglied
Ebenius hatte recht. Nacher kam noch ein Fehler, der ebenfalls damit zu tun hatte dass die Komponente noch nicht displayable war, aber den hab ich jetzt selber hingekriegt da ich nun ja wusste woran das liegt. Jetzt ist ein neues Problem, er stürzt zwar nicht ab aber es wird gar nix angezeigt. Ich mach jetzt aber schluss für heute und werde morgen schauen ob ich das vl noch selber hinbekomme.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Nullpointer Exception beim übertragen von Daten von Scene zu Scene AWT, Swing, JavaFX & SWT 6
J Exception beim JFrame erstellen AWT, Swing, JavaFX & SWT 6
L Java FX Exception beim start AWT, Swing, JavaFX & SWT 2
J ObservableList wirft exception beim zweiten füllen. AWT, Swing, JavaFX & SWT 4
S NullPointer Exception beim Laden von Bildern AWT, Swing, JavaFX & SWT 11
S Swing AWT-Exception bei JTable mit JComboBox beim Löschen der letzten Zeile AWT, Swing, JavaFX & SWT 3
Airwolf89 Swing Exception beim Füllen einer Tabelle AWT, Swing, JavaFX & SWT 10
O Probleme beim Zeichnen und AWT-Event-Queue-0 Exception AWT, Swing, JavaFX & SWT 5
A Null pointer exception beim Neuzeichnen AWT, Swing, JavaFX & SWT 4
H Exception: java.lang.ClassCastException AWT, Swing, JavaFX & SWT 2
M Seltsame Exception bei setVisible(true) Methode in einem JFrame AWT, Swing, JavaFX & SWT 2
T Exception in thread "main" java.lang.NoClassDefFoundError AWT, Swing, JavaFX & SWT 4
G Exception javafx Thread -> caused by removing children while in EventHandler AWT, Swing, JavaFX & SWT 28
beli3ver JavaFX Anwendung startet nicht, kann den Fehler nicht finden (Exception in Application start method) AWT, Swing, JavaFX & SWT 1
Z JavaFX Exception in Application start method AWT, Swing, JavaFX & SWT 2
J "Exception in thread "AWT-EventQueue-0"" Fehler AWT, Swing, JavaFX & SWT 3
B JavaFX Warum wird hier eine NullPointer-Exception geworfen? AWT, Swing, JavaFX & SWT 7
R AWT no such child Exception AWT, Swing, JavaFX & SWT 7
L JavaFX Exception nach includieren einer fxml // nested controller AWT, Swing, JavaFX & SWT 1
A Swing Exception in thread "AWT-EventQueue-0" AWT, Swing, JavaFX & SWT 1
W JavaFX Warum kriege ich eine Exception? AWT, Swing, JavaFX & SWT 23
S JavaFX Exception in thread "JavaFX Application Thread" AWT, Swing, JavaFX & SWT 3
L JavaFX JavaFX stürtzt durch einen Server#connect Exception AWT, Swing, JavaFX & SWT 3
ralfb1105 JavaFX Exception Message von Model Class via Controller in View darstellen AWT, Swing, JavaFX & SWT 39
S java.fxml.load.exception und keine automatische Aktualliseriung der Mainausgabe AWT, Swing, JavaFX & SWT 5
VfL_Freak AWT Exception in der Eventqueue AWT, Swing, JavaFX & SWT 8
A Swing Null Pointer Exception obwohl Objekt initialisiert AWT, Swing, JavaFX & SWT 21
X Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1 AWT, Swing, JavaFX & SWT 6
H JavaFX Ein View vorschalten Exception AWT, Swing, JavaFX & SWT 7
Q "AWT-EventQueue-0" Exception Problem AWT, Swing, JavaFX & SWT 4
M 3D-Grafik Mac Java 3D in Eclipse Exception AWT, Swing, JavaFX & SWT 0
L exception in thread awt-eventqueue-0 java.lang.nullpointerexception AWT, Swing, JavaFX & SWT 2
I Opencv Imgproc.floodfill exception AWT, Swing, JavaFX & SWT 1
S Swing Exception in thread "AWT-EventQueue-0" bei Jlabel AWT, Swing, JavaFX & SWT 4
T Gui Exception AWT, Swing, JavaFX & SWT 2
X Auf Fensterklasse zugreifen (Nullpointer Exception) AWT, Swing, JavaFX & SWT 2
M Threads - nicht erklärbare Exception AWT, Swing, JavaFX & SWT 6
M Bilder zeichnen, NullPointer Exception AWT, Swing, JavaFX & SWT 3
J Einträge aus Table löschen ohne Exception AWT, Swing, JavaFX & SWT 6
C Event Handling Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException AWT, Swing, JavaFX & SWT 43
V Swing Nullpointer Exception bei JFormattedTextField AWT, Swing, JavaFX & SWT 4
N Swing Exception: Comparison method violates its general contract! AWT, Swing, JavaFX & SWT 13
S Exception bei BufferStrategy AWT, Swing, JavaFX & SWT 8
H Swing Exception's und MVC AWT, Swing, JavaFX & SWT 35
R Swing Mit Swing eine throws Exception Methode öffnen AWT, Swing, JavaFX & SWT 3
M Exception in thread "Thread-3" java.lang.NullPointerException AWT, Swing, JavaFX & SWT 18
K AWT DataBuffer in DataBufferInt Exception AWT, Swing, JavaFX & SWT 2
lumo SWT Exception in thread "main" org.eclipse.swt.SWTError: No more handles AWT, Swing, JavaFX & SWT 3
O Immer Exception in AWT-EventQueue-0 AWT, Swing, JavaFX & SWT 5
F Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: null AWT, Swing, JavaFX & SWT 5
F Swing Seltsame Exception AWT, Swing, JavaFX & SWT 5
R Swing Files auflisten (JButton, JList, Exception) AWT, Swing, JavaFX & SWT 4
V LookAndFeel Nullpoint Exception AWT, Swing, JavaFX & SWT 2
hdi SWT Zwei mal Shell öffnen = Exception AWT, Swing, JavaFX & SWT 6
N Exception Behandlung mit setDefaultUncaughtExceptionHandler, insbesondere im EventDispatcher Thread AWT, Swing, JavaFX & SWT 4
O Exception bei repaint AWT, Swing, JavaFX & SWT 3
D Bild zeichnen lassen aus array, null pointer Exception AWT, Swing, JavaFX & SWT 2
B JTable ValueChanged verursacht Exception AWT, Swing, JavaFX & SWT 3
S Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException AWT, Swing, JavaFX & SWT 7
Daniel_L JTable, (Auto-)RowSorter und NullPointer-Exception AWT, Swing, JavaFX & SWT 6
M Exception in eine JTextArea anzeigen AWT, Swing, JavaFX & SWT 7
T Exception: Adding a window to a container AWT, Swing, JavaFX & SWT 14
G Kann mir jemand diese Exception erklaeren? AWT, Swing, JavaFX & SWT 8
T AWT Exception AWT, Swing, JavaFX & SWT 5
P Für mich unverständliche Exception AWT, Swing, JavaFX & SWT 3
N JList - Nullpointer Exception AWT, Swing, JavaFX & SWT 4
Lony AbstractTableModel Exception in thread "AWT-EventQueue- AWT, Swing, JavaFX & SWT 3
T Warum schmeißt das eine Exception? AWT, Swing, JavaFX & SWT 6
I EventDispatchThread Exception AWT, Swing, JavaFX & SWT 5
M Problem: "ArrayIndexOutOfBounds Exception" AWT, Swing, JavaFX & SWT 11
C Out of Bounds Exception, Array of JTextField AWT, Swing, JavaFX & SWT 6
B JTable Vector Exception bei eigenem CellEditor AWT, Swing, JavaFX & SWT 3
D Seltsame AWT-Exception AWT, Swing, JavaFX & SWT 2
M Button und Exception mit NetBeans AWT, Swing, JavaFX & SWT 3
P paint null pointer exception AWT, Swing, JavaFX & SWT 3
M Exception Meldung aus Thread an jTextField1 übergeben AWT, Swing, JavaFX & SWT 6
R DataVector bei TableModel - Class Cast Exception AWT, Swing, JavaFX & SWT 9
G Drag & Drop bzw. Data Transfer - Exception nach Drag AWT, Swing, JavaFX & SWT 1
K Exception mit "Unknown Source" AWT, Swing, JavaFX & SWT 5
Z jar-File mit SWT - Exception AWT, Swing, JavaFX & SWT 4
F Habe Problem mit dem Abfangen einer Exception AWT, Swing, JavaFX & SWT 10
V Null Pointer Exception bei JTextField setText AWT, Swing, JavaFX & SWT 25
T Programm funkt. nicht - Exception AWT, Swing, JavaFX & SWT 7
A Exception in thread "AWT-EventQueue-0" java.lang.N AWT, Swing, JavaFX & SWT 4
G Exception in JList oder JTextArea AWT, Swing, JavaFX & SWT 9
M java headless exception AWT, Swing, JavaFX & SWT 5
O Exception abfangen AWT, Swing, JavaFX & SWT 19
Juelin Problem beim Laden Controller AWT, Swing, JavaFX & SWT 2
O Swing Icon verschwindet beim Verschieben eines JLabels AWT, Swing, JavaFX & SWT 4
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 Wie greife ich auf ein Element zu, welches ich beim Scenebuilder erstellt habe AWT, Swing, JavaFX & SWT 10
H AWT Dialog Größe ändern - Schwarzer Inhalt beim groß ziehen AWT, Swing, JavaFX & SWT 1
L jComboBox Actionlistener wird beim erstmaligen Befüllen getriggert AWT, Swing, JavaFX & SWT 7
B Output GUI funktioniert nur beim ersten Mal richtig. AWT, Swing, JavaFX & SWT 4
A JavaFX exportierte Jar ohne beim starten die Libs hinzufügen? AWT, Swing, JavaFX & SWT 2
TheWhiteShadow JavaFX ListView Problem beim Entfernen von Elementen AWT, Swing, JavaFX & SWT 1
S Fehler beim Öffnen weiterer FXML AWT, Swing, JavaFX & SWT 11
I Probleme beim Drucken auf einen PDF-Drucker AWT, Swing, JavaFX & SWT 8
G Gui updated beim zweiten Aufruf nicht mehr AWT, Swing, JavaFX & SWT 15
K JavaFX Resizing-Problem beim BorderLayout (Center Component) beim Arbeiten mit mehreren FXMLs AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben