簡體   English   中英

Java JTextArea允許滾動到文本末尾

[英]Java JTextArea allow scrolling beyond end of text

Java的文本區域通常不允許滾動超出文本的末尾,但有時允許更舒適,即文本的底部位於窗口的中間。 是否有捷徑可尋?

如果我理解正確,您可以簡單地將JTextArea的row屬性設置為足夠大,以便文本不會完全填充它。

例如,

import javax.swing.*;

public class MyLargeTextArea extends JPanel {

    private static final int ROWS = 20;
    private static final int COLS = 40;
    private JTextArea textArea = new JTextArea(ROWS, COLS);

    public MyLargeTextArea() {
        textArea.setText("This is a small amount of text");

        // so lines wrap
        textArea.setWrapStyleWord(true);
        textArea.setLineWrap(true);

        add(new JScrollPane(textArea));
    }

    private static void createAndShowGui() {
        MyLargeTextArea mainPanel = new MyLargeTextArea();

        JFrame frame = new JFrame("MyLargeTextArea");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGui();
            }
        });
    }
}

您應該永遠做的是設置JTextArea的大小,邊界或preferredSize,因為如果添加文本並使用超出當前可視化大小的文本填充文本,則會阻止其按需擴展所需的行為。

編輯:

這就是Visual Studio的行為方式。 您可以將文本的最后一行作為滾動區域的第一行

您可以調整文本區域的首選高度,以允許最后一行滾動到文本區域的頂部:

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

public class TextAreaTop
{
    private static void createAndShowGUI()
    {
        JTextArea textArea = new JTextArea(6, 30)
        {
            @Override
            public Dimension getPreferredSize()
            {
                Dimension preferred = super.getPreferredSize();
                int heightAdjustment = getParent().getSize().height - getRowHeight();
                preferred.height += heightAdjustment;

                Border border = getBorder();

                if (border != null)
                    preferred.height -= border.getBorderInsets(this).bottom;

                return preferred;
            }
        };

        textArea.setText("1\n2\n3\n4\n5\n6\n7\n8\n9\n0");
        textArea.setBorder( new EmptyBorder(20, 20, 20, 20) );

        JScrollPane scrollPane = new JScrollPane( textArea );

        JFrame frame = new JFrame("TextAreaTop");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(scrollPane);
        frame.setLocationByPlatform( true );
        frame.pack();
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowGUI();
            }
        });
    }
}




原始答案(可以忽略):

文本的底部位於窗口的中間

如果文本的底部始終位於中間,則意味着文本區域的下半部分將永遠不會被使用,因此您會浪費空間。 我認為這會讓用戶感到困惑。

但是,您可以向文本區域添加Border 這將允許您在完全滾動時在底部留出一些額外的空間:

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

public class SSCCE extends JPanel
{
    public SSCCE()
    {
        setLayout( new BorderLayout() );

        JTextArea textArea = new JTextArea(10, 30);
        textArea.setText("1\n2\n3\n4\n5\n6\n7\n8\n9\n0");
        textArea.setBorder( new EmptyBorder(0, 0, 48, 0) );

        add( new JScrollPane(textArea) );
    }

    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame("SSCCE");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new SSCCE());
        frame.setLocationByPlatform( true );
        frame.setSize(400, 200);
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowGUI();
            }
        });
    }
}

如果你想有點想象,你也可以添加以下內容。 此代碼將嘗試將插入符號所在的行居中。

textArea.addCaretListener( new CaretListener()
{
    public void caretUpdate(CaretEvent e)
    {
        JTextComponent component = (JTextComponent)e.getSource();
        RXTextUtilities.centerLineInScrollPane( component );
    }
});

要使用上面的代碼,您需要Text Utilities類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM