Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.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_Repaint_Awt Eventqueue_Custom Painting - Fatal编程技术网

Java 在重叠面板上绘制形状,一个面板绘制固定面板,另一个绘制移动面板

Java 在重叠面板上绘制形状,一个面板绘制固定面板,另一个绘制移动面板,java,swing,repaint,awt-eventqueue,custom-painting,Java,Swing,Repaint,Awt Eventqueue,Custom Painting,我正在创建Swing应用程序。它是一种具有移动对象应用的路线图。我将形状组件分为两个JPanels。一个是静态组件JPanel,第二个是动态组件JPanel,两者都添加到主面板中。两个面板重叠,对于“动态组件”面板,“不透明”为false以使其透明。当我为动态组件面板重新绘制时,它也会触发静态组件面板的重新绘制。如果动态组件面板的形状发生更改,并且静态组件面板的形状不应被擦除,我不希望每次都重新绘制静态组件面板 目前我的逻辑如下。这是伪代码。 请帮助我如何绘制静态组件顶部的活动组件和启动时绘制静

我正在创建Swing应用程序。它是一种具有移动对象应用的路线图。我将形状组件分为两个
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()的线程来制作动画。如果需要动画,请使用来计划重新绘制