Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : HTML formatierter TEXT hat keine Scrollbalken und keinen Zeilenumbruch



tomcom
10-11-2007, 17:11
Ich möchte gerne mit Java und Swing einen formatierten Text ausgeben.
Mir schien die Benutzung von HTML am sinnvollsten.

Mein Programm zeigt den Text an, aber man kann nicht scrollen.
Außerdem gibt es keinen automatischen Zeilenumbruch. Wie kann ich
diesen aktivieren.

Damit ich nicht mein ganzes Programm mitschiken muß, habe ich ein
Miniprogramm geschrieben, um den Fehler zu rekostruieren.

Könntet ihr mal einen Blick darauf werfen und mir sagen, was falsch
ist.

Vielen Dank im Voraus,
Thomas

QUELLTEXT:


import javax.swing.*;
import javax.swing.text.html.HTMLEditorKit;


public class HtmlV extends JPanel {
private static final long serialVersionUID = -5049101295205508494L;

public HtmlV() {
JEditorPane editPane = new JEditorPane();
editPane.setEditable(false);
HTMLEditorKit htmlkit = new HTMLEditorKit();
editPane.setEditorKit(htmlkit);
editPane.setAutoscrolls(true);
editPane.setText( //TODO: Scroll able machen
"<html><body><h2><font face=\"sans-serif\">Spielregeln</font></h2>"+
"<font face=\"sans-serif\">" +
"<ul>" +
"<li>Es wird auf einem Brett mit 8x8 Feldern gespielt.</li>" +
"<li>Als Startaufstellung werden vor dem Spielbeginn zwei weiße und zwei schwarze Steine auf die mittleren Felder " +
"des Bretts gelegt, je zwei diagonal gegenüberliegende mit der gleichen Farbe.</li>" +
"<li>Schwarz (Spieler 1) f&uuml;hrt den ersten Zug aus.</li>" +
"<li>Die Spieler ziehen abwechselnd. " +
"Man setzt entweder einen Stein mit der eigenen Farbe nach oben auf ein leeres Feld, oder man passt." +
"Passen ist aber nur erlaubt, wenn man keine legale Möglichkeit hat, einen Stein zu setzen.</li>" +
"<li>Man darf nur so setzen, dass ausgehend von dem gesetzten Stein in beliebiger Richtung " +
"(senkrecht, waagerecht oder diagonal) ein oder mehrere gegnerische Steine anschließen und " +
"danach wieder ein eigener Stein liegt. Es muss also mindestens ein gegnerischer Stein von dem gesetzten Stein " +
"und einem anderen eigenen Stein in gerader Linie eingeschlossen werden." +
"Dabei müssen alle Felder zwischen den beiden eigenen Steinen von gegnerischen Steinen besetzt sein.</li>" +
"<li>Alle gegnerischen Steine, die so eingeschlossen werden, wechseln die Farbe," +
"indem sie umgedreht werden. Dies geschieht als Teil desselben Zuges, bevor der Gegner zum Zug kommt." +
"Ein Zug kann mehrere Reihen gegnerischer Steine gleichzeitig einschließen, die dann alle umgedreht werden" +
" Wenn aber ein gerade umgedrehter Stein weitere gegnerische Steine einschließt, werden diese nicht umgedreht.</li>" +
"<li>Betrifft nur die Variante <i>Reversi</i>: wenn der Spieler A, der am Zug ist, seinen Steinvorrat aufgebraucht hat, aber noch Steine einschließen kann, der Gegner B aber in seinem nächsten Zug keine Steine einschließen kann, falls A passt, aber noch Steine in seinem Vorrat hat, dann erhält A für seinen Zug einen Stein von B.</li>" +
"<li>Wenn die Spieler unmittelbar nacheinander passen, wenn also keiner mehr einen Stein setzen kann, ist das Spiel beendet.</li>" +
"<li>Der Spieler, der am Ende die meisten Steine seiner Farbe auf dem Brett hat, gewinnt. Haben beide die gleiche Zahl, ist das Spiel unentschieden.</li>" +
"<li>Um die Höhe des Gewinns zu ermitteln, gibt es verschiedene Regelungen. Meist werden die Felder, die bei Spielende noch leer sind, dem Gewinner gutgeschrieben, also zu der Differenz der Steine-Anzahl addiert.</li>" +
"<li>Mit einer Zusatzregel, die oft in Japanischen Turnieren angewandt wird, kann man ein Unentschieden vermeiden: ein Spieler (der z.*B. ausgelost wird) legt fest, ob eine gleiche Steine-Anzahl am Partieende als Sieg für Weiß oder für Schwarz gewertet wird. Der andere Spieler wählt dann eine Farbe.</li>" +
"</ul>"+
"</font></body></html>"
);
add(new JScrollPane(editPane));

}

public static void main(String[] args) {
JFrame jf = new JFrame("HTML");
jf.add(new HtmlV());
jf.setSize(600,400);
jf.setVisible(true);
}

}

