我给我的JFrame窗口圆角的自定义形状,但我怎么能抚平(抗锯齿)
Answer 1:
在很大程度上将归结为你如何呈现你的内容,但基本概念是提供呈现提示的Graphics
要绘制上下文...
例如,如果我画一个组成部分,我可能会使用类似...
// Create a "copy" of the graphics context so we don't modify any of it's existing
// settings. This makes it easier to manage the graphics context as we
// may not want to effect anything else that might be using this graphics context
// into the future
Graphics2D g2d = (Graphics2D)g.create();
RenderingHints hints = new RenderingHints(
RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON
);
g2d.setRenderingHints(hints);
//... continue drawing.
// Dispose of our "copy" of the graphics context
g2d.dispose();
退房控制渲染质量了解更多详情
已更新,例如
public class AATest {
public static void main(String[] args) {
new AATest();
}
public AATest() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new PaintPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class PaintPane extends JPanel {
@Override
public Dimension getPreferredSize() {
return new Dimension(215, 110);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
RenderingHints hints = new RenderingHints(
RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHints(hints);
g2d.setColor(Color.RED);
drawShape(g2d, 5, 5);
g2d.dispose();
g2d = (Graphics2D) g.create();
g2d.setColor(Color.BLUE);
drawShape(g2d, 110, 5);
g2d.dispose();
}
protected void drawShape(Graphics2D g2d, int x, int y) {
g2d.draw(new Ellipse2D.Float(x, y, 100, 100));
}
}
}
更新了新的例子
一个我用的是不是使用“setShape”的招数,我只是做一个透明的窗口,使用自定义面板为我提供我想使用的形状。
这样做的主要问题,是你现在变成责任确保内容的形状内画...
public class ShapedWindow {
public static void main(String[] args) {
new ShapedWindow();
}
public ShapedWindow() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JWindow frame = new JWindow();
frame.setBackground(new Color(0, 0, 0, 0));
frame.setContentPane(new ShapedPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
frame.setAlwaysOnTop(true);
}
});
}
public class ShapedPane extends JPanel {
public ShapedPane() {
setOpaque(false);
setLayout(new GridBagLayout());
JButton button = new JButton("Close");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
add(button);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g); //To change body of generated methods, choose Tools | Templates.
Graphics2D g2d = (Graphics2D) g.create();
RenderingHints hints = new RenderingHints(
RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHints(hints);
g2d.setColor(getBackground());
g2d.fill(new Ellipse2D.Float(0, 0, getWidth(), getHeight()));
g2d.dispose();
}
}
}
文章来源: How can I smooth my JFrame shape