Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java混合主动和被动渲染_Java_Swing - Fatal编程技术网

java混合主动和被动渲染

java混合主动和被动渲染,java,swing,Java,Swing,我正在开发一个有两个JPanel的应用程序。第一个JPanel用作绘图板,第二个用作属性/设置面板。因此,绘图板应使用主动渲染,第二个应使用被动渲染。它们都被添加到JFrame中 我一直在阅读java中的主动渲染,但我注意到JPanel不支持createBufferStrategy。这是否意味着我需要使用画布?canvas的问题是它不是一个容器,所以我不能向它添加组件。我也可以使用JFrame缓冲策略(但是由于标题,我必须修复位置偏移?)。。我可以使用JPanel进行主动渲染,但第二个JPane

我正在开发一个有两个JPanel的应用程序。第一个JPanel用作绘图板,第二个用作属性/设置面板。因此,绘图板应使用主动渲染,第二个应使用被动渲染。它们都被添加到JFrame中


我一直在阅读java中的主动渲染,但我注意到JPanel不支持createBufferStrategy。这是否意味着我需要使用画布?canvas的问题是它不是一个容器,所以我不能向它添加组件。我也可以使用JFrame缓冲策略(但是由于标题,我必须修复位置偏移?)。。我可以使用JPanel进行主动渲染,但第二个JPanel仍然使用被动渲染吗?

下面是一些将“被动”摆动组件与主动动画相结合的示例:

public static void main ( String[] args )
{
    JFrame frame = new JFrame ();

    JPanel view = new JPanel ( null );
    view.setPreferredSize ( new Dimension ( 500, 500 ) );
    frame.add ( view );

    JButton button1 = new JButton ( "Button 1" );
    button1.setBounds ( 10, 10, 100, 40 );
    button1.setOpaque ( false );
    view.add ( button1 );

    Animator animator = new Animator ();
    animator.setBounds ( 0, 0, 500, 500 );
    view.add ( animator );

    JButton button2 = new JButton ( "Button 2" );
    button2.setBounds ( 390, 450, 100, 40 );
    button2.setOpaque ( false );
    view.add ( button2 );

    frame.setResizable ( false );
    frame.setDefaultCloseOperation ( JFrame.EXIT_ON_CLOSE );
    frame.pack ();
    frame.setLocationRelativeTo ( null );
    frame.setVisible ( true );
}

public static class Animator extends JComponent
{
    private float angle = 0;

    public Animator ()
    {
        super ();
        setOpaque ( false );

        new Timer ( 1000 / 24, new ActionListener ()
        {
            public void actionPerformed ( ActionEvent e )
            {
                angle += 0.2f;
                if ( angle > 360 )
                {
                    angle = 0;
                }

                repaint ();
            }
        } ).start ();

        addMouseListener ( new MouseAdapter ()
        {
            //
        } );
    }

    protected void paintComponent ( Graphics g )
    {
        super.paintComponent ( g );

        Graphics2D g2d = ( Graphics2D ) g;
        g2d.setRenderingHint ( RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON );

        GeneralPath shape = getShape ();

        g2d.setPaint ( Color.BLACK );
        g2d.fill ( shape );
    }

    public boolean contains ( int x, int y )
    {
        return getShape ().contains ( x, y );
    }

    private GeneralPath getShape ()
    {
        GeneralPath gp = new GeneralPath ( GeneralPath.WIND_EVEN_ODD );
        gp.append ( new Rectangle2D.Double ( -250, 150, 1000, 200 ), false );

        AffineTransform at = new AffineTransform ();
        at.rotate ( angle * Math.PI / 90, 250, 250 );
        gp.transform ( at );
        return gp;
    }
}
正如您所看到的,黑色旋转区域不仅覆盖了右下角的按钮,而且还阻止了覆盖条纹按钮部分的鼠标事件。这是由于重写了Animator的contains()方法而发生的:

默认情况下,组件在父对象的整个边界上捕捉鼠标事件,但通过更改此方法,您可以按自己喜欢的方式进行操作

此外,还可以进行许多优化,例如在每次重新绘制后将形状保存到某个变量,并在检查“contains”值时返回它


无论如何,希望这对你的问题至少有一点帮助…

首先,我认为在标准Swing组件中使用活动渲染没有任何意义。它们具有被动渲染功能,可以优化重绘速度并最小化接口响应时间。仅当您要绘制特定的内容(例如,弹球游戏区域)时,才需要活动渲染。那么基本上,为什么要使用活动渲染呢?它是一个编辑器,其中一边是绘图区域,另一边是设置。绘图区域支持动画。。这就是为什么。。例如,在绘图区域上单击鼠标右键,然后为选定图元绘制选项菜单。创建一个自定义绘制的菜单将是一件过分的事情。在这种情况下,您可以使用任何JComponent祖先来绘制动画,并将其他组件放到它上面。稍后我会加上一个具体的例子作为回答…我不明白你的问题。您希望将被动渲染与主动渲染混合在一起—就是这样(甚至在同一面板上)。如果你想要一些完全绘制的菜单-你只需要在paintComponent方法中绘制它,并在该组件上放置一些句柄(鼠标/键侦听器)以对各种事件做出反应-仅此而已。你误解了我的问题。第一个JPanel——绘图面板——正在运行某种游戏引擎(它不使用JComponents,因为这太过分了)。第二个JPanel是一个带有输入字段和按钮的表单。我想在第一个面板上使用BufferStrategy(因为它支持硬件加速的页面翻转),而不使用画布(因此我可以添加右键单击菜单)。因此,我的问题是如何在jpanel上进行活动渲染(使用bufferStrategy),而不使用CanvasNow,我明白了。嗯,我不确定你的战略。。。看看我能不能找到有用的东西。
public boolean contains ( int x, int y )
{
    return getShape ().contains ( x, y );
}