जावा में विंडो कैसे केंद्रित करें?


113

java.awt.Windowइस तरह के एक JFrameया एक केंद्र के लिए सबसे आसान तरीका क्या है JDialog?


2
शीर्षक "जावा में" स्विंग "नहीं" होना चाहिए, यह उस तरह से अधिक स्पष्ट होगा।
जो स्कोरा

6
@ जो setLocation(), setLocationRelativeTo()और setLocationByPlatform()या सभी AWT, स्विंग नहीं। ;)
एंड्रयू थॉम्पसन

जवाबों:


244

से इस लिंक

यदि आप जावा 1.4 या नए का उपयोग कर रहे हैं, तो आप सरल विधि setLocationRelativeTo (नल) का उपयोग संवाद बॉक्स, फ्रेम, या इसे केंद्र में करने के लिए विंडो पर कर सकते हैं।


9
जैसा कि @kleopatra ने एक अन्य जवाब में कहा, setLocationRelativeTo (नल) को काम करने के लिए पैक () के बाद बुलाया जाना है।
Eusebius

6
जैसा कि नीचे बताया गया है, setLocationRelativeTo (null) को किसी भी कॉल () या setSize () के बाद कॉल करना होगा।
अरनौद पी

2
@Eusebius Odd, मैंने एक ट्यूटोरियल का अनुसरण किया जिसने मुझे पहले सेट किया pack()और इसने फ्रेम के सबसे ऊपरी कोने को मेरी स्क्रीन के केंद्र में रखा। लाइन को नीचे ले जाने के बाद pack()यह ठीक से केंद्रित हो गया।
user1433479

2
अच्छी तरह से पैक () सामग्री और लेआउट के आधार पर सही आकार सेट करता है, और जब तक आप इसके आकार को नहीं जानते, तब तक आप किसी चीज़ को केंद्र में नहीं रख सकते हैं, इसलिए यह वास्तव में अजीब है कि ट्यूटोरियल ने आपको इसे केंद्रित करने के बाद इसे पैक किया था।
एंड्रयू स्वान

65

यह जावा के सभी संस्करणों में काम करना चाहिए

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);
}

मुझे पता है कि यह बहुत पुराना है, लेकिन यह ठीक काम करता है, बशर्ते इस फ़ंक्शन को कॉल करने से पहले फ्रेम का आकार निर्धारित किया गया हो।
कृष्ण

1
हां, यह सुनिश्चित करें कि आकार पहले लागू किया गया है (उदाहरण के लिए पैक का उपयोग करके)
Myoch


26

ध्यान दें कि दोनों setLocationRelativeTo (नल) और Tookit.getDefaultToolkit ()। GetScreenSize () तकनीक केवल प्राथमिक मॉनिटर के लिए काम करती हैं। यदि आप एक बहु-मॉनिटर वातावरण में हैं, तो आपको इस तरह की गणना करने से पहले विंडो के विशिष्ट मॉनिटर के बारे में जानकारी प्राप्त करने की आवश्यकता हो सकती है।

कभी-कभी महत्वपूर्ण, कभी-कभी नहीं ...

इसे प्राप्त करने के तरीके के बारे में अधिक जानकारी के लिए GraphicsEnvironment javadocs देखें ।


17

लिनक्स पर कोड

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);
}

प्रथम प्रदर्शन के केंद्र में विंडो सही दिखाई देती है। यह शायद सबसे आसान उपाय नहीं है।

लिनक्स, विंडोज और मैक पर ठीक से काम करता है।


मल्टी स्क्रीन वातावरण को ध्यान में रखते हुए केवल सही उत्तर है, अन्यथा स्क्रीन जहां विंडो दिखाई देती है वह कुछ यादृच्छिक हो सकती है या विंडो दोनों स्क्रीन पर केंद्रित है।
Stephan

6

मैं अंत में कोड्स के इस झुंड को नेटबीन्स में काम करने के लिए स्विंगिंग जीयूआई फॉर्म का उपयोग कर रहा हूं ताकि मुख्य जेफ्रेम को केंद्र में रखा जा सके:

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...
   }

3

निम्नलिखित JDK 1.7.0.07 के लिए काम नहीं करता है:

frame.setLocationRelativeTo(null);

यह शीर्ष बाएं कोने को केंद्र में रखता है - खिड़की को केंद्रित करने के समान नहीं है। अन्य एक या तो काम नहीं करता है, जिसमें फ्रेम शामिल है ।getSize () और ampl.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 स्क्रीन-आकार सेट करता है। यह Oracle / Sun साइट पर जावा ट्यूटोरियल पर उपलब्ध फ्रेमडैम। Java में है। मैंने इसे स्क्रीन के आधे हिस्से की ऊंचाई / चौड़ाई पर सेट किया। फिर, मैंने स्क्रीन के आयाम के 1/4 भाग को बाईं ओर से शीर्ष पर रखकर, और शीर्ष से स्क्रीन आकार के आयाम के 1/4 भाग को केंद्र में रखा। आप एक समान अवधारणा का उपयोग कर सकते हैं।


1
न ही दूसरे को। ये कोड स्क्रीन के ऊपरी बाएं कोने को केंद्र में रखते हैं।
जोनाथन काराबालो

7
-1 को पुन: उत्पन्न नहीं किया जा सकता है - या इससे अधिक सटीक: केवल तभी होता है जब सेटलाइजेशन रेलिव को फ्रेम को आकार देने से पहले कहा जाता है (पैक या मैनुअल सेट द्वारा)। शून्य-आकार के फ़्रेम के लिए यह शीर्ष-बाएँ कोने वाला स्थान है .. इसका केंद्र :-)
क्लियोपेट्रा

3

नीचे मौजूदा विंडो के शीर्ष-केंद्र पर एक फ़्रेम प्रदर्शित करने के लिए कोड है।

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);  

} सार्वजनिक स्थैतिक शून्य मुख्य (स्ट्रिंग [] args) अपवाद फेंकता है {

new SwingContainerDemo().showJFrameDemo();

}

नीचे कोड-स्निपेट का ouput है:यहां छवि विवरण दर्ज करें


1
frame.setLocation(x, 0);गलत लगता है - frame.setLocation(x, y);इसके बजाय नहीं होना चाहिए?
डेम

x x अक्ष की लंबाई को दर्शाता है और y, y अक्ष की लंबाई को दर्शाता है। इसलिए यदि आप y = 0 बनाते हैं तो केवल शीर्ष पर होना चाहिए।
अमन गोयल

तो int y = (int) ((dimension.getHeight() - frame.getHeight()) / 2);कोड में केवल यह दिखाने के लिए मौजूद है कि आप ऊर्ध्वाधर अक्ष में भी केंद्र कर सकते हैं? ठीक है, मैंने सोचा था कि आप इसे इस्तेमाल करना भूल गए, परेशानी के लिए क्षमा करें।
समझे

कोई दिक्कत नहीं है। समझे! आप से बात करने के लिए यह बहुत अच्छा है।
अमन गोयल

2

वहाँ वास्तव में कुछ सरल है कि आप setLocationRelativeTo(null)या तो या खिड़की का उपयोग कर केंद्र की कोशिश करने के बाद अनदेखी कर सकते हैंsetLocation(x,y) यह एक छोटे से केंद्र होने के नाते समाप्त होता है।

सुनिश्चित करें कि आप कॉल करने के बाद इन विधियों में से किसी एक का उपयोग करते हैं, pack()क्योंकि आप विंडो के आयामों का उपयोग करके स्वयं यह गणना करेंगे कि इसे स्क्रीन पर कहां रखा जाए। जब तक pack()कहा जाता है, आयाम वह नहीं होते हैं जो आप सोचते हैं कि इस प्रकार गणना केंद्र से खिड़की को फेंक रही है। उम्मीद है की यह मदद करेगा।


2

उदाहरण: लाइन 3 पर myWindow () के अंदर आपको स्क्रीन के केंद्र में विंडो को सेट करने की आवश्यकता है।

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.
}

2

frame.setLocationRelativeTo (शून्य);

पूर्ण उदाहरण:

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);
    }
}

1

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);
}

1

आप यह भी कोशिश कर सकते हैं।

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);

1
कई मॉनिटर के बारे में क्या?
सुपहस्टार

0

वास्तव में फ्रेम .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 मेरे फ्रेम चौड़ाई n ऊंचाई है


1
-1 एक फ्रेम के आकार शून्य है से पहले ... मैन्युअल रूप से शून्य से कुछ और करने के लिए अपने आकार सेट करके आप उसे आकार देने :-) अधिमानतः पैक के द्वारा, या कम से कम पहले setLocationRelative बुला अपनी आंतरिक सही गणना की अनुमति देगा
Kleopatra

0
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);
    }
}

0

कॉल का क्रम महत्वपूर्ण है:

पहला -

pack();

दूसरा -

setLocationRelativeTo(null);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.