Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.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 JTextArea允许滚动到文本末尾之外_Java_Swing_Jtextarea - Fatal编程技术网

Java JTextArea允许滚动到文本末尾之外

Java JTextArea允许滚动到文本末尾之外,java,swing,jtextarea,Java,Swing,Jtextarea,Java的文本区域通常不允许滚动到文本末尾之外,但有时允许文本的底部位于窗口的中间会更舒服。有没有一种简单的方法可以做到这一点?如果我理解正确,您可以简单地将JTextArea的row属性设置为足够大,这样文本就不会完全填满它 e、 g 您永远不应该做的是设置JTextArea的大小、边界或preferredSize,因为如果添加文本并用超出其当前可视化大小的文本填充,则会阻止其所需行为根据需要扩展。编辑: 这就是Visual Studio的工作方式。您可以将文本的最后一行作为滚动区域的第一行

Java的文本区域通常不允许滚动到文本末尾之外,但有时允许文本的底部位于窗口的中间会更舒服。有没有一种简单的方法可以做到这一点?

如果我理解正确,您可以简单地将JTextArea的row属性设置为足够大,这样文本就不会完全填满它

e、 g

您永远不应该做的是设置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();
            }
        });
    }
}



原始答案(可能可以忽略):

文本的底部位于窗口的中间

如果文本的底部总是在中间,这意味着永远不会使用文本区域的下半部分,因此浪费了空间。我认为这会让用户感到困惑

但是,您可以向文本区域添加
边框。这将允许您在完全滚动时在底部留出一点额外空间:

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 );
    }
});

要使用上述代码,您将需要该类

这听起来可能很愚蠢,但您是否尝试过在JTextArea的末尾自动添加新行?与响应动态更改的JTextArea.setText(myText+“\n\n\n\n”)一样,也有setRows()。OP并不总是将文本的底部放在中间。他希望用户能够像那样滚动文本。这就是Visual Studio的工作方式。您可以将文本的最后一行作为滚动区域的第一行。看起来不错,但没有考虑潜在的边框。
textArea.addCaretListener( new CaretListener()
{
    public void caretUpdate(CaretEvent e)
    {
        JTextComponent component = (JTextComponent)e.getSource();
        RXTextUtilities.centerLineInScrollPane( component );
    }
});