Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Set size of JTable in JScrollPane and in JPanel with the size of the JFrame

I want the table with the same width as the frame and also when I resize the frame the table need to be resized too. I think setSize() of JTable doesn't work correctly. Can you help me?

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);
            }
        });
    }
}
like image 897
user1761818 Avatar asked Nov 03 '12 21:11

user1761818


People also ask

How do you size a JTable?

This can be done easily using these two methods of the JTable class: setRowHeight(int row, int rowHeight): sets the height (in pixels) for an individual row. setRowHeight(int rowHeight): sets the height (in pixels) for all rows in the table and discards heights of all rows were set individually before.

How do I change the width of a JTable?

By default the width of a JTable is fixed, we can also change the width of each column by using table. getColumnModel(). getColumn(). setPreferredWidth() method of JTable class.

Can you add a JScrollPane to a JPanel?

We can also implement a JPanel with vertical and horizontal scrolls by adding the panel object to JScrollPane.

What is JTable How is JTable created?

JTable(): A table is created with empty cells. JTable(int rows, int cols): Creates a table of size rows * cols. JTable(Object[][] data, Object []Column): A table is created with the specified name where []Column defines the column names.


3 Answers

have look at

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

for the code you posted here

like image 181
mKorbel Avatar answered Sep 18 '22 15:09

mKorbel


Get rid of all the setSize calls. Then get rid of the tablePanel and just at the tableSP directly to the content pane of the JFrame.

The content pane of a JFrame has by default a BorderLayout, and adding a component to the BorderLayout#CENTER (which is the default when you simply use add without constraints) will make sure the component takes the size of the parent container.

Quickly adjusted your code

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

Small side-note: there is no reason to extend JFrame. Just use one

like image 32
Robin Avatar answered Sep 19 '22 15:09

Robin


As an alternative, use GridLayout for your tablePanel and pack() the enclosing 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);
            }
        });
    }
}
like image 33
trashgod Avatar answered Sep 20 '22 15:09

trashgod