GridBagLayout下JScrollPane高度无法随父容器JFrame自适应调整问题
问题描述
我在GridBagLayout布局中放置了一个内含JTable的JScrollPane,当调整承载该布局的JFrame窗口大小时,表格仅会水平缩放而不会垂直缩放,哪怕我已经将GridBagConstraints.fill属性设置为GridBagConstraints.BOTH也无法解决问题。我希望JScrollPane可以根据父容器(即JFrame)的大小,同时实现水平和垂直方向的自适应缩放。
问题代码
import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; public class GridBagPanel extends JPanel { private static final long serialVersionUID = 1L; public GridBagPanel() { super(new GridBagLayout()); String[] columns = { "Column 1", "Column 2", "Column 3", "Column 4" }; String[][] contents = { { "Content 1", "Content 2", "Content 3", "Content 4", "Content 5" }, { "Content 1", "Content 2", "Content 3", "Content 4", "Content 5" }, { "Content 1", "Content 2", "Content 3", "Content 4", "Content 5" }, { "Content 1", "Content 2", "Content 3", "Content 4", "Content 5" } }; GridBagConstraints gbc = new GridBagConstraints(); gbc.gridwidth = GridBagConstraints.RELATIVE; gbc.fill = GridBagConstraints.BOTH; gbc.weightx = 1; gbc.weighty = 1; gbc.gridx = 0; gbc.gridy = 0; JTable table = new JTable(contents, columns); add(new JScrollPane(table), gbc); gbc.weightx = 1; gbc.weighty = 1; gbc.gridx = 0; gbc.gridy = 1; JButton button = new JButton("Button"); JPanel panel = new JPanel(); panel.add(button); add(panel, gbc); } public static void main(String[] args) { JFrame frame = new JFrame(); GridBagPanel gbp = new GridBagPanel(); frame.add(gbp); frame.pack(); frame.setVisible(true); } }
运行效果

需求说明
需要将滚动面板视口的高度与父容器高度绑定,让整个JFrame窗口都能被组件填满,同时按钮需要紧贴滚动面板的边框,不要出现截图中的留白情况。
修复方案
将布局替换为BorderLayout即可实现需求,修复后代码如下:
import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import java.awt.BorderLayout; public class LayoutTest { public static void main(String[] args) { String[] columns = { "Column 1", "Column 2", "Column 3", "Column 4" }; String[][] contents = { { "Content 1", "Content 2", "Content 3", "Content 4", "Content 5" }, { "Content 1", "Content 2", "Content 3", "Content 4", "Content 5" }, { "Content 1", "Content 2", "Content 3", "Content 4", "Content 5" }, { "Content 1", "Content 2", "Content 3", "Content 4", "Content 5" } }; JFrame frame = new JFrame(); JPanel wrapper = new JPanel(); JPanel buttonPanel = new JPanel(); JButton button = new JButton("Button"); JTable table = new JTable(contents, columns); JScrollPane scrollpane = new JScrollPane(table); wrapper.setLayout(new BorderLayout()); buttonPanel.add(button); wrapper.add(scrollpane, BorderLayout.CENTER); wrapper.add(buttonPanel, BorderLayout.PAGE_END); frame.add(wrapper); frame.pack(); frame.setVisible(true); } }
内容的提问来源于stack exchange,提问作者Luqus
相关产品推荐
相关产品推荐

