2010-03-13 5 views
3

Я пробовал метод add(), но при попытке добавить Test to GraphicsTest ничего не отображается. Как добавить его? Может кто-нибудь покажет мне? Я включил код, который я использую.Пользовательский JComponent не отображается в пользовательском JPanel

Это мой путь, и он не работает. Может ли кто-нибудь показать мне или сообщить мне, что проблема на самом деле?

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import javax.swing.JComponent; 

public class Test extends JComponent 
{ 
    @Override 
    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 
     Graphics2D g2d = (Graphics2D) g.create(); 
     g2d.setColor(Color.red); 
     g2d.drawString("Hello", 50, 50); 
     g2d.dispose(); 
    } 
} 

Вот другой класс:

import java.awt.Color; 
    import java.awt.Graphics; 
    import java.awt.Graphics2D; 
    import java.awt.geom.Rectangle2D; 
    import javax.swing.JPanel; 

    public class GraphicsTest extends JPanel 
    { 
     private Graphics2D g2d; 
     private String state; 
     private int x, y; 

    GraphicsTest() 
    { 
     Test t = new Test(); 
     t.setVisible(true); 
     add(t); 
    } 

    @Override 
    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 
     g2d = (Graphics2D) g; 

     g2d.setColor(Color.BLACK); 
     g2d.drawString("STATE: " + state, 5, 15); 
     g2d.drawString("Mouse Position: " + x + ", " + y, 5, 30); 

     g2d.setColor(Color.red); 
     Rectangle2D r2d = new Rectangle2D.Double(x, y, 10, 10); 
     g2d.draw(r2d); 

     g2d.dispose(); 
    } 

    public void setState(String state) { this.state = state; } 
    public String getState() { return state; } 
    public void setX(int x) { this.x = x; repaint(); } 
    public void setY(int y) { this.y = y; repaint(); } 
} 
+0

Этот код отлично подходит для меня, хотя, конечно, мне пришлось создать JFrame и добавить к нему GraphicsTest. –

+0

Тестируемый объект «привет» появляется для вас? – 2010-03-13 22:58:44

ответ

1

Ваша проблема g2d.dispose(). Выведите их, и это должно сработать. Я подозреваю, что это может привести к разному поведению на разных jvms. Похоже, что объект g2d используется для рисования материала на объекте GraphicsTest. Затем тот же объект g2d пытается нарисовать материал на объекте Test, но он был удален, поэтому он ничего не может нарисовать. Есть случаи, когда вы хотите вызвать g2d.dispose(), но это не один из них.

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

setLayout(new BorderLayout()); 
add(t, BorderLayout.CENTER); 

расположение по умолчанию должен быть Layout Flow. Я не уверен, почему это не сработает с Flow Layout.

+0

Я попробовал ваше предложение и удалил оба g2d.dispose(); но безрезультатно. – 2010-03-13 23:24:17

+1

К сожалению, на самом деле я сделал два изменения кода, чтобы они работали. Я не думал, что другое изменение изменит ситуацию. –

+0

Спасибо! Это работает наконец! Мне потребовался целый день, чтобы попытаться понять это ... Солнце работает над исправлением этого досады или это документировано где-то в другом месте? – 2010-03-13 23:49:17

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

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