我如何平滑我的JFrame形状

我给我的JFrame窗口定制了一个圆angular的形状,但是我怎么平滑它(反锯齿)

很多东西会回到你如何渲染你的内容,但是基本的概念是提供你正在绘制的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(); } } }