জাভাতে একটি উইন্ডো কীভাবে কেন্দ্র করবেন?


113

একটি কেন্দ্রের সবচেয়ে সহজ উপায় java.awt.Window, যেমন একটি JFrameবা একটি JDialog?


2
শিরোনামটি "জাভাতে নয়" সুইং-এ "হওয়া উচিত, এটি সেভাবে আরও পরিষ্কার হবে।
জো স্কোরা

6
@ জো setLocation(), setLocationRelativeTo()এবং setLocationByPlatform()বা সমস্ত AWT, সুইং নয়। ;)
অ্যান্ড্রু থম্পসন

উত্তর:


244

এই লিঙ্ক থেকে

আপনি যদি জাভা ১.৪ বা ততোধিক নতুন ব্যবহার করছেন তবে এটির কেন্দ্রস্থল করতে আপনি ডায়ালগ বক্স, ফ্রেম বা উইন্ডোতে সহজ পদ্ধতি সেটলকেশন রিলেটিভটো (নাল) ব্যবহার করতে পারেন।


9
@ ক্লিওপেট্রা যেমন অন্য উত্তরে বলেছিলেন, কাজ করার জন্য সেটলোকেশনরিলেটটিও (নাল) প্যাকের পরে কল করতে হবে ()।
ইউসবিয়াস

5
নীচে বর্ণিত হিসাবে, সেটলোকেশন রিলেটিভটো (নাল) প্যাকের কোনও কল () বা সেটসাইজ () পরে কল করতে হবে।
আরনাউদ পি

2
@ ইউসবিয়াস ওড, আমি একটি টিউটোরিয়াল অনুসরণ করেছি যা আমাকে এটির আগে সেট করেছিল pack()এবং এটি আমার স্ক্রিনের কেন্দ্রস্থলে ফ্রেমের উপরের বাম কোণটি রাখে। লাইনটি নীচে সরানোর পরে pack()এটি সঠিকভাবে কেন্দ্রিক হয়ে উঠল।
ব্যবহারকারী 1433479

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
হ্যাঁ, নিশ্চিত করুন যে আকারটি আগে প্রয়োগ করা হয়েছে (উদাহরণস্বরূপ প্যাকটি ব্যবহার করে)
মায়োক


26

মনে রাখবেন যে সেটলোকেশনরিলেটিভটো (নাল) এবং টুকিট.সেটডফল্টটুলকিট ()। GetScreenSize () কৌশলগুলি কেবল প্রাথমিক মনিটরের জন্যই কাজ করে। আপনি যদি কোনও মাল্টি-মনিটর পরিবেশে থাকেন তবে এই ধরণের গণনা করার আগে আপনার নির্দিষ্ট মনিটরের উইন্ডোটি চালু হওয়ার দরকার হতে পারে।

কখনও কখনও গুরুত্বপূর্ণ, কখনও কখনও ...

এটি কীভাবে পাবেন সে সম্পর্কে আরও তথ্যের জন্য গ্রাফিক্স এনভায়রনমেন্টের জাভাদোকগুলি দেখুন ।


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

প্রথম ডিসপ্লেটির ঠিক মাঝখানে উইন্ডোটি প্রদর্শিত হবে। এটি সম্ভবত সবচেয়ে সহজ সমাধান নয়।

লিনাক্স, উইন্ডোজ এবং ম্যাকের উপর সঠিকভাবে কাজ করে।


একাধিক পর্দার পরিবেশকে অ্যাকাউন্টে নেওয়া একমাত্র সঠিক উত্তর, অন্যথায় উইন্ডোটি প্রদর্শিত পর্দাটি কিছুটা এলোমেলো হতে পারে বা উইন্ডোটি দুটি পর্দার মাঝে কেন্দ্রীভূত হয়।
স্টিফান

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

এটি কেন্দ্রের উপরের বাম কোণটি রাখে - উইন্ডোটি কেন্দ্র করার মতো নয়। ফ্রেম.সেটসাইজ () এবং মাত্রা.সেটসাইজ () জড়িত অন্য একটিটি কাজ করে না:

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 () পদ্ধতিটি উপাদান শ্রেণীর কাছ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত এবং ফ্রেম.সেটসাইজ উইন্ডোর আকারটিও ফিরে দেয়। এইভাবে উল্লম্ব এবং অনুভূমিক মাত্রাগুলি থেকে অর্ধ উল্লম্ব এবং অনুভূমিক মাত্রাগুলি বিয়োগ করে, উপরের-বাম কোণটি কোথায় রাখবেন তার 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 স্ক্রিন-আকার সেট করে। এটি ফ্রেমডেমো.জেভাতে রয়েছে ওরাকল / সান সাইটে জাভা টিউটোরিয়ালে উপলব্ধ। আমি এটিকে পর্দার আকারের উচ্চতা / প্রস্থকে অর্ধেক করে রেখেছি। তারপরে, আমি বাম দিক থেকে পর্দার আকারের মাত্রাটির 1/4 এবং উপরে থেকে পর্দার আকারের মাত্রার 1/4 রেখে শীর্ষে রেখে এটিকে কেন্দ্র করেছিলাম। আপনি অনুরূপ ধারণা ব্যবহার করতে পারেন।


