Как мога да настаня в средата?

Опитвам се да начертая правоъгълник в Java. Зададох размера на рамката (800,400) и resizable(false) rectangular's x = 50, y = 50 ширина = 700 височина = 300. Защо не е в средата? Благодаря ти.


person S Selin    schedule 05.12.2012    source източник
comment
къде се намира на екрана?   -  person Josh Siegl    schedule 06.12.2012
comment
Влагам парите си за това, че лявото и горното поле на прозореца се бъркат с вашите координати. Можете ли да публикувате екранна снимка? РЕДАКТИРАНЕ: Освен това, това люлка ли е? Ако е така, трябва да го маркирате отново за оптимална откриваемост   -  person Jeff    schedule 06.12.2012
comment
Обзалагам се, че заменяте paint на рамката директно, което означава, че не вземате под внимание декорациите на рамката   -  person MadProgrammer    schedule 06.12.2012


Отговори (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 на контейнерите от най-високо ниво ;)

person MadProgrammer    schedule 05.12.2012

    Rectangle rect = new Rectangle(50,50,700,300); 

Това трябва да работи добре, създавате ли нов екземпляр на Rectangle, преди да получите достъп до променливите на членовете?

Освен това 800 на 400 е доста странна резолюция, 800 на 600 е по-стандартна.

person Josh Siegl    schedule 05.12.2012