/** * Paints effects for this button. The effects, if any, are listed in the <code>effects</code> * field of this object. * * @param g the Graphics2D to paint to. * @param background if true, then only the effects for the background are painted. If false, then * only the effects for the foreground are painted. */ protected void paintEffects(Graphics2D g, ButtonInfo info, boolean background) { int ctr = 0; while (ctr < info.effects.size()) { PaintUIEffect effect = info.effects.get(ctr); effect.paint((Graphics2D) g.create()); if (effect.getState() == State.FINISHED) { info.effects.remove(ctr); } else { ctr++; } } }
@Override protected void paintComponent(Graphics g0) { Graphics2D g = (Graphics2D) g0; g.scale(scale, scale); g.setRenderingHint( RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g.setColor(Color.white); g.fillRect(0, 0, (int) labelWidth, (int) labelHeight); LabelArea area = new LabelArea(labelWidth, labelHeight, 0); g.setColor(Color.black); label.print(area, (Graphics2D) g.create()); }
/** [Advanced] */ public Graphics create(int x, int y, int width, int height) { Graphics2D g = getG(); return g == null ? null : g.create(x, y, width, height); }
/** [Advanced] */ public Graphics create() { Graphics2D g = getG(); return g == null ? null : g.create(); }
/** * This calls the other relevant <code>paint...()</code> methods in this object. The layering of * the focus varies based on whether it should be painted outside or inside the filled shape, but * otherwise the layers are: * * <ul> * <li>Filling the bounds with <code>button.getBackground()</code> (if <code>button.isOpaque() * </code> is true). * <li>If <code>getShadowHighlight()</code> is non-null, painting the stroke/border 1 pixel * below its usual location. * <li><code>paintBackground(g)</code> * <li><code>paintEffects(g,false)</code> * <li><code>paintIcon(g)</code> * <li><code>paintText(g)</code> * <LI><code>paintForeground(g)</code> * <LI><code>paintEffects(g,true)</code> * </ul> */ @Override public void paint(Graphics g0, JComponent c) { AbstractButton button = (AbstractButton) c; if (isLayoutValid(button) == false) updateLayout(button, getButtonInfo(button)); if (button.isOpaque()) { g0.setColor(button.getBackground()); g0.fillRect(0, 0, button.getWidth(), button.getHeight()); } Graphics2D g = new OptimizedGraphics2D((Graphics2D) g0); g.setComposite(getComposite(button)); ButtonInfo info = getButtonInfo(button); Color highlight = fill.getShadowHighlight(button); if (highlight != null && isStrokePainted(button)) { g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g.translate(0, 1); g.setColor(highlight); g.draw(info.fill); g.translate(0, -1); } PaintFocus focus = getFocusPainting(button); boolean hasFocus = hasFocus(button); if (Boolean.FALSE.equals(hasFocus) || button.isFocusPainted() == false) focus = PaintFocus.NONE; // this shouldn't be an issue, but just in case: if (isEnabled(button) == false) focus = PaintFocus.NONE; if (focus == PaintFocus.OUTSIDE) { if (isFillOpaque()) { // the opaque fill will overwrite the inner part of // this stroke... PlafPaintUtils.paintFocus(g, info.stroke, focusSize); } else { // this still has some rendering quirks in // Quartz (remove the clipping to study closely) // ... but other than the top horizontal & vertical // line it's OK. And even those are ... partly there. Graphics2D focusG = (Graphics2D) g.create(); GeneralPath outsideClip = new GeneralPath(Path2D.WIND_EVEN_ODD); outsideClip.append(new Rectangle(0, 0, button.getWidth(), button.getHeight()), false); outsideClip.append(info.fill, false); focusG.clip(outsideClip); PlafPaintUtils.paintFocus(focusG, info.stroke, focusSize); focusG.dispose(); } } g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); paintBackground(g, info); paintEffects(g, info, true); g.setStroke(new BasicStroke(1)); if (focus == PaintFocus.INSIDE) { Graphics2D focusG = (Graphics2D) g.create(); focusG.clip(info.fill); PlafPaintUtils.paintFocus(focusG, info.stroke, focusSize); focusG.dispose(); paintStroke(g, info); } else if (focus == PaintFocus.BOTH) { paintStroke(g, info); PlafPaintUtils.paintFocus(g, info.stroke, focusSize); } else { paintStroke(g, info); } g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); paintIcon(g, info); paintText(g, info); g.setComposite(isEnabled(button) ? AlphaComposite.SrcOver : SRC_OVER_TRANSLUCENT); paintForeground(g, info); paintEffects(g, info, false); }