2013-12-01 1 views
0

, так что я просто хочу, чтобы нарисовать квадрат в случайной части экрана как custon JComponent:Java paintComponent работает, но не показывая

public void paintComponent(Graphics g){ 
    Graphics2D g2d = (Graphics2D) g; 
    if(this.good){ 
     g2d.setColor(Color.green); 
    } 
    else{ 
     g2d.setColor(Color.red); 
    } 
    g2d.fillRect(this.x, this.y, this.w, this.h); 
    System.out.println("painting"); 
} 

здесь метод, который называет картину с помощью repaint()

private void stateChange(){ 

    double rand = Math.random(); 

    if (rand < 0.5){ 
     this.good = !this.good; 
    } 
    setLocation(this.x,this.y); 
    repaint(); 
} 

this.x и this.y постоянно меняются, но я знаю, что это работает. Когда я запускаю свой код, он печатает "painting", где он должен, , но ничего не отображается. Я делаю что-то неправильно?

дополнительный код:

вот что я ставлю за то, чтобы получить его, чтобы показать:

\\in JComponent constructore 
setOpaque(true); 
setVisible(true); 
setSize(this.w,this.h); 
+0

Убедитесь, что вы ар e вызов 'супер.paintComponent';) – MadProgrammer

ответ

2

Проблема, основанная на примере кода, который вы указали, заключается в том, что вы на самом деле рисуете сторону границ видимого пространства компонента.

При окрашивании, верхний, левый угол Graphics контекста 0x0, Swing уже перевел Graphics контекст, основанный на позиции компонента, так что ...

g2d.fillRect(this.x, this.y, this.w, this.h); 

Это на самом деле (возможно) за пределами видимой области компонента. Например, если x позиция 10 и y является 10, но высота и ширина только 10, 10, вы рисуете в положении 10x10, которая была бы вне видимой области компонента, вместо этого, вы должны попробовать что-то подобное. ..

g2d.fillRect(0, 0, this.w, this.h); 

Или, основываясь на вашем примере кода,

public void paintComponent(Graphics g){ 
    Graphics2D g2d = (Graphics2D) g; 
    if(this.good){ 
     g2d.setColor(Color.green); 
    } 
    else{ 
     g2d.setColor(Color.red); 
    } 
    super.paintComponent(g2d); 
} 

Вместо ....

3

Мое предположение: у вас есть какое-то время (правда) цикл, который связывает нить Качели события , поэтому, пока вы меняете состояние, GUI не может перерисовать себя, чтобы показать, что это происходит. Либо это, либо размер вашего JComponent очень маленький, слишком маленький, чтобы показать изображение.

Для ответа это более чем предположение, вам нужно задать более полный вопрос с соответствующим кодом.

Обратите внимание, что ваш метод переопределения paintComponent(...) не имеет своего вызова метода super.

Примечание: вы можете проверить размер в JComponent путем добавления метода в GETSIZE() в paintComponent:

public void paintComponent(Graphics g){ 
    super.paintComponent(g); // **** don't forget this. 
    Graphics2D g2d = (Graphics2D) g; 
    if(this.good){ 
     g2d.setColor(Color.green); 
    } 
    else{ 
     g2d.setColor(Color.red); 
    } 
    g2d.fillRect(this.x, this.y, this.w, this.h); 

    // TODO: ***** delete this lines 
    System.out.println("painting"); 
    System.out.println(getSize()); // **** add this*** 
} 

Примечание: Вы должны не вызов setSize(...) на компоненте. Обычно это вводит в заблуждение, поскольку менеджеры макетов часто игнорируются.

+0

У меня нет петель, а размер 50 на 50 –

+0

@RyanSaxe: см. правки, пожалуйста, добавьте более релевантную информацию, чтобы завершить ваш вопрос. –

+0

Как получилось, что размер 1,1, когда 'this.w' и' this.h' равны 50? –

 Смежные вопросы

  • Нет связанных вопросов^_^