使用bufferStrategy

时间:2018-04-05 22:07:44

标签: java canvas jframe

我有一个代码工作,显示虚拟地球的演变。 我正在使用JFrame和bufferedStrategy绘制这个世界。

我想在它旁边绘制的世界之上添加两个可能影响地图的按钮。

这是我的尝试:

public class Window extends JFrame{

private BufferStrategy bs;
private Planete plan;
private Canvas canvasDroite = new Canvas();
private JPanel panelGauche = new JPanel();
final JButton btn = new JButton("Test");
final JButton btn2 = new JButton("Test 2");

public Window(String name, Planete p){
this.setTitle(name);                    
canvasDroite.setSize(new Dimension(Constante.longueur ,Constante.largeur));                 
this.setSize(1600,900);
this.setLocationRelativeTo(null);           
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    
this.setResizable(false);               
this.setVisible(true);                      
//this.setLayout(new BorderLayout());
canvasDroite.createBufferStrategy(3);               
bs = canvasDroite.getBufferStrategy();              
frameOrganize();
plan = p;

}

public void frameOrganize(){
    //panelGauche.add(btn);
    //panelGauche.add(btn2);
    this.add(canvasDroite);
    //this.add("West",panelGauche);
}

public void draw()
{
Graphics2D g = null; //pointeur de l'outil de dessin
do{
    try{
    g = (Graphics2D)bs.getDrawGraphics();
    if(plan != null)
        plan.draw(g);
    }
    finally
    {
        g.dispose(); 
    }
    bs.show(); 
} while (bs.contentsLost()); 
}

}

当只有框架一切正常时

我试图在JPanel中创建bufferedStrategie,但它不起作用,我只使用g.drawLine()(当我执行plan.draw(g))来更改地图,所以我试图放弃bufferStrategy并直接绘制到JPanel但我没有成功

我对Canvas的尝试也不起作用,窗口出现但没有画出来。

我还尝试对Canvas和JPanel使用paint()和repaint()。

PS:我看了很多帖子,但我从来没有见过什么时候使用paint(图形g)方法让JPanel开始绘画,这就是我使用bufferstrategy的原因,它是什么?在我看来更容易。

1 个答案:

答案 0 :(得分:-1)

我弄错了解决方案!这是我的代码,如果有人需要它,我的mystake是我不明白如何使用JPanel的paintComponent;

public class Window extends JFrame{

    private BufferStrategy bs;
    private Planete plan;
    private JPanel panelDroite = new JPanel();
    private JPanel panelGauche = new JPanel();
    final JButton btn = new JButton("yolo");
    final JButton btn2 = new JButton("yolo 2");

    public Window(String name, Planete p){
    this.setTitle(name);                    //titre de fenetre
    panelDroite.setSize(new Dimension(Constante.longueur ,Constante.largeur));              //change la taille
    this.setSize(1600,900);
    this.setLocationRelativeTo(null);           //place au centre
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    //quitte avec la croix
    this.setResizable(false);               //empeche resize
    organisageFenetre();

    this.setVisible(true);                  //rend visible

    //this.setLayout(new BorderLayout());

    plan = p;

    }

    //Créer un update

    public void organisageFenetre(){
        //panelGauche.add(btn);
        //panelGauche.add(btn2);
        this.add(panelDroite);
        //this.add("West",panelGauche);
    }

    public void paintComponent()
    {
    //dessine toute la fenetre
    Graphics g = null; //pointeur de l'outil de dessin
        try{
        g = (Graphics)panelDroite.getGraphics(); //recupere l'outil de dessin de la fenetre de dessin
        if(plan != null)
            plan.draw(g);
        }
        finally
        {
            panelDroite.repaint();
            g.dispose(); //termine l'utilisation de l'outil de dessin
        }
    }

}