Java Graphics - 当我点击时,repaint()不起作用 - >所有工作之前

时间:2015-12-14 17:19:04

标签: java swing graphics paintcomponent repaint

我对重绘方法有一个新问题。 有一个框架,我在其中绘制几个图形。当我单击特定范围的坐标时,它应该更改一个图形的状态,然后重新绘制此特定范围。但这种重画不起作用...... 这是初始化图形的方法(图形声明未显示):

  <li><a href ng-click="openModal('signup','LoginController')">Sign In</a></li> {{test}}
  <li><a href ng-click="openModal('signup','SignupController')">Sign Up</a></li>

然后我的班级private void initComponents() { Painter painter = new Painter(); setExtendedState(MAXIMIZED_BOTH); int width = (int) getContentPane().getBounds().getWidth(); int height = (int) getContentPane().getBounds().getHeight(); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); g0 = new Gleis(25, 1, 4, 0, 0); g1 = new Gleis(26, 1, 0, 1, 0); k0 = new KnopfRot(26, 1, 0, false); g2 = new Gleis(27, 1, 0, 2, 0); g3 = new Gleis(28, 1, 0, 3, 0); g4 = new Gleis(29, 1, 0, 4, 0); g5 = new Gleis(30, 1, 0, 5, 0); g6 = new Gleis(31, 1, 0, 6, 0); g7 = new Gleis(32, 1, 0, 7, 0); g8 = new Gleis(33, 1, 0, 8, 0); g9 = new Gleis(34, 1, 0, 9, 0); g10 = new Gleis(35, 1, 0, 10, 0); g11 = new Gleis(36, 1, 0, 11, 0); g12 = new Gleis(37, 1, 0, 12, 0); g13 = new Gleis(38, 1, 0, 13, 0); k1 = new KnopfRot(38, 1, 1, false); painter.addGleis(g0); painter.addGleis(g1); painter.addKnopfRot(k0); painter.addGleis(g2); painter.addGleis(g3); painter.addGleis(g4); painter.addGleis(g5); painter.addGleis(g6); painter.addGleis(g7); painter.addGleis(g8); painter.addGleis(g9); painter.addGleis(g10); painter.addGleis(g11); painter.addGleis(g12); painter.addGleis(g13); painter.addKnopfRot(k1); this.addMouseListener(new MouseListener() { @Override public void mouseClicked(MouseEvent e) { double x = e.getX(); double y = e.getY(); frameMouseClicked(x, y); } }); this.getContentPane().add(painter); this.setVisible(true); } public void frameMouseClicked(double x, double y) { if(x >= 306 && x <= 314 && y >= 55 && y <= 63){ //x+11 y+32 Painter painter = new Painter(); painter.updateKnopfRot(k0, 26, 1, 306, 55); repaint(); } else{} }

KnopfRot

使用方法public class KnopfRot { int xposition; int yposition; int type; int id; boolean status; //Konstruktor public KnopfRot(int xpos, int ypos, int id, boolean status){ this.xposition = xpos * 11 + 12; this.yposition = ypos * 11 + 12; this.id = id; //zur eindeutigen Bezeichnung der Gleiselemente this.status = status; } public void draw(Graphics2D g) { if (!status) { Ellipse2D.Double aussen = new Ellipse2D.Double(xposition, yposition, 8, 8); Ellipse2D.Double innen = new Ellipse2D.Double(xposition + 1, yposition + 1, 6, 6); g.setColor(Color.black); g.fill(aussen); g.setColor(Color.red); g.fill(innen); } else if (status){ Ellipse2D.Double aussen = new Ellipse2D.Double(xposition, yposition, 7, 7); Ellipse2D.Double innen = new Ellipse2D.Double(xposition + 1, yposition + 1, 5, 5); g.setColor(Color.black); g.fill(aussen); g.setColor(Color.red); g.fill(innen); } else {} } } 的{​​{1}} - 类在MouseEvent中是callen:

Painter

很抱歉这么多代码,但我不能减少它来解释/显示问题。 有人可以帮忙吗?

1 个答案:

答案 0 :(得分:4)

您在new Painter(...)方法中创建frameMouseClicked(...)对象,然后更改此对象的状态,但这对完全不同的可视化Painter对象没有影响。您的解决方案 - 不要创建新的Painter对象,而是使用对原始对象的引用,然后尝试更改其状态。

关于:

  

很抱歉这么多代码,但我无法减少它来解释/显示问题。

如果这个答案没有解决您的问题,那么是的,您可以减少此代码让它可以运行,因为我们在过去。是的,您需要花费一些精力来创建和发布有效的MCVE,但这是值得的。