2013-05-17 1 views
0

Я уверен, это что-то вроде супер-тупой стандартной проблемы, но я потратил часы на поиск и попытку получить это исправление, но это просто не сработает ... Я просто могу Не нашли ошибку здесь ...Остановить JComponent от перекрашивания при изменении состояния

Я пытаюсь создать простую программу, которая печатает что-то на JComponent. Метод paintComponent() - относится к некоторым переменным, и я хочу, чтобы JComponent ТОЛЬКО перерисовывал, если я так говорю! Но это всегда перерисовывает всякий раз, когда я изменить переменные ...

Heres код из моих 2 класса:

import java.awt.Dimension; 
import javax.swing.*; 

public class SimplePaint extends JFrame { 

/** 
* 
*/ 
private static final long serialVersionUID = 1L; 

private PaintingCanvas pc; 


public SimplePaint() { 

    super("SimplePaint"); 

    this.pc = new PaintingCanvas(); 
    this.pc.setPreferredSize(new Dimension(800, 600)); 


    this.add(pc); 
    this.setResizable(false); 
    this.setDefaultCloseOperation(EXIT_ON_CLOSE); 
    this.pack(); 
    this.setVisible(true); 
    this.setLocationRelativeTo(null); 

} 


public static void main(String[] args) { 

    SimplePaint sp = new SimplePaint(); 

    sp.pc.setxStart(50); 
    sp.pc.setyStart(60); 
    sp.pc.setxEnd(140); 
    sp.pc.setyEnd(300); 

} 



} 

и

import java.awt.Graphics; 
import java.awt.Graphics2D; 
import javax.swing.*; 

public class PaintingCanvas extends JComponent { 

/** 
* 
*/ 
private static final long serialVersionUID = 1L; 

private int xStart, yStart; 
private int xEnd, yEnd; 

@Override 
protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 

    Graphics2D g2d = (Graphics2D) g; 

    g2d.fillRect(xStart, yStart, xEnd, yEnd); 
} 

/** 
* @param xStart the xStart to set 
*/ 
public void setxStart(int xStart) { 
    this.xStart = xStart; 
} 

/** 
* @param yStart the yStart to set 
*/ 
public void setyStart(int yStart) { 
    this.yStart = yStart; 
} 


/** 
* @param xEnd the xEnd to set 
*/ 
public void setxEnd(int xEnd) { 
    this.xEnd = xEnd; 
} 

/** 
* @param yEnd the yEnd to set 
*/ 
public void setyEnd(int yEnd) { 
    this.yEnd = yEnd; 
} 

} 

Что показывает: холст с прямоугольником (50 , 60, 140, 300) ...

Что должно отображаться: пустой холст, и если я тогда помещаю sp.pc.repaint() или что-то в этом основном методе, он должен перекрасить и, следовательно, показать прямоугольник e ...

ответ

3

Вы не можете делать никаких предположений о том, когда и сколько раз будет называться paintComponent. Когда вы создаете рамку, она будет вызвана. Если вы также максимизируете свой фрейм и т. Д. ... Есть много ситуаций, когда вызывается paintComponent.

Решение довольно легко:

  • Добавить флаг (boolean drawRectangle = false;) на вашем PaintingCanvas класса
  • В paintComponent проверить значение флага и нарисовать (или нет) прямоугольник соответственно
  • Когда вы хотите, чтобы появился прямоугольник, переключите значение флага
+0

Aaaaah, спасибо большое :), это так просто, что мне стыдно за то, что не получилось идея сама ...: O – user2393914

+0

Но это вызывает другой вопрос: Я прочитал несколько руководств, в том числе этот http://www.java-forum.org/272862-post7.html (часть ниже «RICHTIGER ANSATZ») , и теперь интересно, почему я должен переименовать себя, если я работаю с кнопками, например ...?! У них есть переменные для цвета и формы, которые меняются при нажатии кнопки, и это только изменяется, если actionListener явно вызывает перерисовку ?! – user2393914

+0

@ user2393914 Вызов 'repaint' - это способ указать« RepaintManager », что внутреннее состояние вашего компонента изменилось и что вы хотите его перекрасить. В конце концов, ваш метод paintComponent будет вызван, и ваш компонент будет обновлен. Вызов 'repaint' обычно необходим для настраиваемых компонентов. –