Из исходного вопроса (ниже) я теперь предлагаю щедрость для следующего:
Решение AlphaComposite
для закругленных углов.
- Пожалуйста, продемонстрируйте с помощью
JPanel
. - Уголки должны быть полностью прозрачными.
- Должна быть способна поддерживать JPG-роспись, но все же иметь закругленные углы.
- Нельзя использовать setClip (или любое обрезание)
- Должна иметь достойную производительность
Надеюсь, кто-то быстро подберет это, это кажется легким.
Я также награжу награду, если есть хорошо объясненная причина, почему это невозможно сделать, с которым другие согласны.
Вот пример изображения того, что я имею в виду (но используя AlphaComposite
)
Оригинальный вопрос
Я пытался найти способ сделать закругленные углы, используя композицию, очень похожую на Как сделать округленное угловое изображение в Java или http://weblogs.java.net/blog/campbell/archive/2006/07/java_2d_tricker.html.
Однако мои попытки без промежуточного BufferedImage не работают - округленный составной компонент, по-видимому, не влияет на источник. Я пробовал разные вещи, но ничего не работает. Должен быть круглый красный прямоугольник, вместо этого я получаю квадратный.
Итак, у меня есть два вопроса:
1) Есть ли способ сделать эту работу?
2) Получит ли промежуточное изображение лучшую производительность?
SSCCE:
тестовая панель TPanel
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JLabel;
public class TPanel extends JLabel {
int w = 300;
int h = 200;
public TPanel() {
setOpaque(false);
setPreferredSize(new Dimension(w, h));
setMaximumSize(new Dimension(w, h));
setMinimumSize(new Dimension(w, h));
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
// Yellow is the clipped area.
g2d.setColor(Color.yellow);
g2d.fillRoundRect(0, 0, w, h, 20, 20);
g2d.setComposite(AlphaComposite.Src);
// Red simulates the image.
g2d.setColor(Color.red);
g2d.setComposite(AlphaComposite.SrcAtop);
g2d.fillRect(0, 0, w, h);
}
}
и его Песочница
import java.awt.Dimension;
import java.awt.FlowLayout;
import javax.swing.JFrame;
public class Sandbox {
public static void main(String[] args) {
JFrame f = new JFrame();
f.setMinimumSize(new Dimension(800, 600));
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLayout(new FlowLayout());
TPanel pnl = new TPanel();
f.getContentPane().add(pnl);
f.setVisible(true);
}
}