当前位置: 首页 > 知识库问答 >
问题:

混合主动和被动渲染的 java

何承
2023-03-14

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

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

共有1个答案

吕皓
2023-03-14

以下是将“被动”Swing 组件和主动动画相结合的一些示例:

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;
    }
}

如您所见,黑色旋转区域不仅覆盖了右下按钮,还阻止了被条纹按钮覆盖的部分上的鼠标事件。这是由于overriden Animator的包含()方法造成的:

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

默认情况下,组件会捕捉父级中整个边界上的鼠标事件,但通过更改此方法,您可以按照自己的方式进行操作。

还可以做很多优化,例如在每次重新绘制某个变量后保存形状,并在检查“包含”值时返回它。

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

 类似资料:
  • 使用 aerender 自动渲染 可执行文件 aerender.exe 是具有命令行接口的程序,可用于自动执行渲染。该可执行文件与主 After Effects 应用程序位于同一文件夹中。此文件的默认位置为: Windows:\Program Files\Adobe\Adobe After Effects CC\Support Files Mac OS:/Applications/Adobe Af

  • 问题内容: 在React JSX中,似乎无法执行以下操作: 我收到一个解析错误:意外令牌{。这不是React可以处理的吗? 我正在设计此组件,以便在内部隐藏的值将包含有效的HTML元素(h1,p等)。有什么办法可以使这项工作吗? 问题答案: 您不应该将组件子弹放在花括号中: 这是一个有效的小提琴:http : //jsfiddle.net/kb3gN/6668/ 此外,您还可以找到JSX编译器,有

  • 因此,我试图用几个HTML输入创建一个动态表单。我有一个对象数组,其中包含应该呈现的的。目前,我能够呈现两个输入,如文本区域,但我如何处理收音机,复选框,选择连同他们的选项?任何帮助都将不胜感激。 请参见此CodeSandBox。

  • 我有一个骨干应用程序,我正在构建与Trigger.io,并有一点困惑,为什么当我单击手机工具栏中的后退按钮时,数据正在消失。 以下是设置: 我有一个视图SearchResultsView,看起来像这样(为了简洁起见删除了Trigger.io代码): 以下是模板: 这是路由器: 它在实践中是这样工作的:当我最初加载页面时,没有结果列表(应该是这样)。我输入查询并执行搜索,然后它会回来,按照它应该的方

  • 问题内容: 我正在尝试在angularjs中实现一个插件系统,该系统将允许用户配置他们将在特定页面上看到的“小部件”。每个窗口小部件均由控制器和模板(URL)定义。是否可以创建一个实例化控制器,使用模板调用它并包含结果内容的指令? 目标是这样的: 问题答案: 有两种方法可以做到这一点; 一种是使用已经可用的helper指令(例如和),第二种是手动的;手动版本 可能 会更快,但我不确定。 简单方法:

  • 曾经写过一段JavaScript代码,因为涉及到需要循环调用某个函数来实现动画的功能,很自然地,我想到了使用setInterval函数(或者setTimeout,大家是否有类似经历呢?),然后心满意足地很快的搞定。结束后,朋友帮忙阅读了一下代码,他提醒我是不是可以考虑使用requestAnimationFrame。之前一直知道这个函数,也知道一些它的一些优点,问题是为什么呢?本着追究到底的精神,决