最小化/重新打开窗口后的Java JFrame重新绘制
我有一个程序,使用绘画方法将车辆对象(例如汽车形状)绘制到JFrame上。但是,每当我单击屏幕绘制车辆时,我必须刷新窗口,以便显示车辆,即使添加了repaint()方法最小化/重新打开窗口后的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
第一张图片显示了我单击的位置。什么也没发生 最小化并打开窗口后。
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
()