基本的に、作成する必要のある3つのクラスがあります。
必要に応じてビューを変更するには、 javax.swing.text.LabelViewを拡張する必要があります(色付きの下線を追加するかどうかは関係ありません)。メソッドをオーバーライドしますpaint(Graphics, Shape)
。オーバーライドされたクラスのこの行を使用して属性にアクセスできます。属性は、テキストに何かを追加する(下線を追加するなど)ためのトリガーである必要があります。
getElement().getAttributes().getAttribute("attribute name");
新しいViewFactorycreate
を作成し、メソッドを上書きする必要があります。これを行うときは、すべての要素タイプを処理することが重要です(そうしないと、正しく表示されません。
どちらを使用するかをペインに指示するには、 StyledEditorKitを作成する必要がありViewFactory
ます。
これの単純化された実行可能な例を次に示します。
import java.awt.*;
import javax.swing.*;
import javax.swing.plaf.basic.BasicTextPaneUI;
import javax.swing.text.*;
public class TempProject extends JPanel{
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable()
{
public void run()
{
JFrame frame = new JFrame();
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
//Adding pane
JTextPane pane = new JTextPane();
pane.setEditorKit(new CustomEditorKit());
pane.setText("Underline With Different Color");
//Set Style
StyledDocument doc = (StyledDocument)pane.getDocument();
MutableAttributeSet attrs = new SimpleAttributeSet();
attrs.addAttribute("Underline-Color", Color.red);
doc.setCharacterAttributes(0, doc.getLength()-1, attrs, true);
JScrollPane sp = new JScrollPane(pane);
frame.setContentPane(sp);
frame.setPreferredSize(new Dimension(400, 300));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public static class CustomEditorKit extends StyledEditorKit{
public ViewFactory getViewFactory(){
return new CustomUI();
}
}
public static class CustomUI extends BasicTextPaneUI{
@Override
public View create(Element elem){
View result = null;
String kind = elem.getName();
if(kind != null){
if(kind.equals(AbstractDocument.ContentElementName)){
result = new MyLabelView(elem);
} else if(kind.equals(AbstractDocument.ParagraphElementName)){
result = new ParagraphView(elem);
}else if(kind.equals(AbstractDocument.SectionElementName)){
result = new BoxView(elem, View.Y_AXIS);
}else if(kind.equals(StyleConstants.ComponentElementName)){
result = new ComponentView(elem);
}else if(kind.equals(StyleConstants.IconElementName)){
result = new IconView(elem);
} else{
result = new LabelView(elem);
}
}else{
result = super.create(elem);
}
return result;
}
}
public static class MyLabelView extends LabelView{
public MyLabelView(Element arg0) {
super(arg0);
}
public void paint(Graphics g, Shape a){
super.paint(g, a);
//Do whatever other painting here;
Color c = (Color)getElement().getAttributes().getAttribute("Underline-Color");
if(c != null){
int y = a.getBounds().y + (int)getGlyphPainter().getAscent(this);
int x1 = a.getBounds().x;
int x2 = a.getBounds().width + x1;
g.setColor(c);
g.drawLine(x1, y, x2, y);
}
}
}
}
別のサンプルコードへのリンクは次のとおりです。
http://java-sl.com/tip_colored_strikethrough.html
この答えは主に後世のためのものです。リンクされたコードと説明の簡略化されたバージョンを追加すると、物事がより理解しやすくなると思いました。