@Override protected void paintComponent(Graphics g) { measures.ensureComputed(g); Rectangle clip = g.getClipBounds(); if (isOpaque()) { g.setColor(getBackground()); g.fillRect(clip.x, clip.y, clip.width, clip.height); } long addr0 = model.getFirstOffset(); long addr1 = model.getLastOffset(); long xaddr0 = measures.toAddress(0, clip.y); if (xaddr0 == addr0) xaddr0 = measures.getBaseAddress(model); long xaddr1 = measures.toAddress(getWidth(), clip.y + clip.height) + 1; highlighter.paint(g, xaddr0, xaddr1); g.setColor(getForeground()); Font baseFont = g.getFont(); FontMetrics baseFm = g.getFontMetrics(baseFont); Font labelFont = baseFont.deriveFont(Font.ITALIC); FontMetrics labelFm = g.getFontMetrics(labelFont); int cols = measures.getColumnCount(); int baseX = measures.getBaseX(); int baseY = measures.toY(xaddr0) + baseFm.getAscent() + baseFm.getLeading() / 2; int dy = measures.getCellHeight(); int labelWidth = measures.getLabelWidth(); int labelChars = measures.getLabelChars(); int cellWidth = measures.getCellWidth(); int cellChars = measures.getCellChars(); for (long a = xaddr0; a < xaddr1; a += cols, baseY += dy) { String label = toHex(a, labelChars); g.setFont(labelFont); g.drawString( label, baseX - labelWidth + (labelWidth - labelFm.stringWidth(label)) / 2, baseY); g.setFont(baseFont); long b = a; for (int j = 0; j < cols; j++, b++) { if (b >= addr0 && b <= addr1) { String val = toHex(model.get(b), cellChars); int x = measures.toX(b) + (cellWidth - baseFm.stringWidth(val)) / 2; g.drawString(val, x, baseY); } } } caret.paintForeground(g, xaddr0, xaddr1); }