Swing Renderproblem bei HTML in einer JTextPane

renwal

Aktives Mitglied
Hi!

Ich würde euch gerne mal bei folgendem Problem um Hilfe bitten:
Und zwar habe ich für meine Lernplattform im Entwicklungsmodus eine Log-Ansicht, wo alles, was das Programm so tut, reingeschrieben wird. Für eine bessere Übersicht färbe ich die einzelnen Einträge mit HTML ein. Das zieht aber nach sich, das normale Zeilenumbrüche (\r\n) einfach ignoriert werden. Also versuche werden alle solchen Zeichen per replace() durch einen HTML-Zeilenumbruch (<br />) ersetzt. Da in das Log auch alle VM-Fehler geschrieben werden, habe ich keinen Einfluss auf die Art der Zeilenumbrüche und muss sie eben mit genannter Methode anschließend konvertieren.

Wenn ich das mache, dann passiert bei folgendem Code nichts:

Java:
entry.replace("\r\n", "<br />")

Bei folgendem Code wird zwar etwas angezeigt (auch so, wie es sein soll), jedoch erhalte ich manchmal (merkwürdigerweise jedoch nicht jedes mal) eine Fehlermeldung:

Java:
entry.replace("\r\n", "\r\n<br />")

Die Fehlermeldung dazu ist folgende:

Java:
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0
	at javax.swing.text.BoxView.getOffset(BoxView.java:1084)
	at javax.swing.text.BoxView.childAllocation(BoxView.java:678)
	at javax.swing.text.CompositeView.getChildAllocation(CompositeView.java:215)
	at javax.swing.text.BoxView.getChildAllocation(BoxView.java:436)
	at javax.swing.plaf.basic.BasicTextUI$UpdateHandler.calculateViewPosition(BasicTextUI.java:1979)
	at javax.swing.plaf.basic.BasicTextUI$UpdateHandler.layoutContainer(BasicTextUI.java:1955)
	at java.awt.Container.layout(Container.java:1421)
	at java.awt.Container.doLayout(Container.java:1410)
	at java.awt.Container.validateTree(Container.java:1507)
	at java.awt.Container.validateTree(Container.java:1513)
	at java.awt.Container.validateTree(Container.java:1513)
	at java.awt.Container.validate(Container.java:1480)
	at javax.swing.RepaintManager.validateInvalidComponents(RepaintManager.java:669)
	at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:124)
	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)

Die gesamte LogViewer-Klasse sieht wie folgt aus:

Java:
package debug;

import java.util.TimerTask;

public class LogViewer extends TimerTask {

    private int count = 0;
    private int level = 3;

    public LogViewer(int level)
    {
	this.level = level;
	slern.Schnecken_Lernprogramm.eventLogTP
		.setText("<html><body></body></html>");
    }

    @Override
    public void run()
    {
	final int size = LoggingSystem.getLogSize();
	if (size > count)
	{
	    int i = count;
	    for (; i < size; i++)
	    {
		final String entry = LoggingSystem.getLogEntry(i);
		final String subStr = entry.substring(15);
		String color = null;
		int currentLevel = 0;
		// Grad des Fehlers und Farbe festlegen
		// ANMERKUNG: Auf Level 0 muss nicht geprüft werden, das ist die
		// Standardeinstellung
		if (subStr.startsWith("FEHLER:"))
		{
		    currentLevel = 1;
		    color = "FF7F00";
		}
		else if (subStr.startsWith("WARNUNG:"))
		{
		    currentLevel = 2;
		    color = "FFE500";
		}
		else if (subStr.startsWith("INFO:"))
		{
		    currentLevel = 3;
		    color = "00E500";
		}
		else
		    color = "FF0000";

		System.out.println(subStr);

		if (currentLevel <= level)
		{
		    // Neuen Text für Anzeige generieren und setzen
		    final String oldText = slern.Schnecken_Lernprogramm.eventLogTP
			    .getText();
		    slern.Schnecken_Lernprogramm.eventLogTP.setText(oldText
			    .substring(0, oldText.length() - 14)
			    + "<font color=\"#"
			    + color
			    + "\">"
			    + (i + 1)
			    + ": "
			    + entry.replace("\r\n", "\r\n<br />")
			    + "</font><br /></body></html>");
		}
	    }
	    count = i;
	}
    }