1
অন্য একটিও না। এই কোডগুলি স্ক্রিনের উপরের বাম কোণটিকে মাঝখানে রেখে দেয়।
জোনাথন কারাবালো

7
-1 পুনরুত্পাদন করতে পারে না - বা আরও সুনির্দিষ্টভাবে: ফ্রেম মাপার আগে সেটলকেশন রিলেটিভ বলা হয় (প্যাক বা ম্যানুয়াল সেটসাইজ দ্বারা) only একটি শূন্য আকারের ফ্রেমের জন্য এটি শীর্ষ-বাম কোণে একই অবস্থান .. এর কেন্দ্র :-)
ক্লিওপাত্রা

3

বিদ্যমান উইন্ডোর শীর্ষ-কেন্দ্রে একটি ফ্রেম প্রদর্শনের জন্য নীচে কোড code

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

} পাবলিক স্ট্যাটিক অকার্যকর মূল (স্ট্রিং [] আরোগুলি) ব্যতিক্রম ছোঁড়ে {

new SwingContainerDemo().showJFrameDemo();

}

নীচে উপরের কোড-স্নিপেটের আউটপুট দেওয়া আছে:এখানে চিত্র বর্ণনা লিখুন


1
frame.setLocation(x, 0);ভুল বলে মনে হচ্ছে - frame.setLocation(x, y);পরিবর্তে এটি করা উচিত ?
মনে

x এক্স অক্ষের দৈর্ঘ্যকে বোঝায় এবং y y অক্ষের দৈর্ঘ্যকে বোঝায়। সুতরাং আপনি যদি y = 0 করেন তবে কেবল এটি শীর্ষে থাকা উচিত।
আমান গোয়েল

সুতরাং int y = (int) ((dimension.getHeight() - frame.getHeight()) / 2);কোডের মধ্যে উপস্থিত রয়েছে কেবলমাত্র এটি দেখানোর জন্য যে আপনি উল্লম্ব অক্ষতেও কেন্দ্রীভূত করতে পারেন? ঠিক আছে, আমি ভেবেছিলাম আপনি এটি ব্যবহার করতে ভুলে গেছেন, সমস্যার জন্য দুঃখিত।
মনে

সমস্যা নেই. মনে! আপনার সাথে কথা বলার জন্য দুর্দান্ত।
আমান গোয়েল

2

সত্যিই সহজ কিছু রয়েছে যা আপনি উইন্ডোটি ব্যবহার করে কেন্দ্র ব্যবহার করার চেষ্টা করার পরেও উপেক্ষা করছেন setLocationRelativeTo(null)বা setLocation(x,y)এটি কিছুটা দূরে কেন্দ্রে পৌঁছেছে।

কল করার পরে আপনি যে কোনও একটি পদ্ধতি ব্যবহার করেছেন তা নিশ্চিত করুন pack()কারণ আপনি উইন্ডোটির মাত্রাটি স্ক্রিনে কোথায় রাখবেন তা গণনা করতে নিজেই শেষ করবেন। যতক্ষণ না pack()বলা হয়, মাত্রাগুলি এমনটি নয় যা আপনি মনে করেন এভাবে উইন্ডোটিকে কেন্দ্র করে গণনাগুলি ছুঁড়ে ফেলে। আশাকরি এটা সাহায্য করবে.


2

উদাহরণ: লাইন 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.
}

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 আমার ফ্রেম প্রস্থ এন উচ্চতা


1
-1 একটি ফ্রেমের আকার শূন্যের আগে ... আকার দিন :-) প্যাক দ্বারা পছন্দসই বা কমপক্ষে নিজেই সেটলোকেশনআরলেটিভ কল করার আগে শূন্যের চেয়ে অন্য কোনও আকারে ম্যানুয়ালি সেট করে তার অভ্যন্তরীণ সঠিক গণনাটি মঞ্জুরি দেবে
ক্লিওপেট্রা

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);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.