bischi
10-11-2007, 18:16
Aus der Java-API-Doku:



JScrollPane

public JScrollPane(Component view,
int vsbPolicy,
int hsbPolicy)

Creates a JScrollPane that displays the view component in a viewport whose view position can be controlled with a pair of scrollbars. The scrollbar policies specify when the scrollbars are displayed, For example, if vsbPolicy is VERTICAL_SCROLLBAR_AS_NEEDED then the vertical scrollbar only appears if the view doesn't fit vertically. The available policy settings are listed at setVerticalScrollBarPolicy(int) and setHorizontalScrollBarPolicy(int).

Parameters:
view - the component to display in the scrollpanes viewport
vsbPolicy - an integer that specifies the vertical scrollbar policy
hsbPolicy - an integer that specifies the horizontal scrollbar policy
See Also:
setViewportView(java.awt.Component)


MfG Bischi

tomcom
10-11-2007, 19:59
Daran liegt das Problem nicht. Aber es hat mich immerhin auf den richtigen weg gebracht. Die Lösung war, für das Panel ein Gridlayout (1,1) zu setzen.
Was jetzt noch fehlt, ist der automatische Zeilenumbruch.

Änderung der Main-Methode:

public static void main(String[] args) {
JFrame jf = new JFrame("HTML");
JScrollPane jscp = new JScrollPane(new HtmlV());
JPanel jp = new JPanel();
jp.setLayout(new GridLayout(1,1));
jp.add(jscp);
jf.add(jp);
jf.setSize(600,400);
jf.setVisible(true);
}

tomcom
11-11-2007, 10:27
Ich hab die Lösung durch viel rumprobieren gefunden.
:):):):)
Also für alle, die ähnliche Probleme haben, poste ich hier nocheinmal meinen Quelltext.
Wichtig ist, daß das JPanel, auf dem das JEditorPane liegt ein Layout wie z.b GridLayout(1,1) hat. Das JEditorPane wird zunächst nochmal auf ein JScrollPane gelegt. Dieses JScrollPane kommt dann auf das JPanel.


QUELLTEXT:


import java.awt.*;
import javax.swing.*;
import javax.swing.text.html.*;


public class HtmlV extends JPanel {
private static final long serialVersionUID = -5049101295205508494L;

public HtmlV() {
JEditorPane editPane = new JEditorPane();
editPane.setEditable(false);
editPane.setEditorKit(new HTMLEditorKit());
editPane.setAutoscrolls(true);
editPane.setText(getLongHtmlText());
setLayout(new GridLayout(1,1));
add(new JScrollPane(editPane));
}

public static void main(String[] args) {
JFrame jf = new JFrame("HTML");
jf.add(new HtmlV());
jf.setSize(600,400);
jf.setVisible(true);
}


static private String getLongHtmlText() {
return "<h2><font face=\"sans-serif\">Spielregeln</font></h2>"+
"<font face=\"sans-serif\">" +
"<ul>" +
"<li>Es wird auf einem Brett mit 8x8 Feldern gespielt.</li>" +
"<li>Als Startaufstellung werden vor dem Spielbeginn zwei weiße und zwei schwarze Steine auf die mittleren Felder " +
"des Bretts gelegt, je zwei diagonal gegenüberliegende mit der gleichen Farbe.</li>" +
"<li>Schwarz (Spieler 1) f&uuml;hrt den ersten Zug aus.</li>" +
"<li>Die Spieler ziehen abwechselnd. " +
"Man setzt entweder einen Stein mit der eigenen Farbe nach oben auf ein leeres Feld, oder man passt." +
"Passen ist aber nur erlaubt, wenn man keine legale Möglichkeit hat, einen Stein zu setzen.</li>" +
"<li>NOCH VIEL MEHR TEXT .................................</li> " +
"</ul>"+
"</font>";
}
}