Java Graphics-repaint()不';单击->;开工前的一切
我对重绘方法有一个新问题。 有一个框架,我在其中一起画了几个图形。当我在特定的坐标范围内单击时,它应该更改一个图形的状态,然后重新绘制该特定范围。但是重新油漆不起作用。。。 这是初始化图形的方法(未显示图形声明): 以及使用方法Java Graphics-repaint()不';单击->;开工前的一切,java,swing,graphics,paintcomponent,repaint,Java,Swing,Graphics,Paintcomponent,Repaint,我对重绘方法有一个新问题。 有一个框架,我在其中一起画了几个图形。当我在特定的坐标范围内单击时,它应该更改一个图形的状态,然后重新绘制该特定范围。但是重新油漆不起作用。。。 这是初始化图形的方法(未显示图形声明): 以及使用方法updateKnopfRot的Painter-类,该方法在MouseEvent中调用: public class Painter extends JPanel { private List<Gleis> gleisList = new Arra
updateKnopfRot
的Painter
-类,该方法在MouseEvent中调用:
public class Painter extends JPanel {
private List<Gleis> gleisList = new ArrayList<>();
private List<KnopfRot> knopfList = new ArrayList<>();
//fügt ein neues Element der Liste gleisList hinzu
public void addGleis(Gleis gleis) {
gleisList.add(gleis);
}
public void addKnopfRot(KnopfRot knopf) {
knopfList.add(knopf);
}
public void updateKnopfRot(KnopfRot knopf, int x, int y, int xpos, int ypos) {
knopfList.remove(knopf);
addKnopfRot(new KnopfRot(x, y, 0, true));
}
//paint-Methode geht jedes Element der Liste gleisList durch und führt die draw-Methode in Gleis.java aus
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
for (Gleis gleis : gleisList) {
gleis.draw(g2);
}
for (KnopfRot knopf : knopfList) {
knopf.draw(g2);
}
}
}
public类Painter扩展了JPanel{
private List gleisList=new ArrayList();
private List knopfList=new ArrayList();
//新津列岛的新元素
公共无效地址(Gleis Gleis){
添加(gleis);
}
公共无效添加KnopfRot(KnopfRot knopf){
knopfList.add(knopf);
}
public void updateKnopfRot(KnopfRot knopf、int x、int y、int xpos、int ypos){
knopfList.移除(knopf);
addKnopfRot(新KnopfRot(x,y,0,true));
}
//在Gleis.java aus中,绘制元素的绘制方法
@凌驾
受保护组件(图形g){
超级组件(g);
图形2d g2=(图形2d)g;
for(Gleis-Gleis:gleisList){
gleis.draw(g2);
}
用于(KnopfRot knopf:knopfList){
knopf.draw(g2);
}
}
}
很抱歉有这么多代码,但我无法减少代码来解释/显示问题。
有人能帮忙吗?您正在
frameMouseClicked(…)
方法中创建一个新的Painter(…)
对象,然后更改此对象的状态,但这对完全不同的可视化Painter对象没有影响。您的解决方案--不要创建新的Painter对象,而是使用对原始对象的引用,然后尝试更改其状态
关于:
很抱歉有这么多代码,但我无法减少代码来解释/显示问题
如果这个答案不能解决您的问题,那么是的,您可以减少此代码,并像我们过去讨论的那样使其可运行。是的,创建和发布一个有效的,但这是值得的。您正在
frameMouseClicked(…)
方法中创建一个新的Painter(…)
对象,然后更改此对象的状态,但这对完全不同的可视化Painter对象没有影响。您的解决方案--不要创建新的Painter对象,而是使用对原始对象的引用,然后尝试更改其状态
关于:
很抱歉有这么多代码,但我无法减少代码来解释/显示问题
如果这个答案不能解决您的问题,那么是的,您可以减少此代码,并像我们过去讨论的那样使其可运行。是的,创建和发布一个有效的代码需要您付出一些努力,但这是值得的。您不需要在
画师上调用重新绘制。。。无论如何,你没有给我们所有必要的代码来理解发生了什么,第一个代码属于哪个类?@Jean BaptisteYunès:他在保存Painter实例的JFrame上调用repaint()
。这将导致组件层次结构树中的绘制调用,因此我认为这应该足够了。但我强烈支持你的建议,他创建并发布了一个。你不要在你的画师上调用重新绘制。。。无论如何,你没有给我们所有必要的代码来理解发生了什么,第一个代码属于哪个类?@Jean BaptisteYunès:他在保存Painter实例的JFrame上调用repaint()
。这将导致组件层次结构树中的绘制调用,因此我认为这应该足够了。但我强烈支持你的建议,他创建并发布一个。
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 {}
}
}
public class Painter extends JPanel {
private List<Gleis> gleisList = new ArrayList<>();
private List<KnopfRot> knopfList = new ArrayList<>();
//fügt ein neues Element der Liste gleisList hinzu
public void addGleis(Gleis gleis) {
gleisList.add(gleis);
}
public void addKnopfRot(KnopfRot knopf) {
knopfList.add(knopf);
}
public void updateKnopfRot(KnopfRot knopf, int x, int y, int xpos, int ypos) {
knopfList.remove(knopf);
addKnopfRot(new KnopfRot(x, y, 0, true));
}
//paint-Methode geht jedes Element der Liste gleisList durch und führt die draw-Methode in Gleis.java aus
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
for (Gleis gleis : gleisList) {
gleis.draw(g2);
}
for (KnopfRot knopf : knopfList) {
knopf.draw(g2);
}
}
}