如何在JFrame中渲染一个面板

时间:2015-01-07 12:28:58

标签: java swing user-interface render bufferstrategy

我正在创建一个应用程序,如下图粗略地说明有3个部分:顶部菜单(JPanel),侧边栏菜单(另一个JPanel)和第三部分,我称之为预览窗格(黄色部分)。预览窗格显示一个模式,该模式基于用户可以在侧边栏菜单中调整的参数(RGB类型组件等)进行渲染。

The layout of my application

由于此预览窗格必须在模式完成之前绘制多个形状,因此我使用BufferStrategy在显示之前准备图像。我已经尝试了很多不同的方法来实现这一点,并阅读了很多不同的意见,无论是否使用Canvas作为我的预览窗格,因此已经从使用JPanel到Canvas等来回发送但是无法得到这个与之合作。实现我想要的最好方法是什么?热衷于采取有关良好资源/书籍的建议。

这是我的精简代码,以便告诉我哪里出错:

import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferStrategy;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class FrameClass extends JFrame {

    Thread t1;
    public static void main(String[] args) {
        FrameClass test = new FrameClass();

        test.setup();
    }

    void setup() {
        setPreferredSize(new Dimension(800, 800));
        JPanel background = new JPanel(new BorderLayout());
        getContentPane().add(background);
        setVisible(true);
        PatternCanvas shape = new PatternCanvas();
        background.add(BorderLayout.CENTER, shape);
        pack();
        shape.repaint();
    }

    public class PatternCanvas extends Canvas  {
        BufferStrategy bs;
        public void paintComponent(Graphics g) {
          createBufferStrategy(2);
          bs = getBufferStrategy();
          System.out.println("have buffer strategy");
          Graphics2D bufferG = (Graphics2D)bs.getDrawGraphics();
          for (int i = 0; i < 5; i++) {
              int width = 50;
              int height = 50;
              bufferG.setColor(new Color(i*5,i*6,i*50));
              bufferG.fillOval(0, 0, width*i, height*i);
          }
          bufferG.dispose();
          bs.show();
      }
    }
}

1 个答案:

答案 0 :(得分:1)

  

我正在使用BufferStrategy来准备图片。

无需使用BufferStrategy来准备图像。摆动画很快。

你正试图画5个椭圆形。成千上万的椭圆形可能会画出你不会注意到性能问题。

只需按照Gimby上面给出的链接,使用标准的Swing绘画。

如果您有兴趣,请查看Custom Painting Approaches以获取一个示例,该示例显示如何在用户手动添加Rectangle时动态绘制JPanel中的矩形。