Установите размер JTable в JScrollPane и в JPanel с размером JFrame

Я хочу, чтобы таблица имела ту же ширину, что и рамка, а также, когда я изменяю размер рамки, таблица также должна быть изменена. Я думаю, что setSize() из JTable работает неправильно. Вы можете помочь мне?

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

person user1761818    schedule 03.11.2012    source источник
comment
Прежде всего: нет необходимости добавлять JScrollPane на панель JPanel. Во-вторых: не вызывайте setSize(); вообще, вызовите pack();.   -  person Branislav Lazic    schedule 04.11.2012
comment
Я благодарю вас за то, что вы прочитали Использование менеджеров компоновки   -  person MadProgrammer    schedule 04.11.2012


Ответы (4)


взгляните на

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

для кода, который вы разместили здесь

person mKorbel    schedule 03.11.2012

Избавьтесь от всех 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. Просто используйте один

person Robin    schedule 03.11.2012
comment
никогда не устанавливатьPreferredSize для JTable (например) в JScrollpane :-) - person mKorbel; 04.11.2012
comment
@mKorbel Я установил предпочтительный размер файла JScrollPane. Я думал, что это один из немногих допустимых вариантов использования, где вы можете вызвать setXXXSize. Как еще он определит свой размер, а не просто начнет показывать полосы прокрутки? - person Robin; 04.11.2012

В качестве альтернативы используйте GridLayout для вашего tablePanel и pack() для окружающего 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);
            }
        });
    }
}
person trashgod    schedule 03.11.2012

Вот ответ:

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

Довольно упрощенно, но так же. :)

person Branislav Lazic    schedule 03.11.2012