2013-06-05 2 views
0

Я создаю игру внутри JFrame (854 x 480). Я пытаюсь нарисовать Rectangle в правом верхнем углу экрана. как так:Прямоугольник нарисованный в неправильном месте

int x, y; 
Rectangle rect; 

public Foo() { 
    x = 0; 
    y = 0; 

    rect = new Rectangle(x, y, 63, 27); 
} 

.... 

public void draw(Graphics g) { 
    g.drawRect(rect.x, rect.y, rect.width, rect.height); 
} 

Но когда я делаю это, коробка получает отсасывают экран (х со-ords прав, но у со-ords слишком высоко:

Rectangle off screen http://i44.tinypic.com/4qn4g5.jpg

Когда я изменить Y со-ords до 27 (высота прямоугольника), она движется вниз, туда, где я хочу пойти:

Rectangle on screen http://i42.tinypic.com/2zpnors.png

Любая идея, почему это это происходит? Или как это исправить?

ответ

4

Вы переопределяете метод рисования (..) вашего JFrame? Координаты, по-видимому, находятся в координатном пространстве окна/JFrame, где 0/0 включает неклиентскую область (поле закрытия, строка заголовка и т. Д.).

Вы должны создать отдельный компонент и добавить к панели содержимого вашего основного кадра - просто очень маленький пример - обратите внимание, что я использую paintComponent (..):

public static class MyPanel extends JPanel { 
    @Override 
    protected void paintComponent(final Graphics g) { 
     super.paintComponent(g); 
     final Graphics2D g2 = (Graphics2D) g; 
     g2.setColor(Color.BLUE); 
     g2.draw(new Rectangle2D.Float(8,8, 128, 64)); 
    } 

} 

Добавить к содержимому JFrame (используйте по умолчанию или пользовательский LayoutManager):

public class MyFrame extends JFrame { 
    public MyFrame() { 
     ... 
     // since JDK 1.4 you do not need to use JFrame.getContentPane().add(..) 
     this.add(new MyPanel()); 
    } 
} 

Это должно сделать трюк. Here's the corresponding section of the Java SE tutorial.

+1

+1 Действительно. Используйте JPanel для рисования. –

+0

Нет, это новый класс, в основном методе мой метод рисования вызывает этот метод рисования следующим образом: 'foo.draw (g);' – Caveman42

1

Это потому, что координаты JFrames начинаются в верхнем левом углу, включая строку заголовка. Вам нужно добавить высоту строки заголовка в координату y, чтобы она отображалась в верхнем левом углу.

0

Рисовать Прямо в JPanel.

JPanel panel = new JPanel(); 
this.add(panel) //Add the panel to the frame and draw from there 
       //Provided the class extends a JFrame