Вопрос-ответ

How can I set in the midst?

Как я могу установить in the middle?

Я пытаюсь нарисовать прямоугольник на Java. Я устанавливаю размер рамки (800,400) и изменяемый размер (false) прямоугольника x = 50, y = 50 ширина = 700 высота = 300. Почему это не в середине? Спасибо.

Переведено автоматически
Ответ 1

Без каких-либо доказательств обратного, я бы предположил, что вы переопределили paint метод чего-то вроде JFrame и рисуете непосредственно к нему.

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

введите описание изображения здесь

Технически это правильно. Прямоугольник нарисован в центре рамки, но из-за оформления рамки кажется, что он немного возвышен...

Вместо этого вы должны рисовать в области содержимого фрейма.

введите описание изображения здесь

Здесь прямоугольник теперь выглядит правильно центрированным. В своих тестах я установил для первого фрейма (bad) значение 800x400, я сделал предпочтительный размер панели содержимого второго фрейма 800x400, что фактически сделало размер фрейма 816x438, поскольку оформление фрейма теперь находится за пределами области рисования.

public class CenterOfFrame {

public static void main(String[] args) {
new CenterOfFrame();
}

public CenterOfFrame() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}

new BadFrame().setVisible(true);

JFrame goodFrame = new JFrame();
goodFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
goodFrame.setContentPane(new PaintablePane());
goodFrame.pack();
goodFrame.setLocationRelativeTo(null);
goodFrame.setVisible(true);

}
});
}

public class BadFrame extends JFrame {

public BadFrame() {
setSize(800, 400);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}

@Override
public void paint(Graphics g) {
super.paint(g);
paintTest(g, getWidth() - 1, getHeight() - 1);
}
}

public void paintTest(Graphics g, int width, int height) {
g.setColor(Color.RED);
g.drawLine(0, 0, width, height);
g.drawLine(width, 0, 0, height);
g.drawRect(50, 50, width - 100, height - 100);
}

public class PaintablePane extends JPanel {

@Override
public Dimension getPreferredSize() {
return new Dimension(800, 400);
}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g); //To change body of generated methods, choose Tools | Templates.
paintTest(g, getWidth() - 1, getHeight() - 1);
}
}
}

Это одна из многих причин, почему вам не следует переопределять paint метод контейнеров верхнего уровня ;)

Ответ 2
    Rectangle rect = new Rectangle(50,50,700,300); 

Это должно работать нормально, вы создаете новый экземпляр Rectangle перед доступом к переменным-членам?

Также 800 на 400 - это довольно странное разрешение, 800 на 600 - более стандартное.

java