Java 两个链接的JTextPane
我有两个静态大小的JTextPanes,我想把它们像文本处理器中的两个页面一样连接起来。如果我在第一个JTextPane(第页)中写入了一些内容,并且对于一个JTextPane来说太长,那么它将溢出到第二个JTextPane(第页) 我不想要这样的东西(第一个窗格已展开): 但是我想要这样的东西: 下面是我的测试代码:Java 两个链接的JTextPane,java,swing,jtextpane,Java,Swing,Jtextpane,我有两个静态大小的JTextPanes,我想把它们像文本处理器中的两个页面一样连接起来。如果我在第一个JTextPane(第页)中写入了一些内容,并且对于一个JTextPane来说太长,那么它将溢出到第二个JTextPane(第页) 我不想要这样的东西(第一个窗格已展开): 但是我想要这样的东西: 下面是我的测试代码: public class Test2 extends JFrame{ JTextPane textPane1; JTextPane textPane2;
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);
}
}
}
}
}
有什么想法吗?我尝试了很多方法,但都没有成功。为什么不尝试一个检查功能,对第一个窗格中的单词进行计数,如果单词计数超过限制,则自动打开第二个jtextpane,然后重新开始并停止该功能
该函数将检查单词计数,即使如此,在任何事情发生之前先隐式执行调用此函数,然后继续执行代码。:)如果我清楚地记得,当您确定JTextPane的大小时,您可以使用
getPreferedSize().height
获得内容的长度,我想这将解决问题。如果首选大小大于文本窗格本身,则可以将溢出发送到下一个文本窗格。您可以使用modelToView和viewToModel在最后一步中为您提供帮助,也可以使用FontMetrics进行所有操作。询问您是否需要详细信息
编辑:当然,您不必通过编程方式指定preferredSize,这样才能工作
在本例中,您可以看到如何获取JTextPane内容的高度以适应JOptionPane的大小的示例。
在你的情况下,你应该这样做:
((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
}
}
}
});
询问您是否需要更多详细信息看起来您需要分页查看java-sl.com/pagination_In_JEditorPane.html,可能是关于分页功能的所有4篇文章(请参阅此处java-sl.com/articles.html)StanislavL 12月15日14日8:00为什么不是一个大的文本窗格?我正在做一个简单的文本处理器。一个JTextPane只代表一个页面。我简化了这个例子,只剩下基本的东西。我不确定我是否理解这个设计。如果你有3页的文本会发生什么?你需要3个文本窗格吗?是的,我需要更多的文本窗格。如果我在第一个文本窗格中写入了一些内容,并且该内容对于一个文本窗格来说太长,则会溢出到第二个文本窗格,如果对于两个文本窗格来说仍然太长,则会出现第三个文本窗格。所有内容都将相互连接。看起来您需要分页,请参阅,可能是关于分页功能的所有4篇文章(请参阅此处)。对不起,我忘记了编写文本,因为文本将更改大小、字体和其他参数。甚至可以在文本中插入图像,所以这个选项不起作用。非常感谢你。我对这些函数(viewToModel和modelToView)一无所知。它起作用了。但我还有最后一个问题要问你。设置JTextPane的固定大小而不设置首选大小是什么意思?我该怎么做?我通过将每个JTextPane放到JViewport并将首选大小设置为JViewport解决了这个问题。之后,我检查了JTextPane的高度是否大于JViewPort的首选大小。它适用于溢出,但由于这些jviewport,在主框架中滚动会出现一些问题。你知道如何在没有JViewports的情况下做到这一点吗?好的,请参阅我的编辑,以获取有关如何在没有JViewports的情况下修复此问题的更多信息。让我知道它是否有效。这是最好的解决方案。它对我非常有效。