如何使水平滚动条出现在包含的JTextPane组件一个JScrollPane(How to make

2019-10-19 03:15发布

我不能让水平滚动条出现。 我已经使用JTextPane.setSize(),JTextPane.setPreferredSize()和JTextPane的大小没有方法试过。 我还使用JScrollPane.setPreferredSize()。

垂直滚动条出现,但水平一个没有。

下面是一个例子:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Test {

    private int         textPaneWidth    = 500;
    private int         textPaneHeigth   = 200;
    private int         scrollPaneWidth  = 100;
    private int         scrollPaneHeigth = 100;
    private JTextPane   textPane;
    private JButton     button;
    private JFrame      frame;
    private JScrollPane scrollPane;

    public static void main(String[] args) {

        Test gui = new Test();
        gui.go();

    }

    private void go() {

        frame       = new JFrame("Test");
        button      = new JButton("button");
        textPane    = new JTextPane();
        scrollPane  = new JScrollPane(textPane, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

        frame.setLayout(new FlowLayout());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        button.addActionListener(new ButtonListener());
        textPane.setFont(new Font("Courier", Font.PLAIN, 12));

        // Sizes:
//        textPane.setSize(textPaneWidth, textPaneHeigth);                             // ???
//        textPane.setPreferredSize(new Dimension(textPaneWidth, textPaneHeigth));     // ???
        scrollPane.setPreferredSize(new Dimension(scrollPaneWidth, scrollPaneHeigth));

        frame.add(button);
        frame.add(scrollPane, BorderLayout.CENTER);
        frame.pack();
        frame.setVisible(true);

    }

    private class ButtonListener implements ActionListener {

        public void actionPerformed(ActionEvent event) {
             textPane.setText("==================================================================== \n" + 
                         "==================================================================== \n" +
                         "==================================================================== \n" +
                         "==================================================================== \n" +
                         "==================================================================== \n");
        }

    }
}

当按下按钮时,该字符串被添加到的JTextPane。 有垂直滚动,但没有水平滚动。

这就是我按下按钮后看到:

我究竟做错了什么?

Answer 1:

好像你需要延长的JTextPane避免包装

https://forums.oracle.com/thread/1210688

class JTextWrapPane extends JTextPane {

    boolean wrapState = true;
    JTextArea j = new JTextArea();

    JTextWrapPane() {
        super();
    }

    public JTextWrapPane(StyledDocument p_oSdLog) {
        super(p_oSdLog);
    }


    public boolean getScrollableTracksViewportWidth() {
        return wrapState;
    }


    public void setLineWrap(boolean wrap) {
        wrapState = wrap;
    }


    public boolean getLineWrap(boolean wrap) {
        return wrapState;
    }
}  

编辑:

//  instead of  private JTextPane jtp = new JTextPane( sdLog );
    private JTextWrapPane jtp = new JTextWrapPane( sdLog );
//and set LineWrap = (false):
        jtp.setLineWrap(false);


Answer 2:

挖掘一下之后,我想通了这个问题。

JTextPane不只是显示一个文件,相反,它显示的样式化文档。 从引用Java教程: “一个JTextComponent的子类的JTextPane,要求其文档是一个StyledDocument中的,而不是仅仅一个文件。”

当你创建一个JTextPane有一个默认的构造,像你一样,会自动创建一个DefaultStyledDocument 。 从对文档DefaultStyledDocument

这些样式运行被映射到一个段落元件结构(其可驻留在一些其它结构)。 样式运行在段落边界打破了逻辑样式被分配到段边界。

这意味着JTextPane实际上是在你做自动换行。 一个解决办法是使用尝试JTextArea来代替。

编辑,每评论:另一种解决办法是创建自己的StyledDocument (可能是由扩展AbstractDocument ),设置它怎么想,并把它传递给JTextPane构造。



Answer 3:

只有垂直滚动没有滚动条

progressTextArea = new JTextPane();

JScrollPane scroller = new JScrollPane()
{
    public Dimension getPreferredSize()
    {
        return new Dimension(300, 100);
    }

    public float getAlignmentX()
    {
        return LEFT_ALIGNMENT;
    }
};

scroller.getViewport().add(progressTextArea);


文章来源: How to make the horizontal scroll bar appear in a JScrollPane that contains a JTextPane component