В интерфейсе Nimbus кнопки JButton выглядят аккуратно и аккуратно, с закругленными краями и красивым фоном.
Я хотел бы отобразить JPanel с таким же внешним видом (очевидно, что у него не будет состояния нажатия и т. д.).
Какие у меня есть варианты?
Как нарисовать JPanel как Nimbus JButton?
Ответы (1)
Самый простой способ получить «кнопку» на JPanel, вероятно, расширив JPanel
и переопределив paintComponent
.
Вот внешний вид Nimbus 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);
}
}
ОБНОВЛЕНИЕ
Вот улучшенный метод paintComponent
от AgostinoX, который решил угловую проблему в моем коде.
@Override
public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_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 по умолчанию для цветов и рисунков.
person
Jonas
schedule
12.12.2011
хорошо, я просмотрел этот вопрос, это очень интересно; для бордюра, не подскажете, где взять аналогичный тому, что назначен на кнопки?
- person AgostinoX; 13.12.2011
@AgostinoX: я думаю, что нет простого способа получить такой же вид. Вы должны переопределить
paintComponent
в JPanel
и нарисовать свои собственные градиенты.
- person Jonas; 13.12.2011
прекрасная работа! Единственное, что мне не нравится, это то, как вы рисуете градиенты, вы также заполняете маленькие углы за пределами круглой границы. это видно, если вы используете градиентSize›20. Я попытался улучшить это (хорошее) решение и получил градиент с несколькими остановками, который также упрощает реализацию. Вы найдете его в моем следующем комментарии, это замена метода рисования и заменяет только вызовы fillRect одним вызовом fillRoundRect. Поскольку ответ за вами, если вы хотите сделать это улучшение, я буду счастлив принять ваш ответ :-).
- person AgostinoX; 19.12.2011
Graphics2D g2 = (Graphics2D) g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); плавающий градиентPerc = (плавающий) градиентный размер/getHeight(); LinearGradientPaint lgp = new LinearGradientPaint(0,0,0,getHeight()-1, new float[] {0, gradientPerc, 1-gradientPerc, 1f}, new Color[] {lighterColor, darkerColor, darkerColor, lightColor}); g2.setPaint(lgp); g.fillRoundRect(0, 0, getWidth()-1, getHeight()-1, градиентный размер, градиентный размер); g2.setColor(краевой цвет); g2.setStroke(edgeStroke); g.drawRoundRect(0, 0, getWidth()-1, getHeight()-1, gradientSize,gradientSize);
- person AgostinoX; 19.12.2011
@AgostinoX: Отличная работа! Я обновил свой ответ и добавил ваш код.
- person Jonas; 19.12.2011