繁体   English   中英

使覆盖的paintComponent可编辑吗?

[英]Making overridden paintComponent editable?

我正在建立一个程序,使用户可以在地图上添加“地方”。 该地图是JPanel中的背景图像,单击该程序会创建我的城市类的实例,并在用户单击的位置绘制/绘制一个点。

绘制是通过覆盖paintComponent的; 像这样:

public void paintComponent(Graphics g) {
  super.paintComponent(g);
  setCursor(handCursor);
  g.setColor(Color.RED);
  g.fillOval(0, 0, 15, 15);
  g.setColor(Color.GRAY);
  g.fillOval(2, 2, 11, 11);
  g.setColor(Color.GRAY);
  g.drawString(globalString, 0, 25);
  g.setColor(Color.RED);
  g.drawString(globalString, 1, 26);
  bild.setCursor(oldCursor);
  bild.removeMouseListener(mln);
}

现在,我想以某种方式使此方法可编辑。

我的目标是让“城市”对点击做出反应(已经在城市级别解决),一次点击使城市“活跃”,另一次使城市“无效”。

我现在的问题是如何在图形本身中进行更改,即更改:

  g.setColor(Color.GRAY);
  g.fillOval(2, 2, 11, 11);

至:

  g.setColor(Color.WHITE);
  g.fillOval(2, 2, 11, 11);

是否可以再次覆盖paintComponent,还是可以调用已创建的覆盖版本?

编辑:

我正在使用两个boolenas来解决是否选择了一个城市的问题,只能选择两个城市(然后它们可以用于进一步的操作)。

布尔值是sel1和sel2

public void paintComponent(Graphics g) {

  if (sel1==false)
    { 
      super.paintComponent(g);
      setCursor(handCursor);
      g.setColor(Color.RED);
      g.fillOval(0, 0, 15, 15);
      g.setColor(Color.GRAY);
      g.fillOval(2, 2, 11, 11);
      g.setColor(Color.GRAY);
      g.drawString(globalString, 0, 25);
      g.setColor(Color.RED);
      g.drawString(globalString, 1, 26);
      bild.setCursor(oldCursor);
      bild.removeMouseListener(mln);
    }

else if(sel1==true)
    { 
      super.paintComponent(g);
      g.setColor(Color.BLACK);
      g.fillOval(0, 0, 25, 25);
      g.setColor(Color.WHITE);
      g.fillOval(2, 2, 5, 5);
      g.setColor(Color.WHITE);
      g.drawString(globalString, 0, 25);
      g.setColor(Color.BLACK);
      g.drawString(globalString, 1, 26);
    }

}

该代码可以进行更改,但仅当创建一个新城市时才进行更改,然后对所有这些进行更改。

抱歉,我对这里的逻辑很新鲜。

尝试这样的事情:

public class City extends JComponent{
    private boolean active=false;
    protected int x;
    private int y;
    public City(int x, int y){
        setBounds(x, y, 20, 20);
        setPreferredSize(new Dimension(20,20));
        setMaximumSize(new Dimension(20,20));
        setMinimumSize(new Dimension(20,20));
    }
protected void paintComponent(Graphics g){
    super.paintComponent(g);
        if(active==true)
            active(g);

        else if(active==true)
            notActive(g);
    }


public void active(Graphics g){
    g.setColor(Color.RED);
    g.fillRect(0,0,getWidth(),getHeight());
}

public void notActive(Graphics g){
    g.setColor(Color.BLUE);
    g.fillRect(0, 0, getWidth(),getHeight());
}
public boolean clicked(boolean b){
active=b;
repaint();  //repaint whenever the flag active changes
}
public boolean isActive(){
   return active;
}

其中x和y是坐标

在您的主类中://应该添加到每个城市对象的侦听器

public class cityListener extends MouseAdapter{
    public void mouseClicked(MouseEvent e){
       City current=(City)e.getSource();

               if(current.active==false)
                  current.clicked(true);
              else if(current.active==true)
                  current.clicked(false);
    }
}

您能否将您的城市放入“活动”或“非活动”的数据结构中,并在上面使用if语句来根据模型状态更改显示颜色?

  1. 1)创建一个具有其坐标的城市类
  2. 在绘画面板中,保留一个城市列表和一个选定的城市变量
  3. 在paintComponent()中,在城市==所选城市时,使用不同的颜色在城市上循环并绘制城市
  4. 在您的鼠标侦听器中,更改选定的城市变量,然后在“绘画”面板上调用repaint

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM