[英]Java - override paint(Graphics g) Method from >variable<
[英]Override paint(graphics g) Java
我在NetBeans中的GUI有点问题。 当用户在JPanel中的鼠标clic位置单击时,会绘制图像(点)。 这部分工作正常。 我将每个图像位置存储在两个不同的ArrayList中,它们分别包含X位置和Y位置。 现在,我要做的是单击按钮后删除面板中绘制的最新图像。 所以我要做的是删除两个ArrayList的最后一个索引,然后调用repaint()从X和Y ArrayList中的位置绘制所有图像(下面的代码)。
奇怪的是,我需要调整GUI的大小(全屏显示或更改其大小),以使绘制的图像再次显示在JPanel中,否则面板保持空白。
这是受影响的代码部分:
public void paint(Graphics g) {
super.paint(g);
for(int i=0;i<=listePointsX.size()-1;i++) {
try{
BufferedImage icon = ImageIO.read(getClass().getResourceAsStream("/myimage.png"));
Graphics graphe = jPanel1.getGraphics();
graphe.setColor(Color.BLACK);
graphe.drawImage(icon, this.listePointsX.get(i),this.listePointsY.get(i), rootPane);
}catch(Exception e1){
}
}
private void jButtonUndoActionPerformed(java.awt.event.ActionEvent evt) {
if(listePointsX.size()>0){
int lastObject= listePointsX.size();
listePointsX.remove(lastObject-1);
listePointsY.remove(lastObject-1);
jPanel1.repaint();
}
else{
}
}
知道我需要对某种“刷新”整个内容执行什么操作吗? 难道我做错了什么? 尝试搜索有关内容,但未发现任何问题...
Graphics graphe = jPanel1.getGraphics();
不是绘画应该如何工作,而是应该重写面板的paintComponent
方法并在其中绘制点。
有关绘画如何在Swing中工作的更多详细信息,请参见AWT中的绘画和Swing和执行自定义绘画 。
相反,您的面板应该执行所有工作,管理ArrayList
的点并绘制它们。 如果满足您的设计要求,您的父组件“可能”可以添加或删除点,但是面板的核心职责仍然是。
避免在paint
方法中执行任何长时间运行或阻塞的操作,它们应尽快运行。 由于图像永远不会改变,因此您应该只加载一次(在构造类时或第一次需要图像时),并继续使用相同的引用。
好吧,现在效果很好。 我必须按照你在这里告诉我的方式去做。 我创建了一个扩展jPanel的新类(如下)。 然后在我的主窗体中,必须创建此类的对象。 每当用户单击时,它将调用此Drawing类对象,并将一个项目添加到ArrayList中(此对象管理与创建的点有关的所有事情……看起来像这样:
public class MyDrawingClass extends JPanel {
ArrayList<Integer> arrayListPointX = new ArrayList<>();
ArrayList<Integer> arrayListPointY = new ArrayList<>();
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
try{
BufferedImage icon = ImageIO.read(getClass().getResourceAsStream("/images/dot.png"));
g.setColor(Color.BLACK);
if(arrayListPointX.size()<=0){
...
}
else{
for(int i=0;i<listePointsX.size();i++){
g.setColor(Color.BLACK);
g.drawImage(icon, listePointsX.get(i), listePointsY.get(i), rootPane);
}
}
}catch(Exception e){
...
}
}
因此,如果我想“撤消”,可以说我的“ MyDrawingClass”对象称为“绘制”。 我可以做:draw.arrayListPointX.remove(draw.arrayListPointX.size()-1); 并调用repaint(); 显示剩余点数。
感谢您的提示,谢谢! :)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.