    /**
     * Stellt das Level ein, ab dem Fehler aus dem Log auch in der JTextPane
     * angezeigt werden
     * 
     * @param level
     *            Das Level, ab dem Fehler angezeigt werden
     */
    public void setLevel(int level)
    {
	if (level < 0 || level > 3)
	    throw new IllegalArgumentException("Level out of range.");
	this.level = level;
    }
}

Habt ihr da eine Idee, woran das liegen könnte? Wäre super, wenn ihr dafür eine Lösung habt!
 
Zuletzt bearbeitet:

Ebenius

Top Contributor
Änderungen an einem Modell einer Komponente müssen immer im Event Dispatch Thread gemacht werden. So auch Änderungen an Dokumenten einer Textkomponente. Ansonsten kommt es von Zeit zu Zeit zu Fehlern.

Also in etwa so:
Java:
SwingUtilities.invokeLater(new Runnable() {
  @Override
  public void run() {
    // modify the text pane document here
  }
}));

Ebenius
 

Ebenius

Top Contributor
Eingebaut bei Dir sollte es in etwa so aussehen:
[java=53] if (currentLevel <= level)
{
// Neuen Text für Anzeige generieren und setzen
SwingUtilities.invokeLater(new Runnable() {

@Override
public void run() {

final String oldText = slern.Schnecken_Lernprogramm.eventLogTP
.getText();
slern.Schnecken_Lernprogramm.eventLogTP.setText(oldText
.substring(0, oldText.length() - 14)
+ "<font color=\"#"
+ color
+ "\">"
+ (i + 1)
+ ": "
+ entry.replace("\r\n", "\r\n<br />")
+ "</font><br /></body></html>");

}
});
}[/code]

Ebenius
 

renwal

Aktives Mitglied
Danke! Jetzt klappt es. Das Problem, dass nur Konstanten, nicht aber Variablen in der run()-Methode verarbeitet werden können (warum auch immer ???:L), habe ich jetzt einfach dadurch gelöst, dass ich die benötigten Variablen einfach vorher in eine Konstante kopiere, denn einfach auf final setzen geht wegen der for-Schleife nicht:

Java:
final String color1 = color;
final int i1 = i;

PS: Heißt das eigentlich, dass ich jeden setText()-Aufruf in den Event Dispatch Thread schieben muss?
 

GUI-Programmer

Top Contributor
So würde es auch gehen:

Plain Text zu Html:
Java:
String plainText = ""; //irgendein Pain Text
String htmText = plainText.replaceAll("(\r\n|\r|\n|\n\r)", "<br>");

Und umgekehrt, Html zu Plain Text:
Java:
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.util.Stack;
import java.util.logging.Logger;

import javax.swing.text.MutableAttributeSet;
import javax.swing.text.html.HTML;
import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.html.parser.ParserDelegator;

/**
 * Klasse HTML2Text
 * 
 * @author unknown
 * @version 19.10.2011
 * @see [url=http://stackoverflow.com/questions/240546/removing-html-from-a-java-string]Removing HTML from a Java String - Stack Overflow[/url]
 */
public class HTML2Text extends HTMLEditorKit.ParserCallback
{
  @SuppressWarnings("unused")
private static final Logger log = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME);

  private StringBuffer stringBuffer;

  private Stack<IndexType> indentStack;

  public static class IndexType
  {
    public String type;
    public int counter; // used for ordered lists
    public IndexType(String type)
    {
      this.type = type;
      counter = 0;
    }
  }

  public HTML2Text()
  {
    stringBuffer = new StringBuffer(); 
    indentStack = new Stack<IndexType>();
  }

  public static String convert(String html)
  {
    HTML2Text parser = new HTML2Text();
    Reader in = new StringReader(html);
    try
    {
      // the HTML to convert
      parser.parse(in);
    }
    catch (Exception e)
    {
      //log.severe(e.getMessage());
    }
    finally
    {
      try
      {
        in.close();
      }
      catch (IOException ioe)
      {
        // this should never happen
      }
    }
    return parser.getText();    
  }

  public void parse(Reader in) throws IOException
  {
    ParserDelegator delegator = new ParserDelegator();
    // the third parameter is TRUE to ignore charset directive
    delegator.parse(in, this, Boolean.TRUE);
  }

  public void handleStartTag(HTML.Tag t, MutableAttributeSet a, int pos)
  {
    //log.info("StartTag:" + t.toString());
    if (t.toString().equals("p"))
    {
      if (stringBuffer.length() > 0 && !stringBuffer.substring(stringBuffer.length() - 1).equals("\n"))
      {
        newLine();
      }
      newLine();
    }    
    else if (t.toString().equals("ol"))
    {
      indentStack.push(new IndexType("ol"));
      newLine();
    }    
    else if (t.toString().equals("ul"))
    {
      indentStack.push(new IndexType("ul"));
      newLine();
    }       
    else if (t.toString().equals("li"))
    {
      IndexType parent = indentStack.peek();
      if (parent.type.equals("ol"))
      {
        String numberString = "" + (++parent.counter) + ".";
        stringBuffer.append(numberString);
        for (int i = 0; i < (4 - numberString.length()); i++)
        {
          stringBuffer.append(" ");
        }
      }
      else
      {
        stringBuffer.append("*   ");
      }
      indentStack.push(new IndexType("li"));
    }  
    else if (t.toString().equals("dl"))
    {
      newLine();
    }
    else if (t.toString().equals("dt"))
    {
      newLine();
    }       
    else if (t.toString().equals("dd"))
    {
      indentStack.push(new IndexType("dd"));
      newLine();
    }       
  }

  private void newLine()
  {
    stringBuffer.append("\n");
    for (int i = 0; i < indentStack.size(); i++)
    {
      stringBuffer.append("    ");
    }    
  }

  public void handleEndTag(HTML.Tag t, int pos)
  {
    //log.info("EndTag:" + t.toString());
    if (t.toString().equals("p"))
    {
      newLine();
    }   
    else if (t.toString().equals("ol"))
    {
      indentStack.pop();;
      newLine();
    }    
    else if (t.toString().equals("ul"))
    {
      indentStack.pop();;
      newLine();
    }    
    else if (t.toString().equals("li"))
    {
      indentStack.pop();;
      newLine();
    }     
    else if (t.toString().equals("dd"))
    {
      indentStack.pop();;
    }      
  }

  public void handleSimpleTag(HTML.Tag t, MutableAttributeSet a, int pos)
  {
    //log.info("SimpleTag:" + t.toString());
    if (t.toString().equals("br"))
    {
      newLine();
    }
  }

  public void handleText(char[] text, int pos)
  {
    //log.info("Text:" + new String(text));
    stringBuffer.append(text);
  }

  public String getText()
  {
    return stringBuffer.toString();
  }

  public static void main(String args[])
  {
    String html = "<html><body><p>paragraph at start</p>hello<br />What is happening?<p>this is a<br />mutiline paragraph</p><ol>  <li>This</li>  <li>is</li>  <li>an</li>  <li>ordered</li>  <li>list    <p>with</p>    <ul>      <li>another</li>      <li>list        <dl>          <dt>This</dt>          <dt>is</dt>            <dd>sdasd</dd>            <dd>sdasda</dd>            <dd>asda              <p>aasdas</p>            </dd>            <dd>sdada</dd>          <dt>fsdfsdfsd</dt>        </dl>        <dl>          <dt>vbcvcvbcvb</dt>          <dt>cvbcvbc</dt>            <dd>vbcbcvbcvb</dd>          <dt>cvbcv</dt>          <dt></dt>        </dl>        <dl>          <dt></dt>        </dl></li>      <li>cool</li>    </ul>    <p>stuff</p>  </li>  <li>cool</li></ol><p></p></body></html>";
    System.out.println(convert(html));    
  }  

}
 

Ebenius

Top Contributor
PS: Heißt das eigentlich, dass ich jeden setText()-Aufruf in den Event Dispatch Thread schieben muss?
Ja, das heißt es. Und nicht nur das. Eigentlich alle GUI-Änderungen. Das wird oft nicht beachtet und das führt früher oder später zum Problem. Mehr Info im Sun Tutorial: Concurrency in Swing.

Die Variablen müssen final sein, weil anonyme Klassen so erstellt werden, dass alle von außen eingeschleppten lokalen Variablen über einen synthetischen Konstruktor übergeben werden. Damit das nicht zur Verwirrung führt (ich hab doch die Variable da unten noch verändert) müssen die Variablen im äußeren Kontext final sein.

Ebenius
 

renwal

Aktives Mitglied
Na super. Das darf doch nicht wahr sein, dass mein Java-Buch kein einziges Wort darüber verliert. Jetzt darf ich mein ganzes Projekt (eigentlich sogar mehrere) quasi von vorne anfangen. Was soll es eigentlich bringen, eine Anwendung so zu programmieren, dass das GUI nie "einfriert"? Es gibt nunmal Operationen, während deren Durchführung nicht auf Eingaben reagiert werden kann.
Gibt es das Problem bei AWT denn auch? Und wie soll man Echtzeit-abhängige Animationen im Event Dispatcher Thread ohne Verzögerung ausführen?
Ich gebe zu, dass ich gerade etwas frustriert bin.
 

Ebenius

Top Contributor
Nicht den Kopf hängen lassen. Das Problem hast Du eigentlich in jedem Widget Set… Du lagerst die wirklichen Änderungen in den EDT aus. Also in etwa sowas:
Java:
new Thread(new Runnable() {
  @Override
  public void run() {
    // Do some stuff
    SwingUtilities.invokeLater(new Runnable() {
      @Override
      public void run() {
        // update some GUI labels to report that you did something
      }
    });
    // Do more stuff
    SwingUtilities.invokeLater(new Runnable() {
      @Override
      public void run() {
        // update some GUI labels to report that you did something new
      }
    });
    // …
  }
}).start();
Das ganze kannst Du ein wenig auseinander dröseln. Manchmal bietet sich die SwingWorker-Klasse an, um solche Dinge zu kapseln.

Wenn man alle n Millisekunden nur etwas in der GUI ändern will (zum Beispiel so ein WAIT-Icon weiter drehen), dann kann man dafür auch super die javax.swing.Timer-Klasse verwenden (nicht verwechseln mit dem java.util.Timer), die feuert immer gleich auf dem EDT.

Viel Spaß!

Ebenius
 

renwal

Aktives Mitglied
Das klingt doch schonmal gut. Danke für das Beispiel!
Drei Fragen hätte ich da aber noch:
1. Was ist mit solchen Aufgaben, bei denen das GUI nicht reagieren darf? Wenn z.B. bei meiner Lernsoftware der Lese-Modus gestartet wird, dann darf man nicht irgendwas anderes anklicken können, während die Datensätze eingelesen werden. Dafür aber jedes Mal alle Komponenten auf disabled zu stellen sieht doch irgendwie blöd aus.
2. In dem Tutorial stand noch etwas von einem Initialisierungs-Thread. Ich habe bisher die Initialisierung immer so ablaufen lassen, dass zuerst eine Klasse startet, die eine Art Splash-Screen anzeigt und dann zwei Threads erzeugt, einer ruft dann einfach nur den Konstruktor der Klasse mit dem Hauptfenster auf, der andere ist ein Timer, der den Fortschrittsbalken aktualisiert. Sollte ich das ändern?
3. Was ist eigentlich mit dem Quelltext in einem ActionListener? Wird der quasi automatisch im entsprechenden Thread ausgeführt?
 

Ebenius

Top Contributor
1. Was ist mit solchen Aufgaben, bei denen das GUI nicht reagieren darf? Wenn z.B. bei meiner Lernsoftware der Lese-Modus gestartet wird, dann darf man nicht irgendwas anderes anklicken können, während die Datensätze eingelesen werden. Dafür aber jedes Mal alle Komponenten auf disabled zu stellen sieht doch irgendwie blöd aus.
Gibt mehrere Möglichkeiten. Zum Beispiel modalen Dialog drüber der den Ladestatus zeigt, oder Glasspane auf das JFrame und dort den Ladestatus zeigen…

2. In dem Tutorial stand noch etwas von einem Initialisierungs-Thread. Ich habe bisher die Initialisierung immer so ablaufen lassen, dass zuerst eine Klasse startet, die eine Art Splash-Screen anzeigt und dann zwei Threads erzeugt, einer ruft dann einfach nur den Konstruktor der Klasse mit dem Hauptfenster auf, der andere ist ein Timer, der den Fortschrittsbalken aktualisiert. Sollte ich das ändern?
Ja. Alle Komponenten im EDT erzeugen. Alle langwierigen Aktionen auslagern. Den Fortschrittsbalken natürlich wieder auf dem EDT aktualisieren.

Eine Swing-Anwendung sollte, meiner Meinung nach, am besten immer in dieser Art einsteigen:
Java:
/** Creates the GUI. Call on EDT, only! */
static void createAndShowGui() {
  final JFrame f = createTheFrameAndItsComponentsWithoutLoadingData();

  // option 1:
  // here you can start a thread or a swing worker that initializes data
  // directly after starting the thread you can show a splash screen FROM THIS
  // THREAD and dispose in the swing worker's done() method or from the forked
  // thread (encapsulated in a SwingUtilities.invoke... call)
  
  f.pack();
  f.setLocationRelativeTo(null);
  f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
  f.setVisible(true);
  
  // option 2:
  // same as option 1, if you want the data loaded and the splash screen
  // appear on top of the main frame while that is visible
}

