/ / Як намалювати JPanel як кнопку Nimbus JButton? - java, swing, jpanel, jbutton, nimbus

Як намалювати JPanel як Nimbus JButton? - java, swing, jpanel, jbutton, nimbus

У вигляді та відчутті Nimbus кнопки JBut мають дуже акуратний та точний вигляд, із закругленою рамкою та гарним фоном.
Я хотів би зробити JPanel з тим самим виглядом (очевидно, що він не буде натискати стан тощо).
Які мої варіанти?

Відповіді:

5 за відповідь № 1

Найпростіший спосіб отримати "Кнопковий вигляд" на JPanel, мабуть, розширивши JPanel і замінити paintComponent.

Ось Німбус JButton дивитися:

введіть опис зображення тут

І ось моя реалізація подібного вигляду на JPanel (Я додав порожню межу навколо для показу цього прикладу, і кути не напівпрозорі):

введіть опис зображення тут

Ось мій код (використовуючи градієнти):

public class ColorDemo extends JPanel {

private final int gradientSize = 18;
private final Color lighterColor = new Color(250, 250, 250);
private final Color darkerColor = new Color(225, 225, 230);
private final Color edgeColor = new Color(140, 145, 145);
private final Stroke edgeStroke = new BasicStroke(1);
private final GradientPaint upperGradient = new GradientPaint(
0, 0, lighterColor,
0, gradientSize, darkerColor);


@Override
public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
GradientPaint lowerGradient = new GradientPaint(
0, getHeight()-gradientSize-1, darkerColor,
0, getHeight(), lighterColor);
g2.setPaint(upperGradient);
g2.fillRect(0, 0, getWidth()-1 , gradientSize);
g2.setPaint(darkerColor);
g2.fillRect(0, gradientSize, getWidth()-1, getHeight()-gradientSize-1);
g2.setPaint(lowerGradient);
g2.fillRect(0, getHeight()-gradientSize, getWidth()-1, getHeight()-1);
g2.setStroke(edgeStroke);
g2.setPaint(edgeColor);
g2.drawRoundRect(0, 0, getWidth()-1, getHeight()-1,
gradientSize/2, gradientSize/2);
}
}

UPDATE

Ось покращений paintComponent методом AgostinoX що вирішило кутовий випуск в моєму коді.

    @Override
public void paintComponent(Graphics g) {

Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALI‌​AS_ON);
float gradientPerc = (float)gradientSize/getHeight();
LinearGradientPaint lgp = new LinearGradientPaint(0,0,0,getHeight()-1,
new float[] {0, gradientPerc, 1-gradientPerc, 1f},
new Color[] {lighterColor, darkerColor, darkerColor, lighterColor});
g2.setPaint(lgp);
g.fillRoundRect(0, 0, getWidth()-1, getHeight()-1,
gradientSize, gradientSize);
g2.setColor(edgeColor);
g2.setStroke(edgeStroke);
g.drawRoundRect(0, 0, getWidth()-1, getHeight()-1,
gradientSize, gradientSize);
}

Див. Також мою відповідь на Як приховати кнопки зі стрілками в панелі JScrollBar про те, як ви можете налаштувати зовнішній вигляд Nimbus. І подивіться За замовчуванням Nimbus для кольорів та художників.