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