setBackground не работает в первый раз, а во второй, почему?
Я видел этот пример в книге и работает нормально, но возникает только одна проблема: фон не становится черным при первом вызове для рисования, когда clearCounter становится == 5, а затем экран очищается и снова при рисовании Запускается, затем фон становится черным.
public class apletprg extends JApplet implements ActionListener
{
int clearCounter;
Timer t;
public void init(){
setBackground(Color.black);
clearCounter = 0;
Timer t = new Timer(1000, this);
t.start();
}
public void paint(Graphics g)
{
setBackground(Color.black);
clearCounter++;
Graphics2D g2 = (Graphics2D) g;
if (clearCounter == 5){
g2.clearRect(0, 0, 500, 400);
clearCounter=0;
}
for (int i = 1; i <= 40; i++) {
Color c = chooseColor();
g2.setColor(c);
Font f = chooseFont();
g2.setFont(f);
drawJava(g2);
}
}
public void actionPerformed(ActionEvent ae){
repaint();
}
public Color chooseColor(){
int r= (int) (Math.random() * 255);
int g= (int) (Math.random() * 255);
int b= (int) (Math.random() * 255);
Color c = new Color(r,g,b);
return c;
}
public Font chooseFont(){
int fontChoice = (int) (Math.random() * 4) + 1;
Font f = null;
switch (fontChoice) {
case 1: f = new Font("Serif", Font.BOLD + Font.ITALIC, 20);break;
case 2: f = new Font("SansSerif", Font.PLAIN, 17);break;
case 3: f = new Font("Monospaced", Font.ITALIC, 23);break;
case 4: f = new Font("Dialog", Font.ITALIC, 30);break;
}
return f;
}
public void drawJava(Graphics2D g2){
int x = (int) (Math.random() * 500);
int y = (int) (Math.random() * 400);
g2.drawString("Adnan", x, y);
}
}
Я знаю, что Init () вызывается только один раз при запуске, но почему он не может изменить фон при запуске?
2 ответа
Решил проблему, просто добавив еще одну переменную и вызвав ClearRect() в начале рисования, и убедившись, что это будет вызываться только один раз, с помощью вновь добавленной переменной.
public void init () {
setBackground(Color.black);
clearCounter = 0;
Timer t = new Timer(1000, this);
t.start();
check = 0; <------------ New Variable
}
public void paint(Graphics g)
{
if (check==0){
g.clearRect(0, 0, 500, 400); <------------ To Ensure That it will Excute Only Once , beacuse check is incremented later in Code
}
clearCounter++;
check++;
Graphics2D g2 = (Graphics2D) g;
if (clearCounter == 5){
g2.clearRect(0, 0, 500, 400);
clearCounter=0;
}
for (int i = 1; i <= 40; i++) {
Color c = chooseColor();
g2.setColor(c);
Font f = chooseFont();
g2.setFont(f);
drawJava(g2);
}
}
В вашем методе init замените setBackground(Color.black)
с getContentPane().setBackground(Color.black)
И добавить super.paint(g)
как первая строка в вашем paint
метод.
В противном случае, если вы не хотите использовать функции Swing, продолжайте и импортируйте java.applet.Applet
и заставить вас продлить класс Applet
вместо JApplet
public class NewClass extends JApplet implements ActionListener {
int clearCounter;
Timer t;
public void init() {
getContentPane().setBackground(Color.black);
repaint();
clearCounter = 0;
//t = new Timer("1000", true);
}
public void paint(Graphics g) {
super.paint(g);
setBackground(Color.black);
clearCounter++;
Graphics2D g2 = (Graphics2D) g;
if (clearCounter == 5) {
g2.clearRect(0, 0, 500, 400);
clearCounter = 0;
}
for (int i = 1; i <= 40; i++) {
Color c = chooseColor();
g2.setColor(c);
Font f = chooseFont();
g2.setFont(f);
drawJava(g2);
}
}
@Override
public void actionPerformed(ActionEvent ae) {
repaint();
}
public Color chooseColor() {
int r = (int) (Math.random() * 255);
int g = (int) (Math.random() * 255);
int b = (int) (Math.random() * 255);
Color c = new Color(r, g, b);
return c;
}
public Font chooseFont() {
int fontChoice = (int) (Math.random() * 4) + 1;
Font f = null;
switch (fontChoice) {
case 1:
f = new Font("Serif", Font.BOLD + Font.ITALIC, 20);
break;
case 2:
f = new Font("SansSerif", Font.PLAIN, 17);
break;
case 3:
f = new Font("Monospaced", Font.ITALIC, 23);
break;
case 4:
f = new Font("Dialog", Font.ITALIC, 30);
break;
}
return f;
}
public void drawJava(Graphics2D g2) {
int x = (int) (Math.random() * 500);
int y = (int) (Math.random() * 400);
g2.drawString("Adnan", x, y);
}
}
Если вы хотите выполнить super.paint() только один раз, добавьте логическую переменную в ваш класс
boolean firstTime = true;
В краске ()
if(firstTime) {
super.paint(g);
firstTime = false;
}