gpt4 book ai didi

java混合主动和被动渲染

转载 作者:搜寻专家 更新时间:2023-11-01 03:42:53 24 4
gpt4 key购买 nike

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

我一直在阅读有关 java 中的主动呈现的内容,但我注意到 JPanel 不支持 createBufferStrategy。这是否意味着我需要使用 Canvas ? canvas 的问题在于它不是容器,因此我无法向其添加组件。我也可以使用 JFrame 缓冲策略(但由于标题,我必须修复位置偏移量?)。我可以使用 JPanel 主动渲染但仍然让第二个 JPanel 使用被动渲染吗?

最佳答案

下面是一些结合“被动”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;
}
}

正如你所看到的,黑色旋转区域不仅覆盖了右下角的按钮,而且还阻止了被条纹按钮覆盖的部分的鼠标事件。发生这种情况是由于覆盖了 Animator 的 contains() 方法:

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

默认情况下,组件在父级的整个边界上捕获鼠标事件,但通过更改此方法,您可以按照自己喜欢的方式使用它。

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

无论如何希望这至少对您的问题有所帮助...

关于java混合主动和被动渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10243464/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com