私のJTextPaneの1行から次の行に灰色と白を交互に背景として使用したいと思います。 私はpaintComponent()メソッドをオーバーロードし、コンポーネントの高さに応じて背景を手動で描画することでフォントサイズを試みましたが、成功しませんでした。JTextPaneの行にカスタム背景色を設定するには
ヒント
私のJTextPaneの1行から次の行に灰色と白を交互に背景として使用したいと思います。 私はpaintComponent()メソッドをオーバーロードし、コンポーネントの高さに応じて背景を手動で描画することでフォントサイズを試みましたが、成功しませんでした。JTextPaneの行にカスタム背景色を設定するには
ヒント
this questionに応答して、@ VonCによって書かれたラインハイライター(またはhere)を使用できます。次のようにあなたがそれを使用することができます別のライン強調するために
:ここ
public static void main(String[] args) {
JTextPane t = new JTextPane();
t.setSelectionColor(new Color(1.0f, 1.0f, 1.0f, 0.0f));
Highlighter hilite = new MyHighlighter();
t.setHighlighter(hilite);
t.setText("Line1\nLine2\nLine3\nLine4\nLine5\n");
DefaultHighlightPainter whitePainter = new DefaultHighlighter.DefaultHighlightPainter(Color.WHITE);
DefaultHighlightPainter grayPainter = new DefaultHighlighter.DefaultHighlightPainter(Color.GRAY);
try {
Document doc = t.getDocument();
String text = doc.getText(0, doc.getLength());
int start = 0;
int end = 0 ;
boolean even = true;
//look for newline char, and then toggle between white and gray painters.
while ((end = text.indexOf('\n', start)) >= 0) {
even = !even;
DefaultHighlightPainter painter = even ? grayPainter : whitePainter;
hilite.addHighlight(start, end+1, painter);
start = end+1;
}
} catch (BadLocationException e) {
e.printStackTrace();
}
JPanel p = new JPanel(new BorderLayout());
p.add(t, BorderLayout.CENTER);
JFrame f = new JFrame();
f.add(p);
f.setSize(100, 100);
f.setVisible(true);
}
がVonCのMyHighlighter
です:
class MyHighlighter extends DefaultHighlighter
{
private JTextComponent component;
/**
* @see javax.swing.text.DefaultHighlighter#install(javax.swing.text.JTextComponent)
*/
@Override
public final void install(final JTextComponent c)
{
super.install(c);
this.component = c;
}
/**
* @see javax.swing.text.DefaultHighlighter#deinstall(javax.swing.text.JTextComponent)
*/
@Override
public final void deinstall(final JTextComponent c)
{
super.deinstall(c);
this.component = null;
}
/**
* Same algo, except width is not modified with the insets.
*
* @see javax.swing.text.DefaultHighlighter#paint(java.awt.Graphics)
*/
@Override
public final void paint(final Graphics g)
{
final Highlighter.Highlight[] highlights = getHighlights();
final int len = highlights.length;
for (int i = 0; i < len; i++)
{
Highlighter.Highlight info = highlights[i];
if (info.getClass().getName().indexOf("LayeredHighlightInfo") > -1)
{
// Avoid allocing unless we need it.
final Rectangle a = this.component.getBounds();
final Insets insets = this.component.getInsets();
a.x = insets.left;
a.y = insets.top;
// a.width -= insets.left + insets.right + 100;
a.height -= insets.top + insets.bottom;
for (; i < len; i++)
{
info = highlights[i];
if (info.getClass().getName().indexOf(
"LayeredHighlightInfo") > -1)
{
final Highlighter.HighlightPainter p = info
.getPainter();
p.paint(g, info.getStartOffset(), info
.getEndOffset(), a, this.component);
}
}
}
}
}
}
ここには可能な解決策のan exampleがあります。
少し説明すると、JTextPaneはスタイル付きのドキュメントエディタであり、そのようにして、StyledDocumentを変更することができます。つまり、ある行の背景色のようなスタイル情報を含むドキュメントです。
paintComponent()メソッドをオーバーロードし、コンポーネントの高さに応じて背景を手動で描画しようとしましたが、フォントサイズは成功しませんでした。
合理的に聞こえます。テキストペインを非不透明にしてください。
次に、基本的なコードは次のようになります。
さらに詳しい情報が必要な場合は、SSCCEを投稿してください。
JTextPaneのは、テキストとしてHTMLドキュメントがかかります。 HTML文書を使ってJTextPaneにテキストを追加することを検討しましたか?
JTextPane pane = new JTextPane();
pane.setContentType("text/html");
String text = /*some html table or set of divs for formatting */
pane.setText(text);
myJFrame.add(pane);
テキスト文字列を作成するときに、cssを使用して交互に色を設定したり、作成したドキュメントに直接ハードコードすることができます。これにより、再描画メソッドをオーバーライドする必要がなくなります。
これは、ユーザーがボックスを編集することを許可しない場合に有効です(つまり、setEditableをfalseに設定します)。ユーザーがEnterキーを押すたびに行を再描画すると思われる場合は、ソリューション
「1行」とはどういう意味ですか?使用している色を交互に使用すると、setBackground()は機能しませんか? – jzd
は編集可能なテキストパネルですか?つまり、行が追加/削除された場合に背景を変更したいのですか? – dogbane