【发布时间】:2015-12-17 05:10:16
【问题描述】:
Java 的文本区域通常不允许滚动超出文本的末尾,但有时允许文本的底部位于窗口的中间会更舒服。有没有简单的方法可以做到这一点?
【问题讨论】:
-
这听起来可能很愚蠢,但您是否尝试过在 JTextArea 末尾自动添加新行?像 JTextArea.setText(myText + "\n\n\n\n")
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 的大小、边界或首选大小,因为如果添加文本并用超出其范围的文本填充它,这将阻止其所需的行为根据需要扩展当前可视化大小。
【讨论】:
编辑:
这就是例如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 类。
【讨论】: