我正在建立一个程序,用户可以在其中添加“地点”;地图是JPanel中的背景图像,单击该程序时,程序会创建我的城市类的实例,并绘制/绘制用户单击的点。
通过涂抹涂料组成图纸;像这样:
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来解决,只能选择两个城市(然后可以进行进一步的操作)。
boolens是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);
}
}
此代码进行更改,但仅在创建新城市时,然后对所有城市进行更改。
对不起,我对这里的逻辑很新鲜。
答案 0 :(得分:3)
尝试这样的事情:
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);
}
}
答案 1 :(得分:1)
您可以将城市置于“活动”或“非活动”的数据结构中,并在上面使用if语句来更改模型状态的显示颜色吗?
答案 2 :(得分:1)