JScrollPane无法检测需要滚动的文本

时间:2018-03-04 02:42:32

标签: java swing jscrollpane

这是我的代码的简化版本,如果这还不足以诊断问题,请发表评论,我会发布更多代码:

//All Necessary Imports

JFrame window;
Container container;
JPanel mainTextPanel;
JScrollPane scrollPane;
JTextArea mainText;
Font normalFont = new Font("Times New Roman", Font.PLAIN,30);

ChoiceHandler choiceHandler = new ChoiceHandler();

//Unrelated Variables

public class setUp()
{
    public setUp()
    {
        window = new JFrame();
        window.setSize(825,600);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.getContentPane().setBackground(Color.white);
        window.setLayout(null);

        container = window.getContentPane();

        mainTextPanel = new JPanel();
        mainTextPanel.setBounds(100,100,600,250);
        mainTextPanel.setBackground(Color.white);
        container.add(mainTextPanel);

        //more code goes here
    }
}

public class mainText extends setUp
{
    public mainText()
    {
        mainText = new JTextArea("Tons of text here");
        mainText.setBounds(100,100,600,250);
        mainText.setBackground(Color.white);
        mainText.setForeground(Color.black);
        mainText.setFont(normalFont);
        mainText.setLineWrap(true);
        scrollPane = new 
        JScrollPane(mainText,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

        mainTextPanel.add(scrollPane);
        mainTextPanel.revalidate();
        mainTextPanel.repaint();
        mainTextPanel.setVisible(true);

        //more code goes here
    }
}

我的问题是,当我运行代码时,一切正常,除了ScrollPane显然无法检测到文本超出范围的事实。滚动条在那里,唯一的问题是你不能用它滚动,它看起来像文本没有超过限制时的滚动条。

当我在创建滚动条时删除ALWAYS修改器时,滚动条消失,再次证明滚动条根本不检测越界文本。

1 个答案:

答案 0 :(得分:1)

我只是想指出为什么null布局很糟糕......代码

Why Null layouts suck

这就是您的代码在我的系统上的显示方式。说实话,那里有滚动条,但是你试图取消布局管理API会导致JScrollPane超出父容器的物理边界。

您似乎也不了解坐标系在Swing中的工作方式,与父组件的上下文有关,但如果您使用布局管理器,则不需要到。

因此,在更新代码后使用布局管理器

Scrollable

你知道有一个可以滚动的解决方案......

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.EventQueue;
import java.awt.Font;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                mainText mt = new mainText();
                mt.window.pack();
                mt.window.setLocationRelativeTo(null);
                mt.window.setVisible(true);

            }
        });
    }

    public class setUp {

        JFrame window;
        Container container;
        JPanel mainTextPanel;
        JScrollPane scrollPane;
        JTextArea mainText;
        Font normalFont = new Font("Times New Roman", Font.PLAIN, 30);

        public setUp() {
            window = new JFrame();
            window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            window.getContentPane().setBackground(Color.white);

            container = window.getContentPane();

            mainTextPanel = new JPanel(new BorderLayout());
            mainTextPanel.setBackground(Color.white);
            container.add(mainTextPanel);

            //more code goes here
        }
    }

    public class mainText extends setUp {

        public mainText() {
            mainText = new JTextArea("Tons of text here");
            mainText.setBackground(Color.white);
            mainText.setForeground(Color.black);
            mainText.setFont(normalFont);
            mainText.setLineWrap(true);
            scrollPane = new JScrollPane(mainText, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

            mainTextPanel.add(scrollPane);
            mainTextPanel.revalidate();
            mainTextPanel.repaint();

            //more code goes here
        }
    }

}
  

但水平滚动条在哪里?

mainText.setLineWrap(true);本来不需要它

  

但是JTextArea是小的!

所以?提供一些适当的尺寸提示,组件可以使用这些提示来更好地确定它可能有多大。

mainText = new JTextArea("Tons of text here", 1, 10);之类的东西会产生

Long text

所以,长期和简短的答案是,使用布局管理API,Swing是围绕它设计使用的,它将为您节省大量的头部刮擦和愚蠢的边缘情况

  

但是在我的系统上滚动条不会出现!?

回到开头,不要再花200美元再读一遍。其出现不同的原因是缺乏布局支持

  

但我不想使用/了解布局管理员!

坚韧。如果你想避免这种"怪异的"问题,然后布局管理API是正确的方向。花时间尝试不同的布局管理器并尝试不同的组合,你不会只使用一个,几乎所有复杂的UI将使用一个在单个复合UI中至少有两个(如果不是更多)布局管理器