摆动物体在其他物体前面

时间:2014-12-03 15:20:10

标签: java swing jframe jbutton paintcomponent

我听说默认情况下,swing是双缓冲的。我没有试图摆动双缓冲。我正在使用双缓冲,我想添加一些swing对象(现在只是一个JButton添加到添加到JFrame的JPanel)。

问题是在渲染其他东西后删除其他东西的视觉效果时调用框架的绘制,重绘或paintComponents方法。在渲染其他东西之前调用方法会导致其他东西出现在swing对象的前面(现在只是一个JButton)。直接对JPanel做同样的事情似乎没有效果。

我相信我需要一种方法来绘制Jframe或JPanel添加到它而没有默认背景(灰色),这会导致窗口在设置为Color(0,0,0,0)时变为空白。

public void paint() {
    // uses double buffering system.
    do {
        do {
            Graphics2D g2d = (Graphics2D) bufferStrategy.getDrawGraphics();
            g2d.fillRect(0, 0, frame.getWidth(), frame.getHeight());
            try {// frame.paintComponents(g2d); // calling it here draws buttons to behind of the object
                rendering(g2d); // I draw other objects in this method
                // frame.paintComponents(g2d);// calling it here makes other objects disappear

        } catch (NullPointerException e) {
                e.printStackTrace();
        }
            g2d.dispose();
            } while (bufferStrategy.contentsRestored());
        bufferStrategy.show();
     } while (bufferStrategy.contentsLost());
}// method end 

这就是我设置按钮的方式:

private void setUpGUI() {
    panel = new JPanel();

    LayoutManager layout = new FlowLayout();
    panel.setLayout(layout);
    panel.setOpaque(false);//this does not seems to have any effect
    panel.setBackground(Color.yellow);//this does not seems to have any effect. this is just for testing

    JButton but1 = new JButton("but1"); 

    panel.add("but1", but1);
    frame.add(panel);

}

编辑: 这是解决方法/修复:

新的涂装方法:

public void paint() {
    // uses double buffering system.
    do {
        do {
            Graphics2D g2d = (Graphics2D) bufferStrategy.getDrawGraphics();
            g2d.fillRect(0, 0, frame.getWidth(), frame.getHeight());
            try {
                frame.paint(g2d); 

        } catch (NullPointerException e) {
                e.printStackTrace();
        }
            g2d.dispose();
            } while (bufferStrategy.contentsRestored());
        bufferStrategy.show();
     } while (bufferStrategy.contentsLost());
}// method end 

我已经覆盖了面板的绘画方法:

    @Override
    public void paint(Graphics g) {
            Graphics2D g2d = (Graphics2D) g;
            Main.main().rendering(g2d);

            super.paint(g);
            g.dispose();
            g2d.dispose();
        }
    } 

1 个答案:

答案 0 :(得分:3)

无需创建自己的BufferStategy !!!

如果要进行自定义绘制,请覆盖JPanel的paintComponent()方法,然后将面板添加到框架中。阅读Custom Painting上Swing教程中的部分,了解更多信息和示例。

然后,您仍然可以像对待任何其他面板一样向此面板添加组件。面板的布局管理器将定位组件。

panel.setOpaque(false);
panel.setBackground(Color.yellow);

setBackground(...)不执行任何操作,因为您说面板不是不透明的,这意味着将绘制父组件的背景。

 panel.add("but1", but1);

这不是您向面板添加组件的方式。正确的使用方法是:

panel.add(but1);

由于您的面板使用的是FlowLayout,因此无需指定约束。