我有两个静态大小的JTextPanes,我想在文本处理器中将它们连接成两页。如果我在第一个JTextPane(页面)中写了一些东西,对于一个JTextPane来说它会太长,那么它会溢出到第二个JTextPane(页面)。
我不希望这样的事情(第一个窗格已经扩展):
但我想这样的事情:
有我的测试代码:
public class Test2 extends JFrame{
JTextPane textPane1;
JTextPane textPane2;
/**
* Inicialization
*/
public Test2() {
textPane1 = getTextPane();
textPane2 = getTextPane();
getContentPane().setLayout(new GridBagLayout());
getContentPane().add(textPane1,getGridBagConstraints(0));
getContentPane().add(textPane2,getGridBagConstraints(1));
}
/**
* Settings for text panes
*/
private JTextPane getTextPane(){
JTextPane pane = new JTextPane();
pane.setEditorKit(new WrapEditorKit());
pane.setMaximumSize(new java.awt.Dimension(100, 108));
pane.setMinimumSize(new java.awt.Dimension(100, 108));
pane.setPreferredSize(new java.awt.Dimension(100, 108));
pane.setBorder(new StrokeBorder(new BasicStroke()));
return pane;
}
/**
* Setting layout for text panes.
*/
private GridBagConstraints getGridBagConstraints(int index){
GridBagConstraints gridBagConstraints = new GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = index;
gridBagConstraints.anchor = GridBagConstraints.NORTHWEST;
return gridBagConstraints;
}
/**
* Main
*/
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new Test2();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
});
}
/**
* Just class for wrapping text in text panes.
*/
private static class WrapEditorKit extends StyledEditorKit {
ViewFactory defaultFactory = new WrapColumnFactory();
@Override
public ViewFactory getViewFactory() {
return defaultFactory;
}
private class WrapColumnFactory implements ViewFactory {
@Override
public javax.swing.text.View create(Element elem) {
String kind = elem.getName();
if (kind != null) {
switch (kind) {
case AbstractDocument.ContentElementName:
return new WrapLabelView(elem);
case AbstractDocument.ParagraphElementName:
return new ParagraphView(elem);
case AbstractDocument.SectionElementName:
return new BoxView(elem, javax.swing.text.View.Y_AXIS);
case StyleConstants.ComponentElementName:
return new ComponentView(elem);
case StyleConstants.IconElementName:
return new IconView(elem);
}
}
// default to text display
return new LabelView(elem);
}
}
private class WrapLabelView extends LabelView {
public WrapLabelView(Element elem) {
super(elem);
}
@Override
public float getMinimumSpan(int axis) {
switch (axis) {
case javax.swing.text.View.X_AXIS:
return 0;
case javax.swing.text.View.Y_AXIS:
return super.getMinimumSpan(axis);
default:
throw new IllegalArgumentException("Invalid axis: " + axis);
}
}
}
}
}
任何想法请求?我尝试了很多东西,但没有任何效果。
答案 0 :(得分:0)
为什么不尝试检查第一个窗格中的单词的检查功能,如果单词计数超过限制,则自动打开第二个jtextpane然后你将从它开始并停止该功能 该函数将永远检查单词计数,因此在发生任何事情之前首先隐式执行此函数,然后继续执行代码。 :)我猜它会解决问题
答案 1 :(得分:0)
如果我记得,当您修复JTextPane的大小时,您可以使用getPrefferedSize().height
获取内容的长度。如果优选的尺寸是>比textPane本身,您可以将溢出发送到下一个textPane。您可以使用modelToView和viewToModel来帮助您完成最后一步,或者您可以将FontMetrics用于所有内容。询问您是否需要详细信息。
编辑:当然,您必须不以编程方式指定preferredSize才能使其正常工作!
在此示例中,您可以看到如何获取JTextPane内容的高度以调整JOptionPane大小的示例。 Resize dialog message (JOptionPane) for long sentence with fixed width
在你的情况下,你应该这样做:
((AbstractDocument)jtp.getDocument()).setDocumentFilter(new DocumentFilter() {
@Override
public void insertString(DocumentFilter.FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException {
fb.insertString(offset, string, attr);
if(jtp.getPreferredSize().height>Editeur.this.getHeight()) {
//your code here to remove the excess
}
}
@Override
public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String str, AttributeSet attrs) throws BadLocationException {
fb.replace(offset, length, str, attrs);
if(str!=null && str.length()!=0) {//Has there been any insert ?
if(jtp.getPreferredSize().height>Editeur.this.getHeight()) {
//your code here to remove the excess
}
}
}
});
询问您是否需要更多详细信息
答案 2 :(得分:0)
看起来你需要分页请参阅java-sl.com/Pagination_In_JEditorPane.html并且可能是关于分页功能的所有4个关键词(请参阅此处java-sl.com/articles.html) - StanislavL Dec 15' 14在8:00