Java 在重叠面板上绘制形状,一个面板绘制固定面板,另一个绘制移动面板
我正在创建Swing应用程序。它是一种具有移动对象应用的路线图。我将形状组件分为两个Java 在重叠面板上绘制形状,一个面板绘制固定面板,另一个绘制移动面板,java,swing,repaint,awt-eventqueue,custom-painting,Java,Swing,Repaint,Awt Eventqueue,Custom Painting,我正在创建Swing应用程序。它是一种具有移动对象应用的路线图。我将形状组件分为两个JPanels。一个是静态组件JPanel,第二个是动态组件JPanel,两者都添加到主面板中。两个面板重叠,对于“动态组件”面板,“不透明”为false以使其透明。当我为动态组件面板重新绘制时,它也会触发静态组件面板的重新绘制。如果动态组件面板的形状发生更改,并且静态组件面板的形状不应被擦除,我不希望每次都重新绘制静态组件面板 目前我的逻辑如下。这是伪代码。 请帮助我如何绘制静态组件顶部的活动组件和启动时绘制静
JPanel
s。一个是静态组件JPanel
,第二个是动态组件JPanel
,两者都添加到主面板中。两个面板重叠,对于“动态组件”面板,“不透明”为false以使其透明。当我为动态组件面板重新绘制时,它也会触发静态组件面板的重新绘制。如果动态组件面板的形状发生更改,并且静态组件面板的形状不应被擦除,我不希望每次都重新绘制静态组件面板
目前我的逻辑如下。这是伪代码。
请帮助我如何绘制静态组件顶部的活动组件和启动时绘制静态组件
public class layeredpanel extends JFrame
{
private JPanel contentPane;
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
try
{
layeredpanel frame = new layeredpanel();
frame.setVisible(true);
} catch (Exception e)
{
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public layeredpanel()
{
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new BorderLayout(0, 0));
setContentPane(contentPane);
JPanel panel = new JPanel();
contentPane.add(panel, BorderLayout.CENTER);
panel.setLayout( new OverlayLayout(panel) );
final JPanel layer_1 = new layer1();
layer_1.setOpaque(false);
panel.add(layer_1);
JPanel layer_2 = new layer2();
panel.add(layer_2);
Thread thread = new Thread(new Runnable()
{
@Override
public void run()
{
while(true)
{try
{
Thread.sleep(500);
} catch (InterruptedException e)
{
e.printStackTrace();
}
layer_1.repaint();
}
}
});
thread.start();
}
class layer1 extends JPanel
{
@Override
public void paintComponent(Graphics g)
{
// TODO Auto-generated method stub
super.paintComponent(g);
System.out.println("Paint1");
g.setColor(Color.blue);
g.drawRect(30, 20, 40, 40);
}
}
class layer2 extends JPanel
{
@Override
public void paintComponent(Graphics g)
{
System.out.println("Paint2");
// TODO Auto-generated method stub
super.paintComponent(g);
g.setColor(Color.green);
g.fillRect(30, 20, 20, 20);}
}
}
输出:2
Paint1
Paint2
Paint1
Paint2
Paint1
Paint2
Paint1
Paint2
Paint1
Paint2
Paint1
Paint2
Paint1
这就是秋千绘画的工作方式。当您拥有透明面板时,还必须绘制父面板,以确保没有绘制瑕疵 要提高父面板的绘制效率,可以:
缓冲区图像上绘制,然后重新绘制缓冲区图像李>
重新绘制顶部面板时,可以执行重新绘制(..)
以指定要重新绘制的矩形区域。然后,也只重新绘制父面板的该部分
另外,不要使用Thread.sleep()的线程来制作动画。如果需要动画,请使用来计划重新绘制