我需要我的syncronise PDF列表项和JTextArea中的行间距在我的GUI。 我可以通过调整一个或另一个做到这一点。
而这一切都UNIL一个ListItem(或JTextArea的)超过一名行长(换行设置为true在JTextArea中)的伟大工程。
我可以调整两个listItems中之间的高度。 该距离也将一个单一的多行的ListItem的两排之间施加的高度。
然而,在我的GUI,由于compononet boreders和默认的行间距JTextArea中,这两个是不一样的。 相差约一个像素,但大规模的,可积累,并导致一些问题。
那么,有没有什么办法可以在JTextArea中设置linespacing,或任何方法可以让我两个列表项和相同的列表项的两行之间spaceing区分?
我一切,为使用任何种类和任何一种技巧,它可能需要的外部库...
要覆盖JTextArea中的行间距看一看的普莱恩维尔(用于渲染PLainDocument)。
有在以下行public void paint(Graphics g, Shape a)
方法
drawLine(line, g, x, y);
y += fontHeight;
所以,你可以适应渲染固定y偏移。
在BasicTextAreaUI
方法来创建视图。 用自己的执行进行更换PlainView
public View create(Element elem) {
Document doc = elem.getDocument();
Object i18nFlag = doc.getProperty("i18n"/*AbstractDocument.I18NProperty*/);
if ((i18nFlag != null) && i18nFlag.equals(Boolean.TRUE)) {
// build a view that support bidi
return createI18N(elem);
} else {
JTextComponent c = getComponent();
if (c instanceof JTextArea) {
JTextArea area = (JTextArea) c;
View v;
if (area.getLineWrap()) {
v = new WrappedPlainView(elem, area.getWrapStyleWord());
} else {
v = new PlainView(elem);
}
return v;
}
}
return null;
}
控制使用ParagraphAttribute你行之间的空间SpaceBelow
。 可以用4行代码或更少做到这一点(见下面的例子)。 您将需要使用JTextPane
使用这些ParagraphAttributes(但JTextPane
和JTextArea`是如此的相似,你应该不会注意到差别)。
import java.awt.*;
import javax.swing.*;
import javax.swing.text.*;
public class LineSpacingExample extends Box{
JTextPane modifiedTA;
//Modify this to whatever spacing you want between the rows.
static final float spaceBelow = 5.0f;
//Font height - automatically calculated by code below
int fontHeight = 0;
public LineSpacingExample(){
super(BoxLayout.X_AXIS);
//Demonstrating that the spacing is predictable
final JPanel leftBox = new CustomBox();
add(leftBox);
//Sets the amount of space below a row (only code you need to add)
DefaultStyledDocument pd = new DefaultStyledDocument();
SimpleAttributeSet sas = new SimpleAttributeSet();
StyleConstants.setSpaceBelow(sas, spaceBelow);
pd.setParagraphAttributes(0, pd.getLength(), sas, false);
modifiedTA= new JTextPane(pd);
add(modifiedTA);
//Calculates the font height in pixels
fontHeight = modifiedTA.getFontMetrics(modifiedTA.getFont()).getHeight();
}
/**
* @param args
*/
public static void main(String[] args) {
final JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new LineSpacingExample());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
//EXTRA! Paints the left hand side box - to show that the spacing is predictable in pixels
public class CustomBox extends JPanel{
public CustomBox() {
super();
setOpaque(true);
setBackground(Color.orange);
}
public void paintComponent(Graphics g){
super.paintComponent(g);
int height = getSize().height;
int drawLocation = 2; //To account for padding on the TextPane
int row = 1;
while(drawLocation < height){
//Drawing the text row background
g.setColor(Color.blue);
g.fillRect(0, drawLocation, 50, fontHeight);
//Drawing the text row number
g.setColor(Color.white);
g.drawString(Integer.toString(row++), 0, drawLocation+14);
drawLocation += fontHeight;
//Drawing the space row
g.setColor(Color.green);
g.fillRect(0, drawLocation, 50, (int)spaceBelow);
drawLocation += spaceBelow;
}
}
};
}
你可以尝试使用JTextPane
代替的JTextArea
,并设置相应的行间距看起来像你的listItems中。
SimpleAttributeSet set = new SimpleAttributeSet();
StyleConstants.setLineSpacing(set, 0.5f); // <--- your value here
textPane.setParagraphAttributes(set, true);
这不会影响现有文本的行间距,所以你应该事后设置文本。