Я уверен, это что-то вроде супер-тупой стандартной проблемы, но я потратил часы на поиск и попытку получить это исправление, но это просто не сработает ... Я просто могу Не нашли ошибку здесь ...Остановить 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 ...
Aaaaah, спасибо большое :), это так просто, что мне стыдно за то, что не получилось идея сама ...: O – user2393914
Но это вызывает другой вопрос: Я прочитал несколько руководств, в том числе этот http://www.java-forum.org/272862-post7.html (часть ниже «RICHTIGER ANSATZ») , и теперь интересно, почему я должен переименовать себя, если я работаю с кнопками, например ...?! У них есть переменные для цвета и формы, которые меняются при нажатии кнопки, и это только изменяется, если actionListener явно вызывает перерисовку ?! – user2393914
@ user2393914 Вызов 'repaint' - это способ указать« RepaintManager », что внутреннее состояние вашего компонента изменилось и что вы хотите его перекрасить. В конце концов, ваш метод paintComponent будет вызван, и ваш компонент будет обновлен. Вызов 'repaint' обычно необходим для настраиваемых компонентов. –