私はいくつかのHTMLをレンダリングし、それにCSSスタイルシートを適用するためにJTextPane
を使用しようとしています。つまり、HTMLEditorKit
とStyleSheet
クラスを使用しています。私はあなたがこのデフォルトのスタイルシートのオブジェクトを変更した場合は、アプリケーションレベルでの変更(HTMLをレンダリングするすべてのコンポーネント)を適用しているように、すべてのHTMLEditorKits
は、同じデフォルトStyleSheet
インスタンスを共有することを知っています。JTextPane StyleSheetを適切に初期化する方法は、他のHTML対応コンポーネントがそのスタイルの影響を受けないようにする方法です。
しかし、私の例で私はデフォルトに基づいて自分のStyleSheet
インスタンスを作成し、これを回避していたと思いました。しかし、にのみ適用されるように意図されたスタイルシートに従ってレンダリングされるJTree
と表示されているように、これは機能しません。
import java.awt.*;
import javax.swing.*;
import javax.swing.text.html.*;
import javax.swing.tree.*;
public class TextPaneCssSpill extends JFrame {
private JTextPane textPane;
private JTree tree;
private JSplitPane splitPane;
public TextPaneCssSpill() {
HTMLEditorKit hed = new HTMLEditorKit();
StyleSheet defaultStyle = hed.getStyleSheet();
StyleSheet style = new StyleSheet();
style.addStyleSheet(defaultStyle);
style.addRule("body {font-family:\"Monospaced\"; font-size:9px;}");
style.addRule("i {color:#bababa; font-size:9px;}"); // gray italic
hed.setStyleSheet(style);
textPane = new JTextPane();
textPane.setEditorKit(hed);
textPane.setDocument(hed.createDefaultDocument());
DefaultMutableTreeNode root = new DefaultMutableTreeNode(new MyNode("name", "argument"), true);
root.add(new DefaultMutableTreeNode(new MyNode("name", "argument"), false));
root.add(new DefaultMutableTreeNode(new MyNode("name", "argument"), false));
root.add(new DefaultMutableTreeNode(new MyNode("name", "argument"), false));
root.add(new DefaultMutableTreeNode(new MyNode("name", "argument"), false));
tree = new JTree(root);
tree.setCellRenderer(new MyNodeTreeRenderer());
setLayout(new BorderLayout());
splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, textPane, tree);
add(splitPane);
pack();
setLocationRelativeTo(null);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new TextPaneCssSpill().setVisible(true);
}
});
}
private static class MyNode {
private final String name;
private final String argument;
public MyNode(String name, String argument) {
this.name = name;
this.argument = argument;
}
@Override
public String toString() {
return name + " " + argument;
}
}
private static class MyNodeTreeRenderer extends DefaultTreeCellRenderer {
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) {
super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);
if (value instanceof DefaultMutableTreeNode) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
if (node.getUserObject() instanceof MyNode) {
MyNode mynode = (MyNode) node.getUserObject();
setText("<html>" + mynode.name + " <i>" + mynode.argument);
}
}
return this;
}
}
}
アプリケーション全体で何のCSSのこぼれが(そのためのテキスト・ペインは、CSSによるレンダリング、まだ木にはない)がないように、どのように1は、適切に、これらのオブジェクトを初期化していますか?
注:上記画像における赤下線がこぼれの問題を示し、(いいえ、それはレンダラはない)後私が加えました。