最小化/重新打开窗口后的Java JFrame重新绘制

最小化/重新打开窗口后的Java JFrame重新绘制,java,jframe,Java,Jframe,我有一个程序,使用绘画方法将车辆对象(例如汽车形状)绘制到JFrame上。但是,每当我单击屏幕绘制车辆时,我必须刷新窗口,以便显示车辆,即使添加了repaint()方法 第一张图片显示了我单击的位置。什么也没发生 最小化并打开窗口后。 import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.MouseEvent; import java.awt.event.Mous

我有一个程序,使用绘画方法将车辆对象(例如汽车形状)绘制到JFrame上。但是,每当我单击屏幕绘制车辆时,我必须刷新窗口,以便显示车辆,即使添加了repaint()方法


第一张图片显示了我单击的位置。什么也没发生

最小化并打开窗口后。

    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.util.Iterator;
    import java.util.LinkedList;
    import javax.swing.JFrame;


    /** Program specs: Draws shapes (Vehicles) that are contained within LinkedLists. 
     * When a shape is drawn over another shape it 'joins' its list. (not implemented yet, not my issue)

     */

    /**
      Creates JFrame
    */
    public class FramePanel extends JFrame implements MouseListener
    {
       private static final int FRAME_WIDTH = 600;
       private static final int FRAME_HEIGHT = 600;

       Car car; // Car is a subclass of Vehicle. It only contains a draw method.
       //Vehicle is an abstract class that only contains a draw method

       LinkedList<LinkedList<Vehicle>> list = new LinkedList<LinkedList<Vehicle>>();
       LinkedList<Vehicle> temp = new LinkedList <Vehicle>();

       /**
          Constructs the frame.
       */
       public FramePanel()
       {  
          addMouseListener(this);
          setSize(FRAME_WIDTH, FRAME_HEIGHT);

          repaint();
       }


    @Override
    public void mouseClicked(MouseEvent evt) {

    car = new Car (evt.getX(), evt.getY()); 
    temp.add(car); //Add Vehicle to LinkedList
    list.add(temp); //Add LinkedList to Collection of LinkedLists

    }

    public void mouseEntered(MouseEvent arg0) {}
    public void mouseExited(MouseEvent arg0) {}
    public void mousePressed(MouseEvent arg0) {}
    public void mouseReleased(MouseEvent arg0) {}


    public void paint(Graphics g) {
        super.paintComponents(g) ;
         Graphics2D g2 = (Graphics2D) g;

       for (LinkedList<Vehicle> veh : list){ // list is collection of Linked Lists

        Iterator<Vehicle> it = veh.iterator();
           while (it.hasNext()){
               it.next().draw(g2);
           }  
       }
    }

    public static void main(String[] args)
    {  
       JFrame frame = new FramePanel();
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       frame.setTitle("Viewer");
       frame.setVisible(true);      
    }

    }

导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.event.MouseEvent;
导入java.awt.event.MouseListener;
导入java.util.Iterator;
导入java.util.LinkedList;
导入javax.swing.JFrame;
/**程序规格:绘制LinkedList中包含的形状(车辆)。
*当一个形状在另一个形状上绘制时,它将“连接”其列表。(尚未实施,不是我的问题)
*/
/**
创建JFrame
*/
公共类FramePanel扩展JFrame实现MouseListener
{
专用静态最终整数帧_宽度=600;
专用静态最终整型框架高度=600;
Car Car;//Car是Vehicle的一个子类,它只包含一个draw方法。
//Vehicle是一个只包含draw方法的抽象类
LinkedList=新建LinkedList();
LinkedList temp=newlinkedlist();
/**
构建框架。
*/
公共框架小组()
{  
addMouseListener(这个);
设置尺寸(框宽、框高);
重新油漆();
}
@凌驾
公共无效mouseClicked(MouseEvent evt){
car=新车(evt.getX(),evt.getY());
临时添加(汽车);//将汽车添加到链接列表
list.add(temp);//将LinkedList添加到LinkedList集合
}
public void mouseEntered(MouseEvent arg0){}
public void mouseExited(MouseEvent arg0){}
public void mousePressed(MouseEvent arg0){}
public void MouseEvent arg0{}
公共空间涂料(图g){
超级组件(g);
图形2d g2=(图形2d)g;
对于(LinkedList-veh:list){//list是链接列表的集合
迭代器it=veh.Iterator();
while(it.hasNext()){
it.next().draw(g2);
}  
}
}
公共静态void main(字符串[]args)
{  
JFrame frame=新框架面板();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setTitle(“查看器”);
frame.setVisible(true);
}
}


注意:如果我在我的paint(图g)方法中添加一个repaint()语句,汽车将被绘制,但在构造函数中使用/不使用repaint()时会不希望地闪烁。我不要这个

mouseClicked
方法的最后一行添加对
repaint()
的调用将已经解决此问题

但是,还有其他几点:

  • 不要扩展
    JFrame
    (尤其不要覆盖
    JFrame
    paint
    方法)。相反,使用
    JPanel
    进行绘制,并覆盖其
    paintComponent
    方法
  • 不要让顶级类实现
    MouseListener
    接口
  • 不要将列表声明为
    LinkedList
    ,而只能声明为
    List
    ()
  • GUI应该在事件分派线程上创建
  • 字段应该是私有的(如果可能,最终的
因此,一些清理工作:

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.LinkedList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class FramePanel extends JPanel
{
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                createAndShowGUI();
            }
        });
    }

    private static void createAndShowGUI()
    {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        FramePanel framePanel = new FramePanel();
        f.getContentPane().add(framePanel);

        f.setSize(600,600);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    private final List<List<Vehicle>> list = new LinkedList<List<Vehicle>>();

    /**
      Constructs the panel.
     */
    public FramePanel()
    {  
        addMouseListener(new MouseAdapter()
        {
            @Override
            public void mouseClicked(MouseEvent e)
            {
                addCarAt(e.getX(), e.getY());
            }
        });
    }

    private void addCarAt(int x, int y)
    {
        Car car = new Car(x, y); 
        List<Vehicle> temp = new LinkedList<Vehicle>();
        temp.add(car); //Add Vehicle to LinkedList
        list.add(temp); //Add LinkedList to Collection of LinkedLists
        repaint();
    }

    @Override
    protected void paintComponent(Graphics gr) 
    {
        super.paintComponent(gr) ;
        Graphics2D g = (Graphics2D)gr;

        for (List<Vehicle> veh : list) // list is collection of Linked Lists
        { 
            for (Vehicle v : veh)
            {
                v.draw(g);
            }  
        }
    }
}
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.event.MouseAdapter;
导入java.awt.event.MouseEvent;
导入java.util.LinkedList;
导入java.util.List;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.SwingUtilities;
公共类FramePanel扩展了JPanel
{
公共静态void main(字符串[]args)
{
SwingUtilities.invokeLater(新的Runnable()
{
@凌驾
公开募捐
{
createAndShowGUI();
}
});
}
私有静态void createAndShowGUI()
{
JFrame f=新的JFrame();
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
FramePanel FramePanel=新的FramePanel();
f、 getContentPane().add(框架面板);
f、 设置大小(600600);
f、 setLocationRelativeTo(空);
f、 setVisible(真);
}
私有最终列表=新建LinkedList();
/**
构造面板。
*/
公共框架小组()
{  
addMouseListener(新的MouseAdapter()
{
@凌驾
公共无效mouseClicked(MouseEvent e)
{
addCarAt(e.getX(),e.getY());
}
});
}
私有无效地址(整数x,整数y)
{
小汽车=新车(x,y);
List temp=new LinkedList();
临时添加(汽车);//将汽车添加到链接列表
list.add(temp);//将LinkedList添加到LinkedList集合
重新油漆();
}
@凌驾
受保护的组件(图形组)
{
超级油漆组件(gr);
Graphics2D g=(Graphics2D)gr;
for(List-veh:List)//列表是链接列表的集合
{ 
用于(车辆v:veh)
{
v、 抽签(g);
}  
}
}
}

鼠标单击的
方法的最后一行添加对
重新绘制()的调用将已经解决此问题

但是,还有其他几点:

  • 不要扩展
    JFrame
    (尤其不要覆盖
    JFrame
    paint
    方法)。相反,使用
    JPanel
    进行绘制,并覆盖其
    paintComponent
    方法
  • 不要让顶级类实现
    MouseListener
    接口
  • 不要将列表声明为
    LinkedList
    ,而只能声明为
    List
    ()