সুইং জিইউআইয়ের সেরা অবস্থান কীভাবে?


126

ইন আরেকটি থ্রেড আমি তাদের জানিয়েছি যে আমি ভালো কিছু করে আমার GUIs কেন্দ্র পছন্দ:

JFrame frame = new JFrame("Foo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new HexagonGrid());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);

পরিবর্তে ফোন করার জন্য অ্যান্ড্রু থম্পসনের ভিন্ন মত ছিল opinion

frame.pack();
frame.setLocationByPlatform(true);

এবং অনুসন্ধানী মন জানতে চান কেন?


গিও একই জায়গায় শুরু করা উচিত যা এটি শেষবার শেষ হয়েছিল।
NomadMaker

উত্তর:


167

আমার চোখে, স্ক্রিনের মাঝখানে একটি জিইউআই দেখতে দেখতে .. "স্প্ল্যাশ-স্ক্রিন'শ"। আমি তাদের অদৃশ্য হয়ে যাওয়ার এবং আসল জিইউআই উপস্থিত হওয়ার অপেক্ষায় থাকি !

জাভা 1.5 থেকে আমাদের প্রবেশাধিকার রয়েছে Window.setLocationByPlatform(boolean)। যা ..

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

উইন্ডোজ,, জিনোম এবং ম্যাক ওএস এক্স এর সাথে লিনাক্স - ওএস দ্বারা নির্বাচিত ডিফল্ট অবস্থানে 3 জিইউআই রাখার এই উদাহরণটির প্রভাবটি দেখুন Have

উইন্ডোজ 7 এ স্ট্যাকযুক্ত উইন্ডোজ এখানে চিত্র বর্ণনা লিখুন ম্যাক ওএস এক্সে সজ্জিত উইন্ডোজ

(3 টি প্রচুর) 3 টি জিইউআই ঝরঝরে স্ট্যাক করা। এটি শেষ ব্যবহারকারীর জন্য 'সর্বনিম্ন বিস্ময়ের পথ' উপস্থাপন করে, যেহেতু ওএস ডিফল্ট প্লেইন-পাঠ্য সম্পাদক (বা এই বিষয়ে অন্য কোনও কিছু) এর 3 টি পরিস্থিতিতে থাকতে পারে। লিনাক্স এবং ম্যাকের জন্য ট্র্যাশগোডে আমার ধন্যবাদ। চিত্রসমূহ।

এখানে ব্যবহার করা সহজ কোড:

import javax.swing.*;

class WhereToPutTheGui {

    public static void initGui() {
        for (int ii=1; ii<4; ii++) {
            JFrame f = new JFrame("Frame " + ii);
            f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            String s =
                "os.name: " + System.getProperty("os.name") +
                "\nos.version: " + System.getProperty("os.version");
            f.add(new JTextArea(s,3,28));  // suggest a size
            f.pack();
            // Let the OS handle the positioning!
            f.setLocationByPlatform(true);
            f.setVisible(true);
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater( new Runnable() {
            public void run() {
                try {
                    UIManager.setLookAndFeel(
                        UIManager.getSystemLookAndFeelClassName());
                } catch (Exception useDefault) {}
                initGui();
            }
        });
    }
}

1
@ অ্যান্ড্রুথাম্পসন কেন আপনার পাল্টা iiপরিবর্তের চেয়ে ন্যায্য i? এটি কি কোনও কনভেনশন মেনে চলে বা এটি ব্যক্তিগত পছন্দ (বা সম্ভবত সম্পূর্ণ আলাদা কিছু)?
মিররফেটে

1
@ মিররফেট উম্মে .. আমার মনে হয় আমি সেখানে বিকল্প 3 লক করব, "সম্পূর্ণ আলাদা কিছু"। আমি প্রথম যখন বেসিকটিতে প্রোগ্রাম করলাম তখন ঠিক তেমনটাই অভ্যস্ত হয়ে গেলাম (হ্যাঁ, অনেক দিন আগে)। অলসতা এটিকে অব্যাহত ব্যবহারের কারণ, 'যদি এটি ভেঙে না যায় তবে এটি ঠিক করবেন না'।
অ্যান্ড্রু থম্পসন

1
@ মিররেডফেট আপনি কি পার্সিয়া ফ্যানের কোনও সুযোগে রাজপুত্রের হয়ে আছেন? আমি এখানে রাখার জন্য দুঃখিত। আমি কেবল প্রতিরোধ করতে
পারিনি

11
@ মিররফেটে এখানে কেন আমি এর iiপরিবর্তে ব্যবহার করব i। আমি যখন প্রোগ্রামিং প্রতিযোগিতায় অংশ নিই, আমাকে প্রায়শই লুপ ইনডেক্সটি অনুসন্ধান করতে হয়, বলি +1বা -1এটি থেকে একটি ত্রুটি করে সমাধান করতে হয়। এই ক্ষেত্রে, আমি যে সম্পাদকটি ব্যবহার করেছি তা নির্বিশেষে iiঅনুসন্ধান করা অনুসন্ধানের চেয়ে অনুসন্ধানের চেয়ে অনেক সহজ i। একইভাবে, আমি ব্যবহার jjএবং kkনেস্টেড লুপ ইনডেক্স জন্য। :)
musically_ut

5

আমি সম্পূর্ণ একমত যে setLocationByPlatform(true)এটি একটি নতুন জেফ্রেমের অবস্থান নির্দিষ্ট করার সর্বোত্তম উপায় তবে দ্বৈত-মনিটর সেটআপে আপনি সমস্যাগুলি পেতে পারেন। আমার ক্ষেত্রে, বাচ্চা জে ফ্রেম 'অন্য' মনিটরে তৈরি হয়েছে। উদাহরণ: আমার স্ক্রিন 2 এ আমার প্রধান জিইউআই রয়েছে, আমি setLocationByPlatform(true)এটি দিয়ে একটি নতুন জেফ্রেম শুরু করি এবং এটি স্ক্রিন 1 এ খোলে So সুতরাং এখানে আরও একটি সম্পূর্ণ সমাধান দেওয়া হয়েছে, আমি মনে করি:

...
// Let the OS try to handle the positioning!
f.setLocationByPlatform(true);
if (!f.getBounds().intersects(MyApp.getMainFrame().getBounds())) {
    // non-cascading, but centered on the Main GUI
    f.setLocationRelativeTo(MyApp.getMainFrame()); 
}
f.setVisible(true);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.