/** @param args ignored */
public static void main(String[] args) {
  SwingUtilities.invokeLater(new Runnable() {

    public void run() {
      createAndShowGui();
    }
  });
}

3. Was ist eigentlich mit dem Quelltext in einem ActionListener? Wird der quasi automatisch im entsprechenden Thread ausgeführt?
Die theoretische Antwort ist: Das kommt einzig und allein darauf an, wer die Events verschickt. Die praktische Antwort lautet: So lange die Action Events von Standard-Swing-Komponenten kommen, dann sind sie auch auf dem EDT (es sei denn Du veränderst selbst die Komponenten von einem anderen Thread aus, was Du ja nicht tun solltest).
 

renwal

Aktives Mitglied
So, hab mir das gerade noch einmal angeschaut. Mein VE gibt mir folgendes vor:

Java:
// Startroutine
    public static void main(String[] args)
    {
	EventQueue.invokeLater(new Runnable() {
	    @Override
	    public void run()
	    {
		try
		{
		    LoggingSystem
			    .addLogEntry("INFO: Initialisiere Startfenster...");
		    frame = new Start();
		    frame.setVisible(true);
		    LoggingSystem.addLogEntry("INFO: Initialisierung beendet.");
		}
		catch (final Exception e)
		{
		    e.printStackTrace();
		    Fehlermeldung.protokoll(e);
		    // Log schließen und Programm beenden
		    try
		    {
			LoggingSystem.closeLogFile();
		    }
		    catch (final IOException io)
		    {
			io.printStackTrace();
			Fehlermeldung.protokoll(io);
		    }
		    System.exit(0);
		}
	    }
	});
    }

Also nicht
Java:
SwingUtilities.invokeLater(new Runnable())
sondern
Java:
EventQueue.invokeLater(new Runnable())
.

Ich gehe mal davon aus, dass das die AWT-Variante des ganzen Thread-Krams ist. Eigentlich sollte man sich doch für Swing oder AWT entscheiden, und nicht beides gleichzeitig benutzen. Warum wird denn dann dieser Code generiert, auch wenn ich im VE Swing auswähle?
 

Ebenius

Top Contributor
Vorab: So ist SwingUtilities.invokeLater() implementiert:
Java:
public static void invokeLater(Runnable doRun) {
  EventQueue.invokeLater(doRun);
}

Nicht AWT und Swing mischen… Das ist eine ungenaue (und dadurch falsche) Aussage. Swing basiert auf AWT. Die gesamte Event-Verarbeitung ist auch bei Swing AWT. Man soll lediglich keine nakten AWT-Komponenten mit Swing-Komponenten mischen.

Welche Methode Du benutzt ist Wurst.

