如何调整Java Swing JTextArea的大小
我试图使用JavaSwing将文本区域放到对话框中。我在设置此区域的大小时遇到问题。文本区域的宽度始终等于窗口的整个宽度,如果我调整窗口的大小,它将随窗口一起拉伸如何调整Java Swing JTextArea的大小,java,swing,layout-manager,jtextarea,preferredsize,Java,Swing,Layout Manager,Jtextarea,Preferredsize,我试图使用JavaSwing将文本区域放到对话框中。我在设置此区域的大小时遇到问题。文本区域的宽度始终等于窗口的整个宽度,如果我调整窗口的大小,它将随窗口一起拉伸 private void arrangeComponents() { JTextArea textArea = new JTextArea(); JPanel outerPanel = new JPanel(); outerPanel.setLayout(new BoxLayout(outerPanel, Bo
private void arrangeComponents() {
JTextArea textArea = new JTextArea();
JPanel outerPanel = new JPanel();
outerPanel.setLayout(new BoxLayout(outerPanel, BoxLayout.PAGE_AXIS));
JScrollPane scrollPane = new JScrollPane(textArea);
outerPanel.add(scrollPane, BorderLayout.CENTER);
Container contentPane = getContentPane();
contentPane.add(outerPanel, BorderLayout.CENTER);
}
我希望JTextArea与窗口中心水平对齐,并且不改变其大小
我做错了什么?使用指定行和列的构造函数,如图所示,不要忽略了
pack()
封闭的窗口
我从一个简单的编码站点上找到了它。此代码示例可能对您有用
import java.awt.Dimension;
import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class JTextAreaTest {
public static void main(String[] args) {
JFrame.setDefaultLookAndFeelDecorated(true);
JFrame frame = new JFrame("JTextArea Test");
frame.setLayout(new FlowLayout());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
String text = "A JTextArea object represents a multiline area for displaying text. "
+ "You can change the number of lines that can be displayed at a time, "
+ "as well as the number of columns. You can wrap lines and words too. "
+ "You can also put your JTextArea in a JScrollPane to make it scrollable.";
JTextArea textAreal = new JTextArea(text, 5, 10);
textAreal.setPreferredSize(new Dimension(100, 100));
JTextArea textArea2 = new JTextArea(text, 5, 10);
textArea2.setPreferredSize(new Dimension(100, 100));
JScrollPane scrollPane = new JScrollPane(textArea2,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
textAreal.setLineWrap(true);
textArea2.setLineWrap(true);
frame.add(textAreal);
frame.add(scrollPane);
frame.pack();
frame.setVisible(true);
}
}
BoxLayout不接受约束,因此不需要BorderLayout.CENTER
问题是BoxLayout尊重组件的最大大小,而对于滚动窗格,组件的最大大小设置得非常大
与其使用BoxLayout,不如使用带有FlowLayout的面板
运行下面的示例以查看您当前正在执行的操作。然后注释掉setLayout(…)语句并再次运行。默认情况下,面板使用FlowLayout,因此您将获得所需的内容
import java.awt.*;
import javax.swing.*;
import javax.swing.text.*;
public class SSCCE extends JPanel
{
public SSCCE()
{
setLayout( new BoxLayout(this, BoxLayout.PAGE_AXIS));
JTextArea textArea = new JTextArea(5, 30);
JScrollPane scrollPane = new JScrollPane(textArea);
//scrollPane.setMaximumSize( scrollPane.getPreferredSize() );
add(scrollPane);
}
private static void createAndShowUI()
{
JFrame frame = new JFrame("SSCCE");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add( new SSCCE() );
frame.pack();
frame.setLocationRelativeTo( null );
frame.setVisible( true );
}
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowUI();
}
});
}
}
或者,如果确实要保留BoxLayout,请保留setLayout(…)语句,然后将最大大小设置为等于首选大小。许多人会说,您永远不应该直接调用“setXXX()”方法,而应该重写scrollpane的setMaximumSize()方法,只返回首选大小
请注意,在测试这两种解决方案时,请确保使窗口比滚动窗格小,以查看每个布局的工作方式不同 只需为您的文本区域调用该方法:
setLineWrap(true)代码>如果JTextArea已初始化
JTextArea text=新的JTextArea(int行,int列)
您只需调用方法text.setLineWrap(true)
然后文本的大小是固定的。+1用于并排比较。我的示例需要一个滚动窗格,而您的示例可以使用一点invokeLater()
:-)-1用于使用setPreferredSize(),它只是一组随机数,不考虑用于确定每行行高度的字体。setPreferredSize()方法只是覆盖了您在创建文本区域时试图指定的行、列值。@camickr提出了一个我忽略的关键点;更多还有,当心,也看看。
import java.awt.*;
import javax.swing.*;
import javax.swing.text.*;
public class SSCCE extends JPanel
{
public SSCCE()
{
setLayout( new BoxLayout(this, BoxLayout.PAGE_AXIS));
JTextArea textArea = new JTextArea(5, 30);
JScrollPane scrollPane = new JScrollPane(textArea);
//scrollPane.setMaximumSize( scrollPane.getPreferredSize() );
add(scrollPane);
}
private static void createAndShowUI()
{
JFrame frame = new JFrame("SSCCE");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add( new SSCCE() );
frame.pack();
frame.setLocationRelativeTo( null );
frame.setVisible( true );
}
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowUI();
}
});
}
}