8375573: JTable ignores setPreferredWidth during initial layout when AUTO_RESIZE_LAST_COLUMN is enabled

Reviewed-by: tr
This commit is contained in:
Prasanta Sadhukhan 2026-01-30 08:31:27 +00:00
parent 9fef14a6d3
commit 55375e98ae
2 changed files with 103 additions and 2 deletions

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1997, 2025, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 2026, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -3191,9 +3191,23 @@ public class JTable extends JComponent implements TableModelListener, Scrollable
* (maximum or minimum).
*
*/
public void doLayout() {
boolean prefWidthSet = false;
TableColumn resizingColumn = getResizingColumn();
if (resizingColumn == null) {
// doLayout is called for both pack and show
// so if initial preferred width is set by user then
// it needs to be honoured even if resizingColumn
// is set to last column on account of
// AUTO_RESIZE_LAST_COLUMN autoResizeMode
for (int i = 0; i < columnModel.getColumnCount(); i++) {
if (columnModel.getColumn(i).getPreferredWidth() != 75
&& columnModel.getColumn(i).getWidth() == 75) {
prefWidthSet = true;
break;
}
}
if (resizingColumn == null || prefWidthSet) {
setWidthsFromPreferredWidths(false);
}
else {

View File

@ -0,0 +1,87 @@
/*
* Copyright (c) 2026, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 8192888
* @key headful
* @summary Verifies JTable doesn't ignore setPreferredWidth during
* initial layout when AUTO_RESIZE_LAST_COLUMN is enabled
* @run main TestJTableColWidth
*/
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumnModel;
import javax.swing.SwingUtilities;
public class TestJTableColWidth {
static JFrame frame;
public static void main(String[] args) throws Exception {
SwingUtilities.invokeAndWait(() -> {
try {
frame = new JFrame("JTable colwidth");
String[] cols = {"ID", "Name", "Description", "Status"};
Object[][] data = {{1, "Mimi", "Testing Java 25 Regression", "Pending"}};
DefaultTableModel model = new DefaultTableModel(data, cols);
final JTable tab = new JTable(model);
tab.getTableHeader().setReorderingAllowed(false);
tab.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
TableColumnModel columnModel = tab.getColumnModel();
// Defined widths
int[] widths = {30, 200, 100, 50};
for (int i = 0; i < widths.length; i++) {
columnModel.getColumn(i).setPreferredWidth(widths[i]);
}
frame.add(new JScrollPane(tab));
frame.setSize(600, 200);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
System.out.println("Actual column widths on screen:");
for (int i = 0; i < columnModel.getColumnCount(); i++) {
System.out.println("Column " + i + ": " +
columnModel.getColumn(i).getWidth() + "px");
}
if (columnModel.getColumn(0).getWidth()
== columnModel.getColumn(1).getWidth()) {
throw new RuntimeException("JTable ignores setPreferredWidth during" +
" initial layout when AUTO_RESIZE_LAST_COLUMN is enabled");
}
} finally {
if (frame != null) {
frame.dispose();
}
}
});
}
}