Ebenius
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
izoards HTML Editor AWT, Swing, JavaFX & SWT 3
H setToolTipText ignoriert HTML-Formatierung des anzuzeigenden Strings AWT, Swing, JavaFX & SWT 4
Yonnig Lokale HTML-Datei in Java GUI rendern AWT, Swing, JavaFX & SWT 4
kodela HTML-tags für JLabel AWT, Swing, JavaFX & SWT 9
C HTML Editor Eingabemaske kafenio Ersatz AWT, Swing, JavaFX & SWT 7
A JavaFX Daten in eine HTML-Table mit JS schreiben AWT, Swing, JavaFX & SWT 3
T JTextPane ignoriert HTML Zeilenumbruch <br> tag wegen eigenem HTMLEditorKit AWT, Swing, JavaFX & SWT 5
E Java FX FXML Problem mit html Scriptausführung AWT, Swing, JavaFX & SWT 2
K Html Editor AWT, Swing, JavaFX & SWT 3
B Swing HTML in JLabels AWT, Swing, JavaFX & SWT 6
S jLabel HTML Formatierung AWT, Swing, JavaFX & SWT 2
B JavaFX Java FX Html Template AWT, Swing, JavaFX & SWT 0
F JavaFX JavaFX HTMLEditor-Eingabe in Textarea als HTML anzeigen AWT, Swing, JavaFX & SWT 2
D Swing Breite einer HTML Tabelle in einer JTextPane AWT, Swing, JavaFX & SWT 6
R Swing JTable : Header der Spalten ergänzen mit caption (wie bei html-table) AWT, Swing, JavaFX & SWT 2
I LookAndFeel HTML Auflösung - Online Editor programmieren AWT, Swing, JavaFX & SWT 2
T HTML mit Java AWT, Swing, JavaFX & SWT 1
U Label zeigt nicht überall HTML Zeichen AWT, Swing, JavaFX & SWT 3
N JLabel HTML mit custom Font AWT, Swing, JavaFX & SWT 0
H RCP(SWT) Browser-Widget zeigt keine locale HTML-Dateien an AWT, Swing, JavaFX & SWT 1
F Submit eines HTML-Formulars in Vaadin AWT, Swing, JavaFX & SWT 3
T Swing HTML Text aus JLabel ohne "HTML-Tags" in String einlesen AWT, Swing, JavaFX & SWT 5
J JApplet, HTML und access denied exitVM.0 AWT, Swing, JavaFX & SWT 3
L Swing JToogleButton Vordergrundfarbe bei HTML String AWT, Swing, JavaFX & SWT 4
H Swing JApplet - HTML - ClassNotFoundException AWT, Swing, JavaFX & SWT 7
G Swing HTML Version AWT, Swing, JavaFX & SWT 11
S HTML in Java einbinden AWT, Swing, JavaFX & SWT 4
B JEditorPane lädt keine Schriftfarbe in HTML AWT, Swing, JavaFX & SWT 2
J JEditorPane mit HTML füllen AWT, Swing, JavaFX & SWT 2
N Swing JTree TreeCellRenderer mit html und automatischen Zeilenumbruch AWT, Swing, JavaFX & SWT 8
N Swing KomponentenHöhe an html-Inhalt anpassen AWT, Swing, JavaFX & SWT 4
F Applet JApplet per html einbinden - Main class kann nicht gefunden werden AWT, Swing, JavaFX & SWT 15
C html browser in Application nutzen AWT, Swing, JavaFX & SWT 10
S SWT Anzeigen einer lokalen HTML-Seite im Browser Widget über RAP nicht möglich AWT, Swing, JavaFX & SWT 3
S HTML Syntaxhighlighting AWT, Swing, JavaFX & SWT 7
S SWT HTML-WYSIWUG-Editor AWT, Swing, JavaFX & SWT 3
N Swing JTextPane zur Anzeige von HTML AWT, Swing, JavaFX & SWT 2
N Applet JButton soll html Datei aus einem Ordner öffnen AWT, Swing, JavaFX & SWT 2
H JScrollPane - JEditorPane und HTML-Tabelle AWT, Swing, JavaFX & SWT 2
H Swing JEditorPane und HTML AWT, Swing, JavaFX & SWT 3
D System.out.println() gibt html-Tags mit aus AWT, Swing, JavaFX & SWT 2
P Swing HTML-Renderer AWT, Swing, JavaFX & SWT 15
G Swing JCheckBox, setEnabled(false) und HTML Text Problem AWT, Swing, JavaFX & SWT 5
J 2D-Grafik Html in drawString() AWT, Swing, JavaFX & SWT 2
L Applet In HTML einbinden klappt einfach nicht AWT, Swing, JavaFX & SWT 5
X Frei nutzbarer HTML Editor AWT, Swing, JavaFX & SWT 13
B WYSIWYG-HTML-Editor / Validator für JAVA AWT, Swing, JavaFX & SWT 2
N JCombobox wie in HTML AWT, Swing, JavaFX & SWT 6
H Swing HTML in einem JEditorPane zeilenweise hinzufügen ohne Inhalt jedes Mal neu zu laden AWT, Swing, JavaFX & SWT 4
G Swing JEdtitorPane und HTML Image Seite AWT, Swing, JavaFX & SWT 2
C Swing JTextPane zeigt HTML-Text aus Variable nicht an :( AWT, Swing, JavaFX & SWT 3
P Swing html mit bilder drin AWT, Swing, JavaFX & SWT 12
destroflyer Wort im JLabel verlinken (per HTML) AWT, Swing, JavaFX & SWT 3
R Swing JTextComponent und HTML AWT, Swing, JavaFX & SWT 7
D Nodes eines statischen JTrees sollen auf Anker (Textmarken) in einer HTML-Datei zeigen AWT, Swing, JavaFX & SWT 8
S Swing HTML-Text in JEditorPane einfärben AWT, Swing, JavaFX & SWT 5
D Darstellung in Swing wie HTML? AWT, Swing, JavaFX & SWT 2
H Mit JLabel HTML - formatierten Text anzeigen AWT, Swing, JavaFX & SWT 14
M Swing Kein update bei simulierten HTML-Link AWT, Swing, JavaFX & SWT 4
B Grafiken in JLabel mittels html AWT, Swing, JavaFX & SWT 5
E Swing JTextPane Inhalt(Text und Bilder) als HTML text bekommen AWT, Swing, JavaFX & SWT 3
B JEditorPane - Text und Graphik in HTML speichern AWT, Swing, JavaFX & SWT 4
K Alternative zu Applet mit HTML-Einbindung AWT, Swing, JavaFX & SWT 11
D Swing JEditorPane mit HTML aber ohne Bilder AWT, Swing, JavaFX & SWT 3
S Swing Text -> HTML: Caret-Koordinaten verschoben AWT, Swing, JavaFX & SWT 6
S JEditorPane soll HTML und dann Text anzeigen..? AWT, Swing, JavaFX & SWT 5
T HTML und JEditorPane AWT, Swing, JavaFX & SWT 6
J JList & HTML AWT, Swing, JavaFX & SWT 2
T HTML Seite neu laden mittels Applet AWT, Swing, JavaFX & SWT 2
N Performanceprobleme mit JLabel und HTML content AWT, Swing, JavaFX & SWT 5
A Oberfläche wir mit html-Frames aufbauen AWT, Swing, JavaFX & SWT 11
C JTextPane HTML und eigene Tags AWT, Swing, JavaFX & SWT 10
W HTML-Text mit relativer URL in JEditorPane einlesen AWT, Swing, JavaFX & SWT 10
C Suche fertigen HTML editor AWT, Swing, JavaFX & SWT 2
B HTML in Swing Components (JLabel) AWT, Swing, JavaFX & SWT 7
M JEditorPane lädt HTML ohne Bilder AWT, Swing, JavaFX & SWT 2
M JEditorPane lädt HTML ohne Bilder AWT, Swing, JavaFX & SWT 2
G Hilfe beim Erstellen eines eigenen Html-Editors! AWT, Swing, JavaFX & SWT 4
S drawString für HTML-Text? AWT, Swing, JavaFX & SWT 7
G Frage zu Labels mit html AWT, Swing, JavaFX & SWT 3
P HTML darstellen mit Java AWT, Swing, JavaFX & SWT 4
GilbertGrape Fehler bei HTML in JTextPane AWT, Swing, JavaFX & SWT 2
ARadauer swing html wysiwyg componente AWT, Swing, JavaFX & SWT 6
V "Anker" wie in HTML für JScrollPane? AWT, Swing, JavaFX & SWT 2
M html im Titel von JFrame AWT, Swing, JavaFX & SWT 9
M html aus einem Stream Laden und Anzeigen AWT, Swing, JavaFX & SWT 4
T Öffnen von SWT-Dialogboxen durch HTML-Link in HTML-Code AWT, Swing, JavaFX & SWT 4
B JTextPane und Image importieren in HTML String. AWT, Swing, JavaFX & SWT 2
J Html in JTextPane anzeigen? AWT, Swing, JavaFX & SWT 2
V Swing to HTML? AWT, Swing, JavaFX & SWT 4
A HTML-Datei öffnen AWT, Swing, JavaFX & SWT 3
A Noch mal Zusammenarbeit Java und HTML AWT, Swing, JavaFX & SWT 4
A Java und HTML AWT, Swing, JavaFX & SWT 8
R HTML Hintergrund für Swing - Componenten AWT, Swing, JavaFX & SWT 2
G Problem mit Anzeige von HTML AWT, Swing, JavaFX & SWT 5
G Probleme mit Druck von pdf und html AWT, Swing, JavaFX & SWT 2
DeeDee0815 JEditorPane + HTML + <img src=file> + JAR = FALSE AWT, Swing, JavaFX & SWT 3
F HTML anzeigen AWT, Swing, JavaFX & SWT 3
P HTMLDocument in einem JTextPane. Anhängen von HTML-Code AWT, Swing, JavaFX & SWT 2
G Komplexe HTML-Seiten mit Swing Browsen AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen

Neue Themen


Oben