Хорошо, давайте просто прогуляемся ...
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);
}
}