如何更新Java swing背景图形?

如何更新Java swing背景图形?,java,swing,user-interface,event-handling,draw,Java,Swing,User Interface,Event Handling,Draw,如图所示,关闭菜单项后,背景网格线和黑色矩形不会更新。我如何更新它?在C#中,有一个事件处理程序使其自动更新,但我是Java swing GUI应用程序的新手 代码如下: public void paint(Graphics g) { super.paintComponents(g); MainDisplayForm mD = new MainDisplayForm(); Graphics2D g2 = (Graphics2D) g; g2.

如图所示,关闭菜单项后,背景网格线和黑色矩形不会更新。我如何更新它?在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);          
  }      
}
使用
repaint()
刷新/更新组件

何时使用
repaint()

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

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

何时使用
repaint()

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

不要重写paint()并调用super.paintComponents()

自定义绘制通过重写JPanel(或JComponent)的paintComponent()方法完成,然后调用super.paintComponent()

如果需要更多帮助,请张贴演示问题的帖子。

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

自定义绘制通过重写JPanel(或JComponent)的paintComponent()方法完成,然后调用super.paintComponent()


如果需要更多帮助,请张贴演示问题的帖子。

当菜单关闭时,请呼叫“重新打印”窗口


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

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



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

我已经尝试过了,但它会在矩形后面绘制菜单项,然后再次绘制。我在菜单上创建了一个事件处理程序,在屏幕上创建了鼠标移动事件,但我想知道我使用的事件处理程序不是您提到的那个。Thx。@user1098761您尝试了什么?你能在帖子中添加一些代码来显示你在哪里使用了repaint()吗?我尝试了一些不同的事件处理程序。现在它可以很好地与MenuDeselected(javax.swing.event.MenuEvent evt)配合使用。谢谢我已经试过了,但是它在矩形后面画了菜单项,然后又画了一次。我在菜单上创建了一个事件处理程序,在屏幕上创建了鼠标移动事件,但我想知道我使用的事件处理程序不是您提到的那个。Thx。@user1098761您尝试了什么?你能在帖子中添加一些代码来显示你在哪里使用了repaint()吗?我尝试了一些不同的事件处理程序。现在它可以很好地与MenuDeselected(javax.swing.event.MenuEvent evt)配合使用。谢谢那个菜单被取消了吗(javax.swing.event.MenuEvent evt)?我从来没有遇到过这个问题,但我想应该是这样的,比如接受或选择菜单之类的东西。您必须同时实现这两个功能,以便在取消时和由于用户选择了某些内容而关闭菜单时都能重新绘制。谢谢!!!它被选中了(javax.swing.event.MenuEvent evt)!!!现在,它可以很好地使用其中的repaint()。-1,当菜单关闭时,不需要调用repaint()。您还有一些其他问题。菜单被取消了吗(javax.swing.event.MenuEvent evt)?我从来没有遇到过这个问题,但我想应该是这样的,比如接受或选择菜单之类的东西。您必须同时实现这两个功能,以便在取消时和由于用户选择了某些内容而关闭菜单时都能重新绘制。谢谢!!!它被选中了(javax.swing.event.MenuEvent evt)!!!现在,它可以很好地使用其中的repaint()。-1,当菜单关闭时,不需要调用repaint()。您还有一些其他问题。
MainDisplayForm mD=newmaindisplayform()那行代码应该做什么?通常,您不应该在
paint()
paintComponent()
方法中创建组件。什么是
MainDisplayForm
?为了重申camickr提到的内容,为了更快地获得更好的帮助,请发布一个.MainDisplayForm mD=newmaindisplayForm()那行代码应该做什么?通常,您不应该在
paint()
paintComponent()
方法中创建组件。什么是
MainDisplayForm
?为了重申camickr提到的内容,为了更快地获得更好的帮助,请发布一条@user1098761这不是任何形式的注释。我尝试用repaint()调用super.paintComponents()。这也解决了一些眨眼的问题。谢谢@user1098761这不是任何形式的注释。我已尝试使用repaint()调用super.paintComponents()。这也解决了一些眨眼的问题。谢谢
private void jMenu2MenuDeselected(javax.swing.event.MenuEvent evt) {
    repaint();
}