【问题标题】:JTextPane doesn't display JScrollPane and doesn't Wrap TextJTextPane 不显示 JScrollPane 并且不换行
【发布时间】:2012-05-05 10:45:11
【问题描述】:

我需要显示链接,所以我将 JTextPane 与 setContentType 一起使用。但是,内容不换行,也没有滚动。 JTextPane 的内容将从 RSS 提要中返回。这是完整的代码:

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

class Main extends JFrame
{
    JFrame frame;
    JTabbedPane tabbedPane;
    JPanel home, news;      

    public Main()
    {
        setTitle("My Title" ); 
        setSize( 900, 600 ); 
        setLocationRelativeTo(null); 
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

        home(); 
        news(); 

        tabbedPane = new JTabbedPane(); 
        tabbedPane.addTab( " Home", home ); 
        tabbedPane.addTab( "News", news ); 

        JPanel framePanel = new JPanel();
        framePanel.setLayout(new BorderLayout());       
        framePanel.add( tabbedPane, BorderLayout.CENTER );
        getContentPane().add( framePanel );     

    }


    public void home() 
    {       
        home = new JPanel();
        // some stuffs here
    }


    public void news()
    {
        news = new JPanel();

        JTextPane newsTextPane = new JTextPane(); 
        newsTextPane.setContentType("text/html");
        newsTextPane.setEditable(false); 

        JScrollPane scrollPane = new JScrollPane(newsTextPane);     
        scrollPane.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        news.add(scrollPane);   

        RSS reader = RSS .getInstance();
        reader.writeNews();             

        String rssNews = reader.writeNews();
        newsTextPane.setText(rssNews);
    }   

    public static void main( String args[] )
    {

        RSS reader = RSS.getInstance();
        reader.writeNews();

        Main mainFrame  = new Main();
        mainFrame.setVisible( true );   
        mainFrame.setDefaultCloseOperation( EXIT_ON_CLOSE );
        }
}

我的结果:

【问题讨论】:

    标签: java swing jtextpane


    【解决方案1】:

    我只是使用了你的代码,它不会引起任何问题:

    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTextPane;
    import javax.swing.SwingUtilities
    
    public class TestScrolling {
    
        public static void main(String[] args) {
                SwingUtilities.invokeLater(new Runnable() {
                     public void run() {
                      initUI();
                     });
        }
    
        public static void initUI() {
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < 100; i++) {
                sb.append("loads loads loads loads of text here ");
            }
            JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            JTextPane newsTextPane = new JTextPane();
            newsTextPane.setContentType("text/html");
            newsTextPane.setEditable(false);
            newsTextPane.setText(sb.toString());
    
            JScrollPane scrollPane = new JScrollPane(newsTextPane);
            scrollPane.setVerticalScrollBarPolicy(
                      javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
            frame.add(scrollPane);
            frame.setSize(300, 200);
            frame.setVisible(true);
         }
    }
    

    编辑:


    您必须以某种方式强制滚动窗格的宽度。在我的示例中,它是通过将滚动窗格添加到框架的内容窗格来隐式完成的,默认情况下使用 BorderLayout。在您的情况下,您使用了 FlowLayout 来分配滚动窗格的首选大小,该大小大约是 JTextPane 的首选大小。

    【讨论】:

    • +1 表示sscce;我猜这个问题的(看不见的)markupcontainer 也可能是一个因素。
    • @Guillaume Polet +1 例如,我用它来表明容器大小错误,滚动条不会出现。 OP 使用的是panel,但我们对此知之甚少。
    • @trashgod,我已经包含了整个代码,请指教!谢谢!
    • @LilyT 在新闻 JPanel 中,您没有设置任何布局,这意味着您使用将始终分配首选大小的 FlowLayout(管理器)。改用 BorderLayout 一切都会正常工作:news = new JPanel(new BorderLayout());
    • 我本来想说news = new JPanel(new GridLayout()),但效果相似。另见Initial Threads
    【解决方案2】:

    您是否在 JScrollPane 周围使用面板或其他东西?

    使用大小不合适的@Guillaume Polet 的 sscc,示例将不起作用:

    import java.awt.Dimension;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextPane;
    
    public class TestScrolling {
    
        public static void main(String[] args) {
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < 100; i++) {
                sb.append("loads loads loads loads of text here ");
    
            }
            JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            JTextPane newsTextPane = new JTextPane();
            newsTextPane.setContentType("text/html");
            newsTextPane.setEditable(false);
            newsTextPane.setText(sb.toString());
            JScrollPane scrollPane = new JScrollPane(newsTextPane);
            scrollPane.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
            JPanel pan = new JPanel();
            pan.setMinimumSize(new Dimension(500,500));
            pan.add(scrollPane);
            frame.add(pan);
            frame.setSize(500, 500);
            frame.setVisible(true);
        }
    }
    

    我看到您将 JscrollPane 添加到 panel。您能否提供您在该面板上所做的创建/修改以及该面板的使用位置?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      相关资源
      最近更新 更多