java - 如何防止 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");}}
}
解决方案
g= f.getGraphics();
paintComponent(g);
- 不要使用 getGraphics()。使用这种方法完成的任何绘画都只是暂时的(正如您所注意到的)
- 不要直接调用paintComponent()。Swing 将根据需要调用 paintComponent(...) 方法并传入正确的 Graphics 对象。
绘画方法应该永远只做绘画。它不应该改变组件的状态。
因此,如果您想动态添加要绘制的形状,您有两种方法:
保留要绘制的形状的 ArrayList。创建一个类似
addShape(..)
更新 ArrayLIst 的方法。然后您的绘画代码将遍历 ArrayList 以绘制每个形状。直接绘制到 BufferedImage。然后绘制 BufferedImage。
推荐阅读
- c++ - 如何更改文本文件中序列的字母?
- c# - Why does my player health not change when I want it to
- python - Python数据框 - csv文件中的嵌套逗号
- command - 使用命令/批处理文件将字符替换为字符和换行符
- python - Matplotlib 3d 曲面图显示轴限制之外的值
- ruby - Ruby 中的 Amazon Selling Partner API 返回 MissingAuthenticationToken
- reactjs - '({ children }: { children: any; }) => JSX.Element' 类型的参数不可分配给 'Context 类型的参数
- mysql - 使用 Sequlizer 从具有一对多关联的 3 个不同表中计算 3 列
- python - 如何让代码通过 str 输入读取数组的特定行
- visual-studio-code - VsCode多个光标在同一个变量上