Skip to content

Commit 371f107

Browse files
hansonrhansonr
authored andcommitted
JTableHeader update fix
1 parent c8fcb07 commit 371f107

File tree

6 files changed

+126
-82
lines changed

6 files changed

+126
-82
lines changed

sources/net.sf.j2s.java.core/src/javax/swing/JTable.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3723,10 +3723,12 @@ public boolean editCellAt(int row, int column, EventObject e) {
37233723
comp.setVisible(true);
37243724
// force domNode to be visible as well as outer node
37253725
comp.秘getUI().setVisible(null, true);
3726+
JTable me = this;
37263727
SwingUtilities.invokeLater(new Runnable() {
37273728
@Override
37283729
public void run() {
3729-
comp.requestFocus();
3730+
if (me.hasFocus())
3731+
comp.requestFocus();
37303732
}
37313733
});
37323734
}

sources/net.sf.j2s.java.core/src/swingjs/plaf/CellHolder.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,5 +57,15 @@ public static void setJ2SRendererComponent(JComponent comp) {
5757
comp.秘getUI().setRenderer(comp, 0, 0, null);
5858
}
5959

60+
public static DOMNode findOrCreateNode(JSComponentUI ui, int row, int col, int tx, int ty, int w, DOMNode tr) {
61+
DOMNode td = findCellNode(ui, null, row, col);
62+
if (td == null) {
63+
td = createCellOuterNode(ui, row, col);
64+
tr.appendChild(td);
65+
}
66+
DOMNode.setStyles(td, "left", tx + "px", "width", w + "px", "height", "inherit", "top", ty + "px");
67+
return td;
68+
}
69+
6070

6171
}

sources/net.sf.j2s.java.core/src/swingjs/plaf/JSComponentUI.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1499,7 +1499,9 @@ protected void setMnemonic(int newValue) {
14991499
/**
15001500
* table cell width and height
15011501
*/
1502-
private int cellWidth, cellHeight;
1502+
private int cellWidth;
1503+
1504+
protected int cellHeight;
15031505

15041506
/**
15051507
* this ui has been disabled from receiving any events; see JTableUI

sources/net.sf.j2s.java.core/src/swingjs/plaf/JSTableHeaderUI.java

Lines changed: 40 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -171,15 +171,20 @@ protected void addChildrenToDOM(Component[] children, int n) {
171171
DOMNode.setStyle(headdiv, "height", thh + "px");
172172
domNode.appendChild(headdiv);
173173
for (int col = 0, tx = 0; col < ncols; col++) {
174-
DOMNode td = CellHolder.createCellOuterNode(this, -1, col);
175-
DOMNode.setStyles(td, "width", cw[col] + "px", "height", thh + "px", "left", tx + "px", "top", "0px");
176-
tx += cw[col];
177-
headdiv.appendChild(td);
178-
CellHolder.updateCellNode(td, (JSComponent) getHeaderComponent(col), cw[col], thh);
174+
int w = cw[col];
175+
DOMNode td = CellHolder.findOrCreateNode(this, -1, col, tx, 0, w, headdiv);
176+
updateCellNode(td, col, w, thh);
177+
tx += w;
179178
}
180179

181180
}
182181

182+
private void updateCellNode(DOMNode td, int col, int w, int thh) {
183+
JSComponent c = (JSComponent) getHeaderComponent(col, w, thh, td);
184+
if (c != null)
185+
CellHolder.updateCellNode(td, c, -1, -1);
186+
}
187+
183188
private static Cursor resizeCursor = Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR);
184189

185190
//
@@ -727,7 +732,6 @@ public void paint(Graphics g, JComponent c) {
727732
working = true;
728733

729734
boolean ltr = tableHeader.getComponentOrientation().isLeftToRight();
730-
731735
Rectangle clip = g.getClipBounds();
732736
Point left = clip.getLocation();
733737
Point right = new Point(clip.x + clip.width - 1, clip.y);
@@ -798,13 +802,12 @@ public void paint(Graphics g, JComponent c) {
798802

799803
private void paintGrid(Graphics g, int cMin, int cMax) {
800804
g.setColor(table.getGridColor());
801-
805+
int h = tableHeader.getHeight();
802806
table._getCellRect(0, cMin, true, JSTableUI.minCell);
803807
table._getCellRect(0, cMax, true, JSTableUI.maxCell);
804808
Rectangle damagedArea = JSTableUI.minCell.union(JSTableUI.maxCell);
805-
int tableHeight = getHeaderHeight();
806809
if (table.getShowHorizontalLines()) {
807-
g.drawLine(0, tableHeight - 1, damagedArea.width, tableHeight - 1);
810+
g.drawLine(0, h - 1, damagedArea.width, h - 1);
808811
}
809812
if (table.getShowVerticalLines()) {
810813
TableColumnModel cm = table.getColumnModel();
@@ -814,14 +817,15 @@ private void paintGrid(Graphics g, int cMin, int cMax) {
814817
for (int column = cMin; column <= cMax; column++) {
815818
int w = cm.getColumn(column).getWidth();
816819
x += w;
817-
g.drawLine(x - 1, 0, x - 1, tableHeight - 1);
820+
g.drawLine(x, 0, x, h - 1);
821+
// BH don't know why we need x not x-1 here and below
818822
}
819823
} else {
820824
x = damagedArea.x;
821825
for (int column = cMax; column >= cMin; column--) {
822826
int w = cm.getColumn(column).getWidth();
823827
x += w;
824-
g.drawLine(x - 1, 0, x - 1, tableHeight - 1);
828+
g.drawLine(x, 0, x, h - 1);
825829
}
826830
}
827831
}
@@ -831,27 +835,40 @@ private void paintGrid(Graphics g, int cMin, int cMax) {
831835
// Paint Methods and support
832836
//
833837

834-
private Component getHeaderComponent(int columnIndex) {
835-
TableColumn aColumn = tableHeader.getColumnModel().getColumn(columnIndex);
838+
private JSComponent getHeaderComponent(int col) {
839+
return getHeaderComponent(col, 0, 0, null);
840+
}
841+
private JSComponent getHeaderComponent(int col, int w, int h, DOMNode td) {
842+
TableColumn aColumn = tableHeader.getColumnModel().getColumn(col);
836843
TableCellRenderer renderer = aColumn.getHeaderRenderer();
837844
if (renderer == null) {
838845
renderer = tableHeader.getDefaultRenderer();
839846
}
840847

841-
boolean hasFocus = !tableHeader.isPaintingForPrint() && (columnIndex == getSelectedColumnIndex())
848+
boolean hasFocus = !tableHeader.isPaintingForPrint() && (col == getSelectedColumnIndex())
842849
&& tableHeader.hasFocus();
843850

844851
JComponent c = (JComponent) renderer.getTableCellRendererComponent(tableHeader.getTable(), aColumn.getHeaderValue(), false, hasFocus,
845-
-1, columnIndex);
852+
-1, col);
853+
if (c != null && td != null) {
854+
JSTableUI.prepareCellRendererUI(c, false, w, h, td, true, tableHeader);
855+
}
846856
return c;
847857
}
848858

849859
private void paintCell(Graphics g, Rectangle cellRect, int columnIndex) {
850860
// System.out.println("paintCell header" + columnIndex);
851-
JComponent c = (JComponent) getHeaderComponent(columnIndex);
852-
c.秘getUI().setRenderer(c, cellRect.width, cellRect.height, null);
853-
rendererPane.paintComponent(g, c, tableHeader, cellRect.x, cellRect.y, cellRect.width, cellRect.height,
854-
true);
861+
DOMNode td = CellHolder.findCellNode(this, null, -1, columnIndex);
862+
if (td == null)
863+
return;
864+
int w = cellRect.width;
865+
int h = cellRect.height;
866+
JComponent comp = (JComponent) getHeaderComponent(columnIndex, w, h, td);
867+
if (comp == null)
868+
return;
869+
rendererPane.paintComponent(g, comp, tableHeader, cellRect.x, cellRect.y, w, h, true);
870+
if (td != null)
871+
comp.秘getUI().setRenderer(null, 0, 0, td);
855872
}
856873

857874
private int viewIndexForColumn(TableColumn aColumn) {
@@ -877,8 +894,10 @@ private int getHeaderHeight() {
877894
boolean isDefault = (aColumn.getHeaderRenderer() == null);
878895

879896
if (!isDefault || !accomodatedDefault) {
880-
Component comp = getHeaderComponent(column);
881-
int rendererHeight = comp.getPreferredSize().height;
897+
898+
JSComponent comp = getHeaderComponent(column);
899+
JSComponentUI ui = comp.秘getUI();
900+
int rendererHeight = (ui.isUIDisabled ? ui.cellHeight : comp.getPreferredSize().height);
882901
height = Math.max(height, rendererHeight);
883902

884903
// Configuring the header renderer to calculate its preferred size

sources/net.sf.j2s.java.core/src/swingjs/plaf/JSTableUI.java

Lines changed: 61 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ private JSTableHeaderUI getHeaderUI() {
289289
* @param col
290290
* @return
291291
*/
292-
private JSComponent getCellComponent(TableCellRenderer renderer, int row, int col, int w, int h, DOMNode td,
292+
private JSComponent getCellRendererComponent(TableCellRenderer renderer, int row, int col, int w, int h, DOMNode td,
293293
boolean fullPaint) {
294294
// SwingJS adds the idea that the default renderers need only be prepared once
295295
// the
@@ -298,27 +298,33 @@ private JSComponent getCellComponent(TableCellRenderer renderer, int row, int co
298298
// one.
299299
JSComponent cNoPrep = /** @j2sNative renderer.秘getComponent$ && renderer.秘getComponent$() || */
300300
null;
301-
JSComponent c = (cNoPrep == null ? (JSComponent) table.prepareRenderer(renderer, row, col) : cNoPrep);
301+
JSComponent c = (cNoPrep == null ? (JSComponent) table.prepareRenderer(renderer, row, col) : cNoPrep);
302302
if (c != null) {
303-
JSComponentUI ui = c.秘getUI();
304-
boolean wasDisabled = ui.isUIDisabled;
305-
c.秘reshape(c.getX(), c.getY(), w, h, false);
306-
ui.setRenderer(c, w, h, null);
307-
ui.setTargetParent(table);
308-
if (fullPaint && wasDisabled || cNoPrep != null) {
309-
// repeat, now that the UI is enabled
310-
if (wasDisabled) {
311-
ui.restoreCellNodes(td);
312-
// at this point td COULD still empty, if we wanted it to be, and
313-
// domNode is just an attribute of td.
314-
}
315-
ui.setTainted();
303+
if (prepareCellRendererUI(c, cNoPrep != null, w, h, td, fullPaint, (JComponent) table))
316304
table.prepareRenderer(renderer, row, col);
317-
}
318305
}
319306
return c;
320307
}
321308

309+
static boolean prepareCellRendererUI(JSComponent c, boolean forcePrep, int w, int h, DOMNode td, boolean fullPaint, JComponent table) {
310+
JSComponentUI ui = c.秘getUI();
311+
boolean wasDisabled = ui.isUIDisabled;
312+
c.秘reshape(c.getX(), c.getY(), w, h, false);
313+
ui.setRenderer(c, w, h, null);
314+
ui.setTargetParent(table);
315+
if (fullPaint && wasDisabled || forcePrep) {
316+
// repeat, now that the UI is enabled
317+
if (wasDisabled) {
318+
ui.restoreCellNodes(td);
319+
// at this point td COULD still empty, if we wanted it to be, and
320+
// domNode is just an attribute of td.
321+
}
322+
ui.setTainted();
323+
return true;
324+
}
325+
return false;
326+
}
327+
322328
@Override
323329
protected Component[] getChildren() {
324330
return null;
@@ -434,12 +440,7 @@ private DOMNode addElements(int rminx, int rminy, int rmaxx, int rmaxy, int h, i
434440
w = cw[col];
435441
if (tx + w < rminx)
436442
continue;
437-
DOMNode td = CellHolder.findCellNode(this, null, row, col);
438-
if (td == null) {
439-
td = CellHolder.createCellOuterNode(this, row, col);
440-
tr.appendChild(td);
441-
}
442-
DOMNode.setStyles(td, "left", tx + "px", "width", w + "px", "height", "inherit", "top", ty + "px");
443+
DOMNode td = CellHolder.findOrCreateNode((JSComponentUI) this, row, col, tx, ty, w, tr);
443444
updateCellNode(td, row, col, w, h);
444445
if (rminx < 0)
445446
return td;
@@ -449,9 +450,9 @@ private DOMNode addElements(int rminx, int rminy, int rmaxx, int rmaxy, int h, i
449450
}
450451

451452
private void updateCellNode(DOMNode td, int row, int col, int w, int h) {
452-
JSComponent cell = (JSComponent) getCellComponent(table.getCellRenderer(row, col), row, col, w, h, td, true);
453-
if (cell != null)
454-
CellHolder.updateCellNode(td, cell, -1, -1);
453+
JSComponent c = (JSComponent) getCellRendererComponent(table.getCellRenderer(row, col), row, col, w, h, td, true);
454+
if (c != null)
455+
CellHolder.updateCellNode(td, c, -1, -1);
455456
}
456457

457458
JComponent editorComp;
@@ -2399,49 +2400,50 @@ private void paintCells(Graphics g, int rMin0, int rMax0, int rMin, int rMax, in
23992400
havePainted = true;
24002401
}
24012402

2402-
private void paintCell(Graphics g, Rectangle cellRect, int row, int col, int h, DOMNode tr,
2403-
boolean forceNew, boolean colTainted) {
2403+
private void paintCell(Graphics g, Rectangle cellRect, int row, int col, int h, DOMNode tr, boolean forceNew,
2404+
boolean colTainted) {
24042405

24052406
if (table.isEditing() && table.getEditingRow() == row && table.getEditingColumn() == col) {
24062407
Component component = table.getEditorComponent();
24072408
if (component instanceof JTextField) {
2408-
component.setBounds(new Rectangle(cellRect.x - 2, cellRect.y - 2, cellRect.width, cellRect.height));
2409+
component.setBounds(new Rectangle(cellRect.x - 2, cellRect.y - 2, cellRect.width, cellRect.height));
24092410
} else {
24102411
component.setBounds(cellRect);
24112412
}
24122413
component.validate();
2413-
} else {
2414-
// Get the appropriate rendering component
2415-
// and switch its ui domNode to the one for the
2416-
// given row and column. Painting the component
2417-
// then modifies this particular cell. and switch it back
2418-
DOMNode td = (forceNew || tr == null ? null : CellHolder.findCellNode(this, null, row, col));
2419-
boolean newtd = (td == null);
2420-
if (newtd) {
2421-
td = addElement(row, col, h);
2422-
} else if (colTainted) {
2423-
DOMNode.setStyles(td, "left", cellRect.x + "px", "width", cw[col] + "px", "display", null);
2424-
} else {
2425-
DOMNode.setStyle(td, "display", null);
2426-
}
2427-
boolean fullPaint = (newtd || !havePainted || !isScrolling || table.getSelectedRowCount() > 0);
2428-
TableCellRenderer renderer = (fullPaint ? table.getCellRenderer(row, col)
2429-
: table.getCellRendererOrNull(row, col, isScrolling));
2430-
if (!fullPaint) {
2431-
// no need to paint the default renderers with nothing selected
2432-
/**
2433-
* @j2sNative if (!renderer || renderer.__CLASS_NAME__.indexOf("javax.swing.") == 0) return;
2434-
*/
2435-
}
2436-
JComponent comp = (JComponent) getCellComponent(renderer, row, col, cw[col], h, td, fullPaint);
2437-
if (comp == null)
2438-
return;
2439-
boolean shouldValidate = fullPaint && !isScrolling;
2440-
rendererPane.paintComponent(g, comp, table, cellRect.x, cellRect.y, cellRect.width, cellRect.height,
2441-
shouldValidate);
2442-
// Note that this sets ui.jc = null.
2443-
comp.秘getUI().setRenderer(null, 0, 0, td);
2414+
return;
24442415
}
2416+
// Get the appropriate rendering component
2417+
// and switch its ui domNode to the one for the
2418+
// given row and column. Painting the component
2419+
// then modifies this particular cell. and switch it back
2420+
DOMNode td = (forceNew || tr == null ? null : CellHolder.findCellNode(this, null, row, col));
2421+
boolean newtd = (td == null);
2422+
if (newtd) {
2423+
td = addElement(row, col, h);
2424+
} else if (colTainted) {
2425+
DOMNode.setStyles(td, "left", cellRect.x + "px", "width", cw[col] + "px", "display", null);
2426+
} else {
2427+
DOMNode.setStyle(td, "display", null);
2428+
}
2429+
boolean fullPaint = (newtd || !havePainted || !isScrolling || table.getSelectedRowCount() > 0);
2430+
TableCellRenderer renderer = (fullPaint ? table.getCellRenderer(row, col)
2431+
: table.getCellRendererOrNull(row, col, isScrolling));
2432+
if (!fullPaint) {
2433+
// no need to paint the default renderers with nothing selected
2434+
/**
2435+
* @j2sNative if (!renderer || renderer.__CLASS_NAME__.indexOf("javax.swing.")
2436+
* == 0) return;
2437+
*/
2438+
}
2439+
JComponent comp = (JComponent) getCellRendererComponent(renderer, row, col, cw[col], h, td, fullPaint);
2440+
if (comp == null)
2441+
return;
2442+
boolean shouldValidate = fullPaint && !isScrolling;
2443+
rendererPane.paintComponent(g, comp, table, cellRect.x, cellRect.y, cellRect.width, cellRect.height,
2444+
shouldValidate);
2445+
// Note that this sets ui.jc = null.
2446+
comp.秘getUI().setRenderer(null, 0, 0, td);
24452447
}
24462448

24472449
/*

sources/net.sf.j2s.java.core/src/test/components/TableDemo.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,15 @@ public void paint(Graphics g, JComponent c) {
151151
});
152152
btn.setMaximumSize(new Dimension(80, 20));
153153
add(btn);
154+
btn = new JButton("New headings");
155+
btn.addActionListener((e) -> {
156+
for (int i = table.getColumnModel().getColumnCount(); --i >= 0;) {
157+
table.getColumnModel().getColumn(i).setHeaderValue("col" + "abcdefghijklm".substring(0,(int) (Math.random()*10)));
158+
}
159+
table.getTableHeader().repaint();
160+
});
161+
btn.setMaximumSize(new Dimension(80, 20));
162+
add(btn);
154163

155164
}
156165

0 commit comments

Comments
 (0)