首页 > 解决方案 > 如何防止 JFrame 中的形状在调整窗口大小后消失

问题描述

public void actionPerformed(ActionEvent e)
 {
     try 
    {
     //récupérer les coordonnées(x,y) du text area
     int x=Integer.parseInt(f.x.getText());
     int y=Integer.parseInt(f.y.getText());
     int puissance=Integer.parseInt(f.p.getText());

     f.APs.add(new AccessPoint (x,y,f.APs.size(),puissance));

     String ch="Point d'accés "+String.valueOf(f.APs.size())+" Center xc = "+String.valueOf(x)+" yc= "+String.valueOf(x);
     System.out.println(ch);
     f.t.add(ch);

        Graphics g ;
        g= f.getGraphics();
        paintComponent(g);
    }
     catch(Exception e1){System.out.println("Erreur");}
}

public void paintComponent(Graphics g)
{   
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;
    if(f.APs.size()!=0)
    {
    try { 

        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        int currPoint =f.APs.size()-1;
        int puissance =f.APs.get(currPoint).p;
        Color C= new Color(128,puissance,puissance,puissance);
        Shape circle = new Ellipse2D.Float(f.APs.get(currPoint).x-(f.APs.get(currPoint).diametre/2), 
                                          f.APs.get(currPoint).y-(f.APs.get(currPoint).diametre/2),
                                          f.APs.get(currPoint).diametre,f.APs.get(currPoint).diametre);
        g2d.draw(circle);
        g2d.setPaint(C);
        g2d.fill(circle);

    }catch(Exception e2){System.out.println("Erreur");}}    
}

标签: javaswinggraphicsjframejpanel

解决方案


    g= f.getGraphics();
    paintComponent(g);
  1. 不要使用 getGraphics()。使用这种方法完成的任何绘画都只是暂时的(正如您所注意到的)
  2. 不要直接调用paintComponent()。Swing 将根据需要调用 paintComponent(...) 方法并传入正确的 Graphics 对象。

绘画方法应该永远只做绘画。它不应该改变组件的状态。

因此,如果您想动态添加要绘制的形状,您有两种方法:

  1. 保留要绘制的形状的 ArrayList。创建一个类似addShape(..)更新 ArrayLIst 的方法。然后您的绘画代码将遍历 ArrayList 以绘制每个形状。

  2. 直接绘制到 BufferedImage。然后绘制 BufferedImage。

可以在自定义绘画方法中找到这两种方法的工作示例


推荐阅读