【问题标题】:Set size of JTable in JScrollPane and in JPanel with the size of the JFrame在 JScrollPane 和 JPanel 中将 JTable 的大小设置为 JFrame 的大小
【发布时间】:2012-11-03 21:24:51
【问题描述】:

我希望表格与框架具有相同的宽度,并且当我调整框架大小时,表格也需要调整大小。我认为JTablesetSize() 不能正常工作。你能帮助我吗?

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);
            }
        });
    }
}

【问题讨论】:

  • 首先:不需要在你的JPanel上添加JScrollPane。第二:不要调用 setSize();完全调用 pack();.
  • 感谢您阅读Using Layout Managers

标签: java swing jtable jscrollpane preferredsize


【解决方案1】:

看看

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

对于您在此处发布的代码

【讨论】:

    【解决方案2】:

    摆脱所有setSize 调用。然后去掉tablePanel,直接在tableSPJFrame的内容窗格中。

    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。只用一个

    【讨论】:

    • 永远不要在 JScrollpane 中为 JTable(例如)设置 PreferredSize :-)
    • @mKorbel 我设置了JScrollPane 的首选大小。我认为这是您可以调用setXXXSize 的少数有效用例之一。它如何确定它的大小而不只是开始显示滚动条?
    【解决方案3】:

    作为替代方案,使用GridLayout 作为tablePanelpack() 封闭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);
                }
            });
        }
    }
    

    【讨论】:

      【解决方案4】:

      这是一个答案:

      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);
                  }
              });
          }
      }
      

      相当简化,但相同。 :)

      【讨论】:

        猜你喜欢
        • 2013-01-19
        • 1970-01-01
        • 2021-01-16
        • 1970-01-01
        • 1970-01-01
        • 2013-01-17
        • 2011-09-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多