在JScrollPane和JPanel中设置JTable的大小,使用JFrame的大小

我希望表格的宽度与帧的宽度相同,当我调整帧的大小时,表格也需要resize。 我认为JTable setSize()无法正常工作。 你能帮助我吗?

 import java.awt.Color; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.SwingUtilities; public class Main extends JFrame { public Main() { setSize(400, 600); String[] columnNames = {"A", "B", "C"}; Object[][] data = { {"Moni", "adsad", 2}, {"Jhon", "ewrewr", 4}, {"Max", "zxczxc", 6} }; JTable table = new JTable(data, columnNames); JScrollPane tableSP = new JScrollPane(table); int A = this.getWidth(); int B = this.getHeight(); table.setSize(A, B); JPanel tablePanel = new JPanel(); tablePanel.add(tableSP); tablePanel.setBackground(Color.red); add(tablePanel); setTitle("Marks"); setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { Main ex = new Main(); ex.setVisible(true); } }); } } 

看看

 table.setPreferredScrollableViewportSize(table.getPreferredSize()); table.setFillsViewportHeight(true); 

对于您在此处发布的代码

摆脱所有setSize调用。 然后摆脱tablePanel ,直接在tableSP直接到JFrame的内容窗格。

默认情况下, JFrame的内容窗格具有BorderLayout ,并且向BorderLayout#CENTER添加组件(当您只使用不带约束的add时,这是默认设置)将确保组件采用父容器的大小。

快速调整您的代码

 public class Main extends JFrame { public Main() { String[] columnNames = {"A", "B", "C"}; Object[][] data = { {"Moni", "adsad", 2}, {"Jhon", "ewrewr", 4}, {"Max", "zxczxc", 6} }; JTable table = new JTable(data, columnNames); JScrollPane tableSP = new JScrollPane(table); tableSP.setPreferredSize( 400, 600 ); add(tableSP); setTitle("Marks"); setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE); pack(); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { Main ex = new Main(); ex.setVisible(true); } }); } } 

小方注:没有理由扩展JFrame 。 只需使用一个

作为替代方案,使用GridLayouttablePanelpack()封闭Window

 import java.awt.Color; import java.awt.GridLayout; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.SwingUtilities; public class Main extends JFrame { public Main() { String[] columnNames = {"A", "B", "C"}; Object[][] data = { {"Moni", "adsad", 2}, {"Jhon", "ewrewr", 4}, {"Max", "zxczxc", 6} }; JTable table = new JTable(data, columnNames); JScrollPane tableSP = new JScrollPane(table); int A = this.getWidth(); int B = this.getHeight(); table.setSize(A, B); JPanel tablePanel = new JPanel(new GridLayout()); tablePanel.add(tableSP); tablePanel.setBackground(Color.red); add(tablePanel); setTitle("Marks"); setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE); pack(); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { Main ex = new Main(); ex.setVisible(true); } }); } } 

这是一个答案:

 import java.awt.Color; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.SwingUtilities; import javax.swing.table.DefaultTableModel; public class Main extends JFrame { JTable table = new JTable(); DefaultTableModel model = new DefaultTableModel(new Object[][]{},new String[]{"A","B","C"}); public Main() { super("Mark"); table.setModel(model); add(new JScrollPane(table)); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { Main ex = new Main(); ex.setDefaultCloseOperation(EXIT_ON_CLOSE); ex.setLocationByPlatform(true); ex.pack(); ex.setVisible(true); } }); } } 

相当简单,但相同。 🙂