Java Swing: JScrollPane не расширяется, чтобы вместить в него JPanel - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть JTabel, и я хочу добавить его к JScrollPane. Но у JScrollPane очень маленький размер. Я попытался установить для таблицы значение JPanel (имеет размер), а затем для JPanel значение JScrollPane, но оно не работает.

Вот мой код:

 static public class PnGiaoDich extends JPanel{
    public PnGiaoDich(){
        //size & background
        setPreferredSize( new Dimension(1050, 435));
        setBackground(new Color(255,255,255));

        //layout
        setLayout(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints(); 

        //create table
        String[] columnNames = {"Ngày giao dịch",
                    "Loại gio dịch | Mô tả",
                    "Tình trạng",
                    "Số tiền"
                    };

        Object[][] data = {
                        {"","","",""},
                        {"","","",""},
                        {"","","",""},
                        {"","","",""}
                        };

        JTable table = new JTable(data,columnNames);
        TableColumn column = null;
        table.getColumnModel().getColumn(0).setPreferredWidth(150);
        table.getColumnModel().getColumn(1).setPreferredWidth(525);
        table.getColumnModel().getColumn(2).setPreferredWidth(150);
        table.getColumnModel().getColumn(3).setPreferredWidth(150);

        // create table to put into JScrollPane
        JPanel pnTable = new JPanel();
        pnTable.setBorder(BorderFactory.createLineBorder(Color.red));
        pnTable.setPreferredSize(new Dimension(800, 600));
        pnTable.add(table);
        //Add panel to JScrollPane
        JScrollPane scrollpn = new JScrollPane(pnTable);
        //table.setFillsViewportHeight(true); 

        c.gridx = 0;
        c.gridy = 1;
        c.gridwidth = 2;
        c.insets = new Insets(20,20,20,20);
        c.weightx = 1;
        c.weighty = 1;
        c.anchor = GridBagConstraints.NORTH;
        add(scrollpn,c);

       //
    }
}

Но если я отправлю этот код на основной JFrame, он будет работать правильно.

Вот весь мой код: введите описание ссылки здесь

Изображение моей JScrollPane:

image

1 Ответ

0 голосов
/ 02 ноября 2018

Хорошо, давайте просто прогуляемся ...

setPreferredSize( new Dimension(1050, 435));

... постарайтесь избежать этого. Если вам «нужно», то вместо этого переопределите getPreferredSize, так как setPreferredSize является уязвимостью для вашего «стабильного» интерфейса

setBackground(new Color(255,255,255));

//layout
setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints(); 

//create table
String[] columnNames = {"Ngày giao dịch",
            "Loại gio dịch | Mô tả",
            "Tình trạng",
            "Số tiền"
            };

Object[][] data = {
                {"","","",""},
                {"","","",""},
                {"","","",""},
                {"","","",""}
                };

JTable table = new JTable(data,columnNames);
TableColumn column = null;
table.getColumnModel().getColumn(0).setPreferredWidth(150);
table.getColumnModel().getColumn(1).setPreferredWidth(525);
table.getColumnModel().getColumn(2).setPreferredWidth(150);
table.getColumnModel().getColumn(3).setPreferredWidth(150);

Хорошо, пока неплохо ...

// create table to put into JScrollPane
JPanel pnTable = new JPanel();
pnTable.setBorder(BorderFactory.createLineBorder(Color.red));
pnTable.setPreferredSize(new Dimension(800, 600));
pnTable.add(table);
//Add panel to JScrollPane
JScrollPane scrollpn = new JScrollPane(pnTable);
//table.setFillsViewportHeight(true); 

И ... что? Зачем добавлять JTable к JPanel, который использует FlowLayout, а затем к нему добавляется JScrollPane? Почему бы просто не добавить JTable к самому JScrollPane?

Кроме того, выполняя это, вы вверните возможность JTable и JScrollPane разговаривать друг с другом и определять, когда должна происходить прокрутка.

c.gridx = 0;
c.gridy = 1;
c.gridwidth = 2;
c.insets = new Insets(20,20,20,20);
c.weightx = 1;
c.weighty = 1;
c.anchor = GridBagConstraints.NORTH;
add(scrollpn,c);

c.gridwidth = 2;? Хотя это, вероятно, не даст эффекта, возникает больше вопросов о том, почему?

Решение ...

Хорошо, после изучения ограничений и удаления лишних JPanel проблема сводится к

setPreferredSize( new Dimension(1050, 435));

и, вероятно, не помогло pnTable.setPreferredSize(new Dimension(800, 600));

Я, по сути, сократил код до следующего, что "в основном" работает ...

static public class PnGiaoDich extends JPanel {

    public PnGiaoDich() {
        setBackground(Color.WHITE);

        //layout
        setLayout(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();

        //create table
        String[] columnNames = {"Ngày giao dịch",
            "Loại gio dịch | Mô tả",
            "Tình trạng",
            "Số tiền"
        };

        Object[][] data = {
            {"", "", "", ""},
            {"", "", "", ""},
            {"", "", "", ""},
            {"", "", "", ""}
        };

        JTable table = new JTable(data, columnNames);
        table.getColumnModel().getColumn(0).setPreferredWidth(150);
        table.getColumnModel().getColumn(1).setPreferredWidth(525);
        table.getColumnModel().getColumn(2).setPreferredWidth(150);
        table.getColumnModel().getColumn(3).setPreferredWidth(150);

        //Add panel to JScrollPane
        table.setBorder(BorderFactory.createLineBorder(Color.RED));
        JScrollPane scrollpn = new JScrollPane(table);
        //table.setFillsViewportHeight(true); 

        c.gridx = 0;
        c.gridy = 1;
        c.insets = new Insets(20, 20, 20, 20);
        c.weightx = 1;
        c.weighty = 1;
        c.anchor = GridBagConstraints.NORTH;
        add(scrollpn, c);
    }
}
...