【问题标题】:How to update Java swing background drawings?如何更新 Java swing 背景图?
【发布时间】:2012-02-21 16:07:43
【问题描述】:

正如你看到的这些图片,背景网格线和黑色矩形在菜单项关闭后没有更新。我该如何更新它?在 C# 中有一个事件处理程序可以使其自动更新,但我是 Java swing GUI 应用程序的新手。

代码如下:

public void paint(Graphics g) {

  super.paintComponents(g); 

  MainDisplayForm mD = new MainDisplayForm();           


  Graphics2D g2 = (Graphics2D) g;  

  g2.setColor(Color.BLACK);
  int gridWidth = 1240;
  int gridHeight = 400;      
  g2.fillRect(20, 50, gridWidth, gridHeight);


  g2.setColor(Color.darkGray);

  paintGrid(g2,gridWidth, gridHeight);

  g2.setColor(Color.red);
  Line2D line = new Line2D.Float(20, 50, 250, 260);               
  g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
  //g2.draw(line); //pending       

  g2.dispose();

}

private void paintGrid(Graphics g, int gridWidth, int gridHeight)
{

  for(int i=20; i<gridWidth+20; i=i+10)
  {      
      g.drawLine(i, 50, i, gridHeight+49);          
  }      

  for(int i=50; i<gridHeight+50; i=i+10)
  {      
      g.drawLine(20, i, 1259, i);          
  }      
}

//感谢cmets!!这是要添加的事件处理程序。 这必须添加到网格上绘制的每个 memu 项

private void jMenu2MenuDeselected(javax.swing.event.MenuEvent evt) {
    repaint();
}

【问题讨论】:

  • MainDisplayForm mD = new MainDisplayForm(); 那行代码应该做什么?通常,您不应在 paint()paintComponent() 方法中创建组件。什么是MainDisplayForm?重申一下 camickr 提到的内容,为了尽快获得更好的帮助,请发帖 SSCCE

标签: java swing user-interface event-handling draw


【解决方案1】:

不要覆盖 paint() 并调用 super.paintComponents()。

自定义绘画是通过覆盖 JPanel(或 JComponent)的 paintComponent() 方法完成的,然后您将调用 super.paintComponent()。

如果您需要更多帮助,请发布您的 SSCCE 以说明问题。

【讨论】:

  • @user1098761 这不是任何形式的 cmets
  • 我尝试使用 repaint() 调用 super.paintComponents()。这也解决了一些闪烁的问题。谢谢!
【解决方案2】:

使用repaint() 刷新/更新组件。

何时使用repaint()

在您将一些组件添加到面板/框架或操作某些组件后,例如当您在 Swing 动画中更改组件的位置/属性时,调用 repaint() 它将为您完成这项工作。实际上,它触发了对调用组件的update()方法的调用。

【讨论】:

  • 我已经尝试过了,但它会在矩形后面绘制菜单项并再次绘制它。我在菜单上创建了一个事件处理程序,并在屏幕上创建了鼠标移动事件,但我想知道我使用的事件处理程序不是你提到的那个。谢谢。
  • @user1098761 你尝试了什么?您可以在帖子中添加一些代码,显示您使用 repaint() 的位置吗?
  • 我尝试了一些不同的事件处理程序。现在它适用于 MenuDeselected(javax.swing.event.MenuEvent evt)。谢谢!
【解决方案3】:

当菜单关闭时调用重新打印到窗口。

不要打电话给paint(getGraphics())。而是调用repaint(),因为这会通知超级组件它也需要重绘。

【讨论】:

  • 那是 MenuCanceled(javax.swing.event.MenuEvent evt) 吗?
  • 我从来没有遇到过这个问题,但我想可能是这样,并且接受或选择了菜单之类的问题。您必须同时实现两者所以当它被取消时和菜单因为用户选择了某些东西而关闭时都会重绘。
  • 谢谢!!!这是 MenuDeselected(javax.swing.event.MenuEvent evt)!!!现在,它与 repaint() 一起工作正常。
  • -1,菜单关闭时不需要调用 repaint()。你还有其他问题。
猜你喜欢
  • 2011-01-14
  • 1970-01-01
  • 2021-08-07
  • 2023-03-14
  • 2011-05-03
  • 1970-01-01
  • 2012-02-17
  • 2012-11-08
  • 1970-01-01
相关资源
最近更新 更多