4

JFrameウィンドウに角が丸いカスタムシェイプを指定しましたが、どのようにスムーズにできますか(アンチエイリアシング)

4

1 に答える 1

8

コンテンツをどのようにレンダリングするかによって多くのことが決まりますが、基本的な概念は、描画先の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));
        }
    }
}

新しい例で更新

私が使用するトリックの 1 つは、「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();
        }
    }

}
于 2012-12-16T23:56:13.203 に答える