Опитвам се да начертая правоъгълник в Java. Зададох размера на рамката (800,400) и resizable(false) rectangular's x = 50, y = 50 ширина = 700 височина = 300. Защо не е в средата? Благодаря ти.
Как мога да настаня в средата?
Отговори (2)
Без никакви доказателства за противното, бих предположил, че сте отменили метода paint
на нещо като JFrame
и рисувате директно върху него.
Проблемът е, че рамките имат декорация (например рамка и заглавна лента), която заема мястоврамката...
Технически това е правилно. Правоъгълникът е нарисуван в центъра на рамката, но поради декорациите на рамката изглежда, че е леко висок...
Вместо това трябва да рисувате върху областта на съдържанието на рамката.
Тук правоъгълникът вече изглежда правилно центриран. В моите тестове зададох първия кадър (лош) на 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
на контейнерите от най-високо ниво ;)
Rectangle rect = new Rectangle(50,50,700,300);
Това трябва да работи добре, създавате ли нов екземпляр на Rectangle, преди да получите достъп до променливите на членовете?
Освен това 800 на 400 е доста странна резолюция, 800 на 600 е по-стандартна.
paint
на рамката директно, което означава, че не вземате под внимание декорациите на рамката - person MadProgrammer   schedule 06.12.2012