سؤال

ما هي أسهل طريقة إلى المركز java.awt.Window, مثل JFrame أو JDialog?

هل كانت مفيدة؟

المحلول

من هذا الرابط

إذا كنت تستخدم جافا 1.4 أو أحدث ، يمكنك استخدام طريقة بسيطة setLocationRelativeTo(null) في مربع الحوار إطار أو نافذة إلى مركز ذلك.

نصائح أخرى

هذا يجب أن تعمل في جميع إصدارات جافا

public static void centreWindow(Window frame) {
    Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (int) ((dimension.getWidth() - frame.getWidth()) / 2);
    int y = (int) ((dimension.getHeight() - frame.getHeight()) / 2);
    frame.setLocation(x, y);
}

نلاحظ أن كلا من setLocationRelativeTo(null) و Tookit.getDefaultToolkit().getScreenSize() تقنيات تعمل فقط على جهاز العرض الأساسي.إذا كنت في مجتمع متعدد رصد البيئة ، قد تحتاج إلى الحصول على معلومات محددة عن رصد النافذة قبل أن تفعل هذا النوع من الحساب.

في بعض الأحيان مهمة ، وأحيانا لا...

انظر GraphicsEnvironment javadocs لمزيد من المعلومات حول كيفية الحصول على هذا.

setLocationRelativeTo(null) ينبغي أن يسمى بعد استخدام إما setSize(x,y), أو استخدام حزمة().

على لينكس رمز

    setLocationRelativeTo(null)

وضع نافذة إلى موقع عشوائية في كل مرة أطلقت في العرض المتعدد البيئة.وقانون

    setLocation((Toolkit.getDefaultToolkit().getScreenSize().width  - getSize().width) / 2, (Toolkit.getDefaultToolkit().getScreenSize().height - getSize().height) / 2);

"قطع" النافذة في نصف مع وضع نفس المركز الذي هو بين اثنين من شاشات العرض.أنا استخدم الأسلوب التالي إلى مركز:

private void setWindowPosition(JFrame window, int screen)
{        
    GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
    GraphicsDevice[] allDevices = env.getScreenDevices();
    int topLeftX, topLeftY, screenX, screenY, windowPosX, windowPosY;

    if (screen < allDevices.length && screen > -1)
    {
        topLeftX = allDevices[screen].getDefaultConfiguration().getBounds().x;
        topLeftY = allDevices[screen].getDefaultConfiguration().getBounds().y;

        screenX  = allDevices[screen].getDefaultConfiguration().getBounds().width;
        screenY  = allDevices[screen].getDefaultConfiguration().getBounds().height;
    }
    else
    {
        topLeftX = allDevices[0].getDefaultConfiguration().getBounds().x;
        topLeftY = allDevices[0].getDefaultConfiguration().getBounds().y;

        screenX  = allDevices[0].getDefaultConfiguration().getBounds().width;
        screenY  = allDevices[0].getDefaultConfiguration().getBounds().height;
    }

    windowPosX = ((screenX - window.getWidth())  / 2) + topLeftX;
    windowPosY = ((screenY - window.getHeight()) / 2) + topLeftY;

    window.setLocation(windowPosX, windowPosY);
}

يجعل النافذة تظهر في وسط الشاشة الأول.قد لا يكون هذا هو الحل الأسهل.

يعمل بشكل صحيح على Linux, Windows و Mac.

وأخيرا حصلت هذه مجموعة من رموز العمل في NetBeans باستخدام البديل واجهة المستخدم الرسومية أشكال من أجل المركز الرئيسي jFrame:

package my.SampleUIdemo;
import java.awt.*;

public class classSampleUIdemo extends javax.swing.JFrame {
    /// 
    public classSampleUIdemo() {
        initComponents();
        CenteredFrame(this);  // <--- Here ya go.
    }
    // ...
    // void main() and other public method declarations here...

    ///  modular approach
    public void CenteredFrame(javax.swing.JFrame objFrame){
        Dimension objDimension = Toolkit.getDefaultToolkit().getScreenSize();
        int iCoordX = (objDimension.width - objFrame.getWidth()) / 2;
        int iCoordY = (objDimension.height - objFrame.getHeight()) / 2;
        objFrame.setLocation(iCoordX, iCoordY); 
    } 

}

أو

package my.SampleUIdemo;
import java.awt.*;

public class classSampleUIdemo extends javax.swing.JFrame {
        /// 
        public classSampleUIdemo() {
            initComponents(); 
            //------>> Insert your code here to center main jFrame.
            Dimension objDimension = Toolkit.getDefaultToolkit().getScreenSize();
            int iCoordX = (objDimension.width - this.getWidth()) / 2;
            int iCoordY = (objDimension.height - this.getHeight()) / 2;
            this.setLocation(iCoordX, iCoordY); 
            //------>> 
        } 
        // ...
        // void main() and other public method declarations here...

}

أو

    package my.SampleUIdemo;
    import java.awt.*;
    public class classSampleUIdemo extends javax.swing.JFrame {
         /// 
         public classSampleUIdemo() {
             initComponents();
             this.setLocationRelativeTo(null);  // <<--- plain and simple
         }
         // ...
         // void main() and other public method declarations here...
   }

التالية لا تعمل JDK 1.7.0.07:

frame.setLocationRelativeTo(null);

فإنه يضع أعلى الزاوية اليسرى في مركز لا نفس توسيط النافذة.والآخر لا يعمل إما تشمل الإطار.getSize() والبعد.getSize():

Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
int x = (int) ((dimension.getWidth() - frame.getWidth()) / 2);
int y = (int) ((dimension.getHeight() - frame.getHeight()) / 2);
frame.setLocation(x, y);

على getSize() الطريقة الموروثة من مكونات الطبقة ، وبالتالي الإطار.getSize يعود حجم النافذة أيضا.وبالتالي طرح نصف الرأسي والأفقي الأبعاد من العمودي والأفقي الأبعاد ، للعثور على x,y إحداثيات مكان إلى مكان أعلى الزاوية اليسرى, يعطيك الموقع من نقطة المركز, الذي ينتهي توسيط النافذة أيضا.ومع ذلك ، فإن السطر الأول من رمز أعلاه هو مفيد ، "البعد...".فقط تفعل هذا المركز هو:

Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
JLabel emptyLabel = new JLabel("");
emptyLabel.setPreferredSize(new Dimension( (int)dimension.getWidth() / 2, (int)dimension.getHeight()/2 ));
frame.getContentPane().add(emptyLabel, BorderLayout.CENTER);
frame.setLocation((int)dimension.getWidth()/4, (int)dimension.getHeight()/4);

على JLabel يحدد حجم الشاشة.انها في FrameDemo.java تتوفر على دروس جافا في أوراكل/موقع الشمس.أنا وضعت ذلك إلى نصف حجم الشاشة الطول/العرض.ثم لقد تركزت ذلك من خلال وضع أعلى اليسار في 1/4 من حجم الشاشة هو البعد من الجهة اليسرى ، و 1/4 من حجم الشاشة هو البعد من أعلى.يمكنك استخدام مفهوم مماثل.

أدناه هو رمز لعرض الإطار في أعلى مركز من القائمة إطار.

public class SwingContainerDemo {

private JFrame mainFrame;

private JPanel controlPanel;

private JLabel msglabel;

Frame.setLayout(new FlowLayout());

  mainFrame.addWindowListener(new WindowAdapter() {
     public void windowClosing(WindowEvent windowEvent){
        System.exit(0);
     }        
  });    
  //headerLabel = new JLabel("", JLabel.CENTER);        
 /* statusLabel = new JLabel("",JLabel.CENTER);    
  statusLabel.setSize(350,100);
 */ msglabel = new JLabel("Welcome to TutorialsPoint SWING Tutorial.", JLabel.CENTER);

  controlPanel = new JPanel();
  controlPanel.setLayout(new FlowLayout());

  //mainFrame.add(headerLabel);
  mainFrame.add(controlPanel);
 // mainFrame.add(statusLabel);

  mainFrame.setUndecorated(true);
  mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  mainFrame.getRootPane().setWindowDecorationStyle(JRootPane.NONE);
  mainFrame.setVisible(true);  

  centreWindow(mainFrame);

}

public static void centreWindow(Window frame) {
    Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (int) ((dimension.getWidth() - frame.getWidth()) / 2);
    int y = (int) ((dimension.getHeight() - frame.getHeight()) / 2);
    frame.setLocation(x, 0);
}


public void showJFrameDemo(){
 /* headerLabel.setText("Container in action: JFrame");   */
  final JFrame frame = new JFrame();
  frame.setSize(300, 300);
  frame.setLayout(new FlowLayout());       
  frame.add(msglabel);

  frame.addWindowListener(new WindowAdapter() {
     public void windowClosing(WindowEvent windowEvent){
        frame.dispose();
     }        
  });    



  JButton okButton = new JButton("Capture");
  okButton.addActionListener(new ActionListener() {
     public void actionPerformed(ActionEvent e) {
  //      statusLabel.setText("A Frame shown to the user.");
      //  frame.setVisible(true);
        mainFrame.setState(Frame.ICONIFIED);
        Robot robot = null;
        try {
            robot = new Robot();
        } catch (AWTException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        final Dimension screenSize = Toolkit.getDefaultToolkit().
                getScreenSize();
        final BufferedImage screen = robot.createScreenCapture(
                new Rectangle(screenSize));

        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new ScreenCaptureRectangle(screen);
            }
        });
        mainFrame.setState(Frame.NORMAL);
     }
  });
  controlPanel.add(okButton);
  mainFrame.setVisible(true);  

} العام ساكنة باطلة main(String[] args) يلقي استثناء {

new SwingContainerDemo().showJFrameDemo();

}

أدناه هو ouput من فوق رمز-مقتطف:enter image description here

الإطار.setLocationRelativeTo(null);

كامل سبيل المثال:

    public class BorderLayoutPanel {

    private JFrame mainFrame;
    private JButton btnLeft, btnRight, btnTop, btnBottom, btnCenter;

    public BorderLayoutPanel() {
        mainFrame = new JFrame("Border Layout Example");
        btnLeft = new JButton("LEFT");
        btnRight = new JButton("RIGHT");
        btnTop = new JButton("TOP");
        btnBottom = new JButton("BOTTOM");
        btnCenter = new JButton("CENTER");
    }

    public void SetLayout() {
        mainFrame.add(btnTop, BorderLayout.NORTH);
        mainFrame.add(btnBottom, BorderLayout.SOUTH);
        mainFrame.add(btnLeft, BorderLayout.EAST);
        mainFrame.add(btnRight, BorderLayout.WEST);
        mainFrame.add(btnCenter, BorderLayout.CENTER);
//        mainFrame.setSize(200, 200);
//        or
                mainFrame.pack();
        mainFrame.setVisible(true);

        //take up the default look and feel specified by windows themes
        mainFrame.setDefaultLookAndFeelDecorated(true);

        //make the window startup position be centered
        mainFrame.setLocationRelativeTo(null);


        mainFrame.setDefaultCloseOperation(mainFrame.EXIT_ON_CLOSE);

    }
}

هناك شيء بسيط حقا أن كنت قد تطل على بعد محاولة مركز النافذة باستخدام إما setLocationRelativeTo(null) أو setLocation(x,y) وينتهي قليلا قبالة مركز.

تأكد من أنه يمكنك استخدام أي واحد من هذه الأساليب بعد الدعوة pack() لأن عليك في نهاية المطاف باستخدام أبعاد النافذة نفسها لحساب أين مكان على الشاشة.حتى pack() ويسمى الأبعاد ليست ما كنت تعتقد وبالتالي رمي خارج الحسابات إلى مركز النافذة.ويساعد هذا الأمل.

على سبيل المثال:داخل myWindow() على الخط 3 هو رمز تحتاج إلى تعيين نافذة في وسط الشاشة.

JFrame window;

public myWindow() {

    window = new JFrame();
    window.setSize(1200,800);
    window.setLocationRelativeTo(null); // this line set the window in the center of thr screen
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.getContentPane().setBackground(Color.BLACK);
    window.setLayout(null); // disable the default layout to use custom one.
    window.setVisible(true); // to show the window on the screen.
}

في الواقع الإطار.getHeight() و getwidth() لا عودة القيم التحقق من ذلك عن طريق System.out.println(frame.getHeight()); مباشرة وضع قيم العرض والارتفاع ، ثم أنها سوف تعمل بشكل جيد في مركز.على سبيل المثال:كما أدناه

Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();      
int x=(int)((dimension.getWidth() - 450)/2);
int y=(int)((dimension.getHeight() - 450)/2);
jf.setLocation(x, y);  

سواء 450 هو عرض الإطار ن ارتفاع

    public class SwingExample implements Runnable {

        @Override
        public void run() {

          // Create the window
          final JFrame f = new JFrame("Hello, World!");
          SwingExample.centerWindow(f);
          f.setPreferredSize(new Dimension(500, 250));
          f.setMaximumSize(new Dimension(10000, 200));
          f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }


        public static void centerWindow(JFrame frame) {

           Insets insets = frame.getInsets();
           frame.setSize(new Dimension(insets.left + insets.right + 500, insets.top + insets.bottom + 250));
           frame.setVisible(true);
           frame.setResizable(false);

           Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
           int x = (int) ((dimension.getWidth() - frame.getWidth()) / 2);
           int y = (int) ((dimension.getHeight() - frame.getHeight()) / 2);
           frame.setLocation(x, y);
        }
   }

التعليمة البرمجية التالية سنتر Window في وسط الحالي رصد (أي حيث مؤشر الماوس يقع).

public static final void centerWindow(final Window window) {
    GraphicsDevice screen = MouseInfo.getPointerInfo().getDevice();
    Rectangle r = screen.getDefaultConfiguration().getBounds();
    int x = (r.width - window.getWidth()) / 2 + r.x;
    int y = (r.height - window.getHeight()) / 2 + r.y;
    window.setLocation(x, y);
}

هل يمكن أن تحاول ذلك أيضا.

       Frame frame = new Frame("Centered Frame");
       Dimension dimemsion = Toolkit.getDefaultToolkit().getScreenSize();
       frame.setLocation(dimemsion.width/2-frame.getSize().width/2, dimemsion.height/2-frame.getSize().height/2);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top