Как создать прямоугольник со значениями x и y по умолчанию в верхнем левом углу панели содержимого, а не на экране

Я добавляю в свою игру функцию, которая делает снимок экрана и сохраняет его в новом изображении. У меня нет проблем с путем к файлу или чем-то в этом роде, а скорее с Rectangle, через который делается снимок экрана. Если я создам новый Rectangle, например:

new Rectangle(0, 0, 500, 500);

затем он создает Rectangle 500 x 500 в левом верхнем углу экрана компьютера, а не в левом верхнем углу панели содержимого. Панель содержимого, о которой я говорю, намного меньше экрана и расположена в центре. Спасибо за чтение, любая помощь будет оценена по достоинству.


person liamslagle    schedule 09.12.2013    source источник


Ответы (2)


Для любого компонента (который может быть JPanel, Container, Window или любым другим) вы можете использовать это, чтобы получить Rectangle, который будет представлять его границы на экране:

Rectangle getBoundsOnScreen( Component component ) {
    Point topLeft = component.getLocationOnScreen();
    Dimension size = component.getSize();
    return new Rectangle( topLeft, size );
}

Итак, если вам нужна только панель содержимого JFrame:

getBoundsOnScreen( frame.getContentPane() );

Для таких вещей, как JFrame, вы можете просто сделать это:

frame.getBounds();
person tobii    schedule 09.12.2013

Посмотрите на пример ниже. Сначала я создаю класс RectangleComponent, который расширяет класс Rectangle:

import javax.swing.*;
import java.awt.*;

public class RectangleComponent extends JComponent
{
 Rectangle rectangle;

 public RectangleComponent(int xspace,int yspace, int width, int height)
{
    rectangle  = new Rectangle(xspace, yspace, width, height);
}

public void paintComponent(Graphics g)
{
    Graphics2D g2 = (Graphics2D) g;
    g2.draw(rectangle);
}
}

Теперь мы создаем класс, который генерирует главное окно, куда вы добавляете компонент Rectangle:

import javax.swing.*;
import java.awt.*;

public class CustomComponent extends JFrame {

private static final long serialVersionUID = 1L;

public CustomComponent() {

}

public static void main(String[] args) {
    JFrame frame = new JFrame("Java Rulez");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setBounds(100,100,600,600);
    frame.getContentPane().setBackground(Color.YELLOW);

    frame.add(new RectangleComponent(0, 0, 500, 500));

    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
}
}
person Anto    schedule 09.12.2013