我正在尝试模仿 Java 中的 excel 界面。我有一个绘制方法,它为我绘制网格,绘制所有单元格值,然后绘制我的所有JComboBox
对象,这些对象被维护为HashMap
.
每当我调用我的重绘函数时,我都会看到组合框和其他绘图函数之间闪烁。
有人可以建议我可以用来消除这种闪烁的方法吗?
我的油漆代码如下:
public void paintCells(Graphics g) throws Exception {
int width = this.getWidth();
int height = this.getHeight();
if (this.graphics != null) g = this.graphics;
Color oldColor = g.getColor();
Font oldFont = g.getFont();
g.setColor(attr.panelBackgroudColor);
g.fillRect(0, 0, width, height);
paintHeader(g);
paintGrid(g);
int endRow = startRow + getCurrViewRowCount();
int endCol = startCol + getCurrViewColCount();
DisplayRows[] display = new DisplayRows[endCol-startCol+1];
Thread[] displays = new Thread[endCol-startCol+1];
for (int i = startCol; i <= endCol; i++) {
for (int j = startRow; j <= endRow; j++) {
paintCell(g, i, j);
}
}
paintSelectedCell(g);
g.setColor(oldColor);
g.setFont(oldFont);
for (JComboBox dropDown : this.cellGrid.getDropDowns()) {
orderedPair Pair =(orderedPair) this.getHashMapCellValues().get(this.getDropDowns().indexOf(dropDown));
int col = Pair.getFirst();
int row = Pair.getSecond();
CellElement cellValue;
try {
cellValue = new CellElement(col,row,dropDown.getSelectedItem().toString(),CellElement.CELLTYPE.NULL, CellElement.IOTYPE.INPUT);
this.getModel().addElement(cellValue);
} catch (CellTypeException ex) {
Logger.getLogger(DisplayDropDownSpreadSheets.class.getName()).log(Level.SEVERE, null, ex);
}
dropDown.setBounds(this.getCellRect(this.getModel().getElement(col, row)));
((PricingCellModel)this.getModel()).setNull(col, row);
dropDown.repaint();
}
Paint header 为我的 Excel 界面绘制标题,paint grid 绘制线条,paintcell 绘制界面中的每个单元格。