Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 两个链接的JTextPane_Java_Swing_Jtextpane - Fatal编程技术网

Java 两个链接的JTextPane

Java 两个链接的JTextPane,java,swing,jtextpane,Java,Swing,Jtextpane,我有两个静态大小的JTextPanes,我想把它们像文本处理器中的两个页面一样连接起来。如果我在第一个JTextPane(第页)中写入了一些内容,并且对于一个JTextPane来说太长,那么它将溢出到第二个JTextPane(第页) 我不想要这样的东西(第一个窗格已展开): 但是我想要这样的东西: 下面是我的测试代码: public class Test2 extends JFrame{ JTextPane textPane1; JTextPane textPane2;

我有两个静态大小的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);
                }
            }
        }
    }
}

有什么想法吗?我尝试了很多方法,但都没有成功。

为什么不尝试一个检查功能,对第一个窗格中的单词进行计数,如果单词计数超过限制,则自动打开第二个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的情况下修复此问题的更多信息。让我知道它是否有效。这是最好的解决方案。它对我非常有效。