Java Swing如何调整GridLayout中不可编辑JTextArea的显示大小
问题解决思路
问题根源
你当前使用的顶层GridLayout布局特性是强制所有子组件平均分配容器空间,无论单个组件设置多大的首选尺寸,都会被布局管理器强制拉伸为统一大小,这就是你给P[6]设置尺寸不生效的核心原因。
最优修改方案
推荐将顶层布局替换为BorderLayout,这是Swing中适配这类「顶部固定表单+底部自适应内容区」场景最方便的布局:
- 把原来所有的顶部表单组件(新增图书栏、搜索栏等)统一放到一个单独的面板中,使用你原来的
GridLayout管理这些固定高度的组件 - 把文本区所在的
P[6]放到BorderLayout.CENTER位置,该位置会自动占据窗口剩余的所有高度,完全满足你容纳3本图书信息的需求
核心代码修改点
public MainFrame() { super("Library System"); // 1. 替换顶层布局为BorderLayout setLayout(new BorderLayout(2,2)); // 2. 新建顶部表单面板,使用原来的GridLayout,行数改成21(去掉原来给文本区留的1行) JPanel topPanel = new JPanel(new GridLayout(21,1,1,1)); NewBook=new JLabel(" NEW BOOK"); NewBook.setFont(NBF); NewBook.setForeground(Color.RED); // 原来的add改成加到topPanel里 topPanel.add(NewBook); ADD=new JLabel(" ISBN Title Author Published Year Edition"); ISBNin=new JTextField(15); Titlein=new JTextField(15); Authorin=new JTextField(15); Yearin=new JTextField(15); Editionin=new JTextField(15); P=new JPanel[10]; P[0]=new JPanel(); P[0].setLayout(new GridLayout(1,1)); P[0].add(ADD); topPanel.add(P[0]); P[1]=new JPanel(); P[1].setLayout(new GridLayout(1,5)); P[1].add(ISBNin); P[1].add(Titlein); P[1].add(Authorin); P[1].add(Yearin); P[1].add(Editionin); topPanel.add(P[1]); EmptyLabel=new JLabel[20]; Insert=new JButton("Insert"); Clear=new JButton("Clear"); Clear.setHorizontalAlignment(JButton.CENTER); P[2]=new JPanel(); P[2].setLayout(new GridLayout(1,10)); for(int i=0;i<20;i++) EmptyLabel[i]=new JLabel(""); for(int i=0;i<4;i++) P[2].add(EmptyLabel[i]); P[2].setAlignmentX(CENTER_ALIGNMENT); P[2].add(Insert); P[2].add(Clear); for(int i=4;i<8;i++) P[2].add(EmptyLabel[i]); topPanel.add(P[2]); J=new JSeparator(); topPanel.add(J); SearchBook=new JLabel("SEARCH BY"); SearchBook.setFont(NBF); SearchBook.setForeground(Color.RED); P[3]=new JPanel(); P[3].setLayout(new GridLayout(1,1,5,5)); P[3].add(SearchBook); // 删掉原来重复的add(SearchBook); 代码,避免重复添加组件 topPanel.add(P[3]); ISBNRB=new JRadioButton("ISBN",true); TitleRB=new JRadioButton("Title",false); YearRB=new JRadioButton("Published",false); AuthorRB=new JRadioButton("Author",false); P[4]=new JPanel(); P[4].setLayout(new GridLayout(1,4)); radioGroup=new ButtonGroup(); radioGroup.add(ISBNRB); radioGroup.add(TitleRB); radioGroup.add(AuthorRB); radioGroup.add(YearRB); P[4].add(ISBNRB); P[4].add(TitleRB); P[4].add(AuthorRB); P[4].add(YearRB); topPanel.add(P[4]); SearchBy=new JTextField(21); Find=new JButton("Find"); Find.setSize(20, 100); P[5]=new JPanel(); P[5].setLayout(new GridLayout(1,4,5,1)); P[5].add(Find); P[5].add(SearchBy); for(int i=8;i<11;i++) P[5].add(EmptyLabel[i]); topPanel.add(P[5]); // 3. 修正JTextArea构造参数,前两个int是行数和列数,不是像素,4行足够放表头+3条图书数据 P[6]=new JPanel(new BorderLayout()); SearchTextArea=new JTextArea(" ISBN Title Author Published Year Edition\nISBN Title Author Published Year Edition",4,70); SearchTextArea.setEditable(false); P[6].add(new JScrollPane(SearchTextArea)); // 4. 把顶部面板和文本区面板分别加到BorderLayout的对应位置 add(topPanel, BorderLayout.NORTH); add(P[6], BorderLayout.CENTER); setSize( 780, 580 ); setResizable(false); }
额外优化点
如果你不想改顶层布局,也可以把GridLayout换成GridBagLayout,给P[6]所在的行设置更高的weighty权重,也能实现文本区占更多高度的效果,不过综合实现复杂度来看,换BorderLayout是成本最低的方案。
内容的提问来源于stack exchange,提问作者miirajamous
相关产品推荐
相关产品推荐

