জাভা সুইং-এ আমি সেট (পছন্দসই | সর্বোচ্চ | সর্বনিম্ন) আকারের পদ্ধতিগুলি ব্যবহার করা এড়ানো উচিত?


481

নিম্নলিখিত পদ্ধতিগুলি ব্যবহারের পরামর্শ দেওয়ার জন্য আমি বেশ কয়েকবার সমালোচিত হয়েছি:

  1. setPreferredSize
  2. setMinimumSize
  3. setMaximumSize

Swingউপাদান উপর । যখন আমি প্রদর্শিত উপাদানগুলির মধ্যে অনুপাত নির্ধারণ করতে চাই তখন আমি তাদের ব্যবহারের কোনও বিকল্প দেখতে পাচ্ছি না। আমাকে এটি বলা হয়েছে:

লেআউটগুলির সাথে উত্তরটি সর্বদা একই থাকে: উপযুক্ত লেআউটম্যানেজার ব্যবহার করুন

আমি ওয়েবটি কিছুটা অনুসন্ধান করেছি, তবে আমি বিষয়টির কোনও বিস্তৃত বিশ্লেষণ পাইনি। সুতরাং আমার নিম্নলিখিত প্রশ্নগুলি রয়েছে:

  1. আমার কি এই পদ্ধতিগুলির ব্যবহার সম্পূর্ণভাবে এড়ানো উচিত?
  2. পদ্ধতিগুলি একটি কারণে সংজ্ঞায়িত করা হয়েছে। সুতরাং আমি তাদের কখন ব্যবহার করব? কোন প্রসঙ্গে? কি উদ্দেশ্যে?
  3. এই পদ্ধতিগুলি ব্যবহারের নেতিবাচক পরিণতিগুলি আসলে কী? (আমি কেবল ভিন্ন পর্দার রেজোলিউশন সহ সিস্টেমগুলির মধ্যে বহনযোগ্যতা যুক্ত করতেই ভাবতে পারি)।
  4. আমি মনে করি না যে কোনও লেআউটম্যানেজার সঠিকভাবে সমস্ত পছন্দসই বিন্যাসটি পূরণ করতে পারে। আমার লেআউটটিতে প্রতিটি সামান্য প্রকরণের জন্য আমাকে কী নতুন লেআউট ম্যানেজার বাস্তবায়িত করতে হবে?
  5. যদি 4 এর উত্তরটি "হ্যাঁ" হয় তবে এটি কি লেআউট ম্যানেজার শ্রেণীর বিস্তার বাড়ে না যা রক্ষণাবেক্ষণ করা কঠিন হয়ে উঠবে?
  6. কোন অবস্থার বাচ্চাদের মধ্যে অনুপাতগুলি সংজ্ঞায়িত করা দরকার (যেমন, চাইল্ড 1 এর 10% স্পেস ব্যবহার করতে হবে, চাইল্ড 2 40%, চাইল্ড 3 50%), কাস্টম লেআউট ম্যানেজার বাস্তবায়ন না করে এটি অর্জন করা সম্ভব?

উত্তর:


236
  1. আমার কি এই পদ্ধতিগুলির ব্যবহার সম্পূর্ণভাবে এড়ানো উচিত?

    হ্যাঁ আবেদন কোডের জন্য।

  2. পদ্ধতিগুলি একটি কারণে সংজ্ঞায়িত করা হয়েছে। সুতরাং আমি তাদের কখন ব্যবহার করব? কোন প্রসঙ্গে? কি উদ্দেশ্যে?

    আমি জানি না, ব্যক্তিগতভাবে আমি এটিকে একটি এপিআই ডিজাইন দুর্ঘটনা হিসাবে ভাবি। চাইল্ড মাপ সম্পর্কে বিশেষ ধারণা থাকা যৌগিক উপাদানগুলির দ্বারা সামান্য জোর করা। "সামান্য", কারণ তাদের কাস্টম লেআউটম্যানেজারের সাহায্যে তাদের প্রয়োজনগুলি কার্যকর করা উচিত ছিল।

  3. এই পদ্ধতিগুলি ব্যবহারের নেতিবাচক পরিণতিগুলি আসলে কী? (আমি কেবল ভিন্ন পর্দার রেজোলিউশন সহ সিস্টেমগুলির মধ্যে বহনযোগ্যতা যুক্ত করতেই ভাবতে পারি))

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

  4. আমি মনে করি না যে কোনও লেআউটম্যানেজার সঠিকভাবে সমস্ত পছন্দসই বিন্যাসটি পূরণ করতে পারে। আমার লেআউটটিতে প্রতিটি সামান্য প্রকরণের জন্য আমাকে কী নতুন লেআউট ম্যানেজার বাস্তবায়িত করতে হবে?

    হ্যাঁ, লেআউট ম্যানেজারগুলি "সমস্ত বিন্যাসের প্রয়োজনীয়তার জন্য" খুব ভাল আনুমানিকতা পূরণের জন্য যথেষ্ট শক্তিশালী। বড় তিনটি হ'ল জে গুডিজ ফর্মলআউট, মিগলাউট, ডিজাইনগ্রিডলাআউট। সুতরাং না, অনুশীলনে, আপনি খুব সম্ভবত সরল অত্যন্ত বিশেষায়িত পরিবেশ ব্যতীত লেআউট ম্যানেজারগুলি লিখেন।

  5. যদি 4 এর উত্তরটি "হ্যাঁ" হয় তবে এটি কি লেআউট ম্যানেজার শ্রেণীর বিস্তার বাড়ে না যা রক্ষণাবেক্ষণ করা কঠিন হয়ে উঠবে?

    (4 টির উত্তর "না"))

  6. এমন একটি পরিস্থিতিতে যেখানে আমার কোনও কম্পোনেন্টের বাচ্চাদের মধ্যে অনুপাতের সংজ্ঞা দেওয়া দরকার (উদাহরণস্বরূপ, সন্তানের 1 এর 10% স্পেস ব্যবহার করা উচিত, শিশু 2 40%, শিশু 3% 50%), এটি কি কাস্টম লেআউট ম্যানেজার বাস্তবায়ন না করে তা অর্জন করা সম্ভব?

    বিগ-থ্রি এর যে কেউ পারেন, গ্রিডব্যাগও পারেন না (খুব কম পাওয়ারের জন্য কখনও সত্যই আয়ত্ত করতে বিরক্ত করেন না)।


4
আমি পুরোপুরি নিশ্চিত নই যে আমি কমপক্ষে দুটি পরিস্থিতিতে এই পরামর্শের সাথে একমত। 1) কাস্টম রেন্ডারযুক্ত উপাদানগুলি 2) JEditorPaneএইচটিএমএল সহ এমন কোনও ব্যবহার যা নিজেরাই প্রস্থের পরামর্শ দেয় না। ওও আমি নিশ্চিত যে আমি কিছু মিস করেছি কিনা তা নিশ্চিত নই। আমি থ্রেডের জবাবগুলি সাবধানতার সাথে পর্যালোচনা করব, তবে আপনার আগ্রহ ছিল যদি বিশেষ করে পরবর্তী ক্ষেত্রে আপনার কোনও মন্তব্য থাকে।
অ্যান্ড্রু থম্পসন

2
@ অ্যান্ড্রু থম্পসন 1) কাস্টম কমপস: এটি কার্যকর কম লেগেছে ইঙ্গিতগুলি ফিরিয়ে দেওয়ার জন্য দায়বদ্ধ নিজেই দায়বদ্ধ, যদি তারা ইমপলটি বগি না হয় 2) এমনকি কোর কম্পগুলি বগি হয় ;-) 3) আমি সাদা স্থানের কথা মনে করি না (যদিও এটি ছিল না) এবার ইচ্ছাকৃত, ধন্যবাদ :-)
ক্লিওপাত্র

8
সেটাকে এক্সএক্সএক্সএক্স () পদ্ধতি ব্যবহার করা এড়াতে বলে মেনে নেওয়া উত্তরটিই আমি বিশ্বাস করতে পারি না। কখনও কখনও আপনার প্রয়োজন হয় লেআউট ম্যানেজারকে একটি ইঙ্গিত সরবরাহ করার জন্য। আপনি যদি কোনও প্যানেল রেখে দিচ্ছেন তবে প্রয়োজনের সময় এই পদ্ধতিগুলি ব্যবহার করতে আপনার নির্দ্বিধায় বোধ করা উচিত। এই বলে যে আমি মনে করি আপনি যদি উপযুক্ত লেআউট ম্যানেজার ব্যবহার করেন তবে আপনি নিজেকে খুব প্রায়ই এই পদ্ধতিগুলির প্রয়োজন পড়বেন না, তবে উপলক্ষে আপনার কেবল এগুলি প্রয়োজন। একটি এক্স_এক্সিস বক্সলয়আউটে একটি জকমবোবক্স বা জেস্পিনার রাখার চেষ্টা করুন এবং সেগুলি ব্যবহার করবেন না, বিশ্বাস করুন যে আপনার সেখানে সেটম্যাক্সিমিমাসাইজ () দরকার হবে।
মাইকেল

5
@ মিশেল না, আমার একেবারেই দরকার নেই - উত্তরটি সর্বদা একটি শালীন লেআউটম্যানেজার ব্যবহার করা এবং পরিচালকের স্তরে (বনাম উপাদান উপাদান) কোনও সূক্ষ্ম-টুইট করা
ক্লিওপাত্রা

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

100

কয়েকটি তাত্পর্যপূর্ণ:

  • এখানে দেখানো আপনার নিজের উপাদান তৈরি করতে যেমন set[Preferred|Maximum|Minimum]Size()আপনি সত্যিই ওভাররাইড করতে চান তখন ব্যবহার করবেন না ।get[Preferred|Maximum|Minimum]Size()

  • আপনি set[Preferred|Maximum|Minimum]Size()যখন কোনও উপাদানটির সাবধানে ওভাররাইডের উপর নির্ভর করতে পারেন তখন ব্যবহার করবেন না getPreferred|Maximum|Minimum]Size, এখানে এবং নীচে দেখানো হয়েছে

  • নীচে এবং এখানে প্রদর্শিত হিসাবে set[Preferred|Maximum|Minimum]Size()পোস্ট validate()জ্যামিতি আহরণ করতে ব্যবহার করবেন না ।

  • যদি কোনও উপাদানটির পছন্দসই আকার না থাকে, উদাহরণস্বরূপ JDesktopPane, আপনাকে ধারকটি আকার দিতে হতে পারে তবে এই জাতীয় পছন্দটি নির্বিচারে। একটি মন্তব্য অভিপ্রায়টি পরিষ্কার করতে সহায়তা করতে পারে।

  • বিকল্প বা কাস্টম লেআউটগুলি বিবেচনা করুন যখন আপনি দেখতে পান যে এই মন্তব্যগুলিতে উল্লিখিত হিসাবে, আপনাকে উদ্ভূত আকারগুলি পেতে অনেকগুলি উপাদান দিয়ে লুপ করতে হবে ।

এখানে চিত্র বর্ণনা লিখুন

import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.KeyboardFocusManager;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JComponent;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

/**
 * @see /programming/7229226
 * @see /programming/7228843
 */
public class DesignTest {

    private List<JTextField> list = new ArrayList<JTextField>();
    private JPanel panel = new JPanel();
    private JScrollPane sp = new JScrollPane(panel);

    public static void main(String args[]) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                DesignTest id = new DesignTest();
                id.create("My Project");
            }
        });
    }

    private void addField(String name) {
        JTextField jtf = new JTextField(16);
        panel.add(new JLabel(name, JLabel.LEFT));
        panel.add(jtf);
        list.add(jtf);
    }

    private void create(String strProjectName) {
        panel.setLayout(new GridLayout(0, 1));
        addField("First Name:");
        addField("Last Name:");
        addField("Address:");
        addField("City:");
        addField("Zip Code:");
        addField("Phone:");
        addField("Email Id:");
        KeyboardFocusManager.getCurrentKeyboardFocusManager()
            .addPropertyChangeListener("permanentFocusOwner",
            new FocusDrivenScroller(panel));
        // Show half the fields
        sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        sp.validate();
        Dimension d = sp.getPreferredSize();
        d.setSize(d.width, d.height / 2);
        sp.setPreferredSize(d);

        JInternalFrame internaFrame = new JInternalFrame();
        internaFrame.add(sp);
        internaFrame.pack();
        internaFrame.setVisible(true);

        JDesktopPane desktopPane = new JDesktopPane();
        desktopPane.add(internaFrame);

        JFrame frmtest = new JFrame();
        frmtest.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frmtest.add(desktopPane);
        frmtest.pack();
        // User's preference should be read from java.util.prefs.Preferences
        frmtest.setSize(400, 300);
        frmtest.setLocationRelativeTo(null);
        frmtest.setVisible(true);
        list.get(0).requestFocusInWindow();
    }

    private static class FocusDrivenScroller implements PropertyChangeListener {

        private JComponent parent;

        public FocusDrivenScroller(JComponent parent) {
            this.parent = parent;
        }

        @Override
        public void propertyChange(PropertyChangeEvent evt) {
            Component focused = (Component) evt.getNewValue();
            if (focused != null
                && SwingUtilities.isDescendingFrom(focused, parent)) {
                parent.scrollRectToVisible(focused.getBounds());
            }
        }
    }
}

2
অসমত (যেমন আপনি অনুমান করতে পারেন :-) "বাহ্যিক কারণগুলি" দ্বারা যুক্তি দিয়ে: XXSize বৈশিষ্ট্যগুলি কেবল অভ্যন্তরীণ প্রয়োজনীয়তা প্রকাশ করার জন্য বোঝানো হয় । বাইরে থেকে তাদের টুইট করা ভুল ব্যবহার, ওরফে হ্যাকিং। আপনি যদি এএ স্পেসিফিক আকারের সাথে একটি (অভ্যন্তরীণ- বা জে-) ফ্রেম চান তবে এটি পছন্দ করুন ... ফ্রেমের আকার করুন, সামগ্রী নয়
ক্লিওপাত্রা

2
@ ক্লিওপেট্রা: কিছুটা জেদী হওয়ার জন্য: যদি সেট এক্স এক্স সাইজ পদ্ধতিগুলি কখনই বাইরে থেকে ব্যবহার করা উচিত না হয় তবে কেন ব্যক্তিগত বা সুরক্ষিত ঘোষণা করা হয়নি? এটি কি ডিজাইনের অভাব নয়? পাবলিক মডিফায়ার ব্যবহারকারীকে এই পদ্ধতিগুলি ব্যবহার করতে পারে না?
হাইজেনবাগ

2
আমাকে @ ক্লিওপেট্রার সাথে একমত হতে হবে: setPreferredSize()সর্বদা উপাদানের গণনাটি একটি স্বেচ্ছাসেবী পছন্দ দ্বারা প্রতিস্থাপন করে।
ট্র্যাশগোড

1
@ ট্র্যাশগোড আপনার কাছে আমার কাছে 100+ আমি মনে করি এই পদ্ধতিগুলিকে ওভাররাইড করা, এমনকি তাদের কল করাতে কোনও সমস্যা নেই (তবে অবশ্যই এর অর্থ আপনার কাস্টম উপাদান যেমন ওভাররাইড করা আরও ভাল হবে)
ডেভিড ক্রোকম্প্যাম্প 4:44

5
@ ডেভিডক্রোক্যাম্প: আপনাকে ধন্যবাদ আমি ক্লিওপেট্রার বৃহত্তর অভিজ্ঞতাকে পিছনে ফেলেছি, তবে আমি বিপরীত দৃষ্টিভঙ্গি সমালোচনামূলকভাবে পরীক্ষা করার মূল্য দেখছি।
ট্র্যাশগোড

47

আমার কি এই পদ্ধতিগুলির ব্যবহার সম্পূর্ণভাবে এড়ানো উচিত?

না, এই পদ্ধতিগুলিকে কল করার বা ওভাররাইড করার পরামর্শ দেওয়ার কোনও আনুষ্ঠানিক প্রমাণ নেই। আসলে, ওরাকল বলেছেন যে এই পদ্ধতিগুলি আকারের ইঙ্গিত দেওয়ার জন্য ব্যবহৃত হয়: http://docs.oracle.com/javase/tutorial/uiswing/layout/using.html#sizealignment

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

সবচেয়ে গুরুত্বপূর্ণ বিষয় আপনি কীভাবে আপনার উপাদানটির আকার নির্দিষ্ট করেন তা নির্বিশেষে আপনার উপাদানটির ধারক একটি লেআউট ম্যানেজার ব্যবহার করেছেন যা উপাদানটির অনুরোধিত আকারকে সম্মান করে।

পদ্ধতিগুলি একটি কারণে সংজ্ঞায়িত করা হয়েছে। সুতরাং আমি তাদের কখন ব্যবহার করব? কোন প্রসঙ্গে? কি উদ্দেশ্যে?

যখন আপনার পাত্রে লেআউট ম্যানেজারটিকে কাস্টমাইজড আকারের ইঙ্গিতগুলি সরবরাহ করতে হবে যাতে উপাদানটি ভালভাবে সাজানো যায়

এই পদ্ধতিগুলি ব্যবহারের নেতিবাচক পরিণতিগুলি আসলে কী? (আমি কেবল ভিন্ন পর্দার রেজোলিউশন সহ সিস্টেমগুলির মধ্যে বহনযোগ্যতা যুক্ত করার জন্যই ভাবতে পারি)।

  • অনেক লেআউট ম্যানেজার কোনও উপাদানটির অনুরোধ করা সর্বাধিক আকারের দিকে মনোযোগ দেয় না। তবে, BoxLayoutএবং SpringLayoutকরুন। তদ্ব্যতীত, GroupLayoutউপাদানটি স্পর্শ না করে সুস্পষ্টভাবে সর্বনিম্ন, পছন্দসই বা সর্বাধিক আকার নির্ধারণ করার ক্ষমতা সরবরাহ করে।

  • আপনাকে অবশ্যই উপাদানটির সঠিক আকার নির্ধারণ করতে হবে তা নিশ্চিত করুন। প্রতিটি সুইং উপাদানটির আলাদা আলাদা পছন্দসই আকার থাকে যা এটি ব্যবহার করে ফন্ট এবং চেহারা এবং বোধের উপর নির্ভর করে। সুতরাং একটি সেট আকার থাকা বিভিন্ন সিস্টেমে ইউআই এর বিভিন্ন চেহারা তৈরি করতে পারে

  • কখনও কখনও GridBagLayoutএবং টেক্সট ক্ষেত্রগুলির সাথে সমস্যাগুলির মুখোমুখি হতে পারে , যার মধ্যে ধারকটির আকার পছন্দসই আকারের চেয়ে ছোট হলে সর্বনিম্ন আকার ব্যবহার হয়, যার ফলে পাঠ্য ক্ষেত্রগুলি যথেষ্ট পরিমাণে সঙ্কুচিত হতে পারে।

  • JFramegetMinimumSize()কেবলমাত্র setMinimumSize(..)তার কাজগুলিকে ডাকা ওভাররাইডেন প্রয়োগ করে না

আমি মনে করি না যে কোনও লেআউটম্যানেজার সঠিকভাবে সমস্ত পছন্দসই বিন্যাসটি পূরণ করতে পারে। আমার লেআউটটিতে প্রতিটি সামান্য প্রকরণের জন্য আমাকে কী নতুন লেআউট ম্যানেজার বাস্তবায়িত করতে হবে?

যদি প্রয়োগ করে আপনি বোঝাতে চান তবে হ্যাঁ। কেউই সব LayoutMangerকিছু পরিচালনা করতে পারে না , প্রত্যেকের পক্ষে LayoutManagerতার পক্ষে মতামত রয়েছে এবং এইভাবে প্রতিটি চূড়ান্ত বিন্যাস তৈরি করতে একসাথে ব্যবহার করা যেতে পারে।

রেফারেন্স:


3
স্বনির্ধারিত আকারের ইঙ্গিতগুলি সরবরাহ করুন যা এটি নিজের মধ্যে একটি বৈপরীত্য: সাইজিং ইঙ্গিতগুলি সরবরাহ করা (px এ!) উপাদানটির একচেটিয়া কাজ। এটি তাদের অভ্যন্তরীণ অবস্থার বিবরণের ভিত্তিতে গণনা করে যা নিজে ব্যতীত অন্য কোনও পক্ষই জানতে পারে না (বা ট্র্যাক রাখতে পারে না)। ক্লায়েন্টের দৃষ্টিকোণ থেকে, কাস্টমাইজেশনের মাধ্যমগুলি উপযুক্ত লেআউটম্যানেজার হতে পারে এবং / অথবা এপিআইকে বিশেষজ্ঞ করতে পারে যা "শব্দার্থিক" আকার-প্রাসঙ্গিক বৈশিষ্ট্য, পাঠ্যের অংশে সারি / কলামগুলির ফাই সংখ্যার ক্ষেত্রে আকার প্রয়োজনীয়তা কনফিগার করতে দেয়
ক্লিওপেট্রা

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

4
@ ডেভিড: আমি ডকুমেন্টদের পরামর্শ দেওয়ার পরেও setXxxSizeআমি এই পদ্ধতিগুলিকে একটি লাল পতাকা হিসাবে দেখতে পেয়েছি যা এখানে বয়ে যেতে পারে । আমার প্রায় সবসময়ই ওভাররাইড হওয়া উচিত getXxxSize, যেখানে কারও কাছে প্রয়োজনীয় জ্যামিতিতে অ্যাক্সেস থাকে; এমনকি সংক্ষিপ্ত উদাহরণগুলি আমি যা ভাবতে চাইছি তার চেয়ে বেশি পুনর্ব্যবহারযোগ্য হয়। লেআউট পরিচালকদের মধ্যে পার্থক্য উল্লেখ করার জন্য এবং টিউটোরিয়ালটির উদ্ধৃতি দেওয়ার জন্য +1।
ট্র্যাশগোড

1
দোহ, উপরোক্ত আমার মন্তব্যে, আমি এখানে উত্তরটি উদ্ধৃত করতে চাইছিলাম ।
ট্র্যাশগোড

13
+1 "না, এই পদ্ধতিগুলিকে কল করার বা ওভাররাইড করার পরামর্শ দেওয়ার কোনও আনুষ্ঠানিক প্রমাণ নেই" " চিহ্নিত করা. উত্তর হিসাবে ট্যাগ পোস্টটি সরল বিএস।
টিটি।

25

এখানে অনেক ভাল উত্তর রয়েছে তবে আপনি সাধারণত কেন এগুলি এড়াতে হবে তার কারণগুলি সম্পর্কে আমি আরও কিছু যুক্ত করতে চাই (প্রশ্নটি কেবল একটি সদৃশ বিষয়টিতে আবার এসেছিল):

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

এর উদাহরণ হিসাবে, আপনার অ্যাপ্লিকেশনটির ডিফল্ট চেহারা এবং অনুভূতি পরিবর্তন করার চেষ্টা করুন। এমনকি আপনার প্ল্যাটফর্মে কেবলমাত্র বিকল্পগুলি পাওয়া গেলেও আপনি কীভাবে খারাপ ফলাফল প্রকাশ করতে পারেন তা নিয়ে আপনি অবাক হয়ে যেতে পারেন।

সুতরাং, সমস্ত প্ল্যাটফর্মগুলিতে আপনার জিইউআইকে কার্যকরী এবং সুন্দর দেখানোর নামে (মনে রাখবেন, জাভার অন্যতম প্রধান সুবিধা হ'ল এর ক্রস-প্ল্যাটফর্মেন্স) আপনার আকারগুলি স্বয়ংক্রিয়ভাবে সামঞ্জস্য করতে আপনার লেআউট ম্যানেজার ইত্যাদির উপর নির্ভর করা উচিত etc. আপনার উপাদানগুলি যাতে এটি আপনার নির্দিষ্ট বিকাশের পরিবেশের বাইরে সঠিকভাবে রেন্ডার করে।

যা যা বলেছিল, আপনি অবশ্যই সেই পরিস্থিতিতে কল্পনা করতে পারেন যেখানে এই পদ্ধতিগুলি ন্যায়সঙ্গত। আবার এগুলি জন্মগতভাবে মন্দ নয়, তবে তাদের ব্যবহার সাধারণত জিওআই সংক্রান্ত সম্ভাব্য ইঙ্গিত দেয় এমন একটি বড় লাল পতাকা। জটিলতার ঝুঁকির উচ্চ সম্ভাবনা সম্পর্কে আপনি সচেতন কিনা তা নিশ্চিত করুন / আপনি যখন সেগুলি ব্যবহার করেন এবং সর্বদা চেষ্টা করুন এবং ভাবুন আপনার সমস্যাগুলির জন্য অন্যরকম চেহারা-ও-স্বাধীন সমাধান রয়েছে কিনা - আপনি প্রায়শই না খুঁজে পেয়েছেন যে এইগুলি পদ্ধতিগুলি প্রয়োজনীয় নয়।

যাইহোক, যদি আপনি নিজেকে স্ট্যান্ডার্ড লেআউট পরিচালকদের থেকে হতাশ হয়ে পড়ে থাকেন তবে অনেক ভাল ফ্রি, ওপেন সোর্স তৃতীয় পক্ষের রয়েছে, উদাহরণস্বরূপ জে গুডিজ 'FormLayout , বা MigLayout। কিছু জিইউআই বিল্ডার এমনকি তৃতীয় পক্ষের লেআউট পরিচালকদের জন্য অন্তর্নির্মিত সমর্থনও রয়েছে - এক্লিপসের উইন্ডোবিল্ডার জিইউআই সম্পাদক উদাহরণস্বরূপ, FormLayoutএবং এর জন্য সমর্থন সহ জাহাজগুলি MigLayout


2
+1 একটি বিবেচ্য উত্তর - কেবলমাত্র এগুলির সাথে একমত নয় যে তারা অন্তর্নিহিতভাবে মন্দ নয় কেবল কারণ তারা :-) সাধারণত: বাইরের ক্লায়েন্টদের অনুমান করার কোনও সুযোগ নেই - এবং কেবল অনুমানগুলি বাইরের লোকেরা যেমন পেতে পারেন ততই কাছাকাছি - সঠিক লেআউটের অর্ধেক দিক: উপাদানগুলি নিজের কাছে দরকারী তথ্য ফেরত দিতে সর্বদা সমস্ত তথ্য রাখে। এবং যেহেতু বহিরাগতরা হস্তক্ষেপ করে সেই মুহুর্তে সেইসব ইঙ্গিতগুলিকে আপ টু ডেট রাখার দায়িত্ব তাদের উপর পড়ে।
ক্লিওপাত্রা

1
ঠিক আছে, আপনি জানেন, আমার কাছে আরও অনেক "বন্দুক মানুষকে হত্যা করে না, মানুষ মানুষ হত্যা করে" এই ধরণের জিনিসগুলির মত ধরণের view :) যদি কেউ এই পদ্ধতিগুলি ব্যবহার করে তবে তাদেরকে বিন্যাসের ইঙ্গিতগুলির অপ্রত্যাশিত ব্যবহার সম্পর্কে উত্থাপিত ভাল পয়েন্টগুলির মতো জিনিস সম্পর্কে সচেতন হওয়া প্রয়োজন (যার কারণেই এই পদ্ধতিগুলি যথাযথ situations
জেসন সি

আমি মনে করি পছন্দসই আকার নির্ধারণ করা মোটেও বড় লাল পতাকা নয়। এটি সেট না করা পরিবর্তে একটি বড় লাল পতাকা। আমাকে বিস্তারিত জানাতে দিন। লেআউট ম্যানেজার - এটি যতই স্মার্ট হোক না কেন - গুই উইজেটের লজিক্যাল ফাংশন সম্পর্কে কোনও ধারণা নেই। উদাহরণস্বরূপ, লেআউট ম্যানেজার জিপ কোড প্রবেশের জন্য একটি জেেক্সটফিল্ড এবং কোনও নাম প্রবেশের জন্য জে টেক্সটফিল্ডের মধ্যে পার্থক্য করতে পারে না। একইভাবে এটি JTextField এর পাশের একটি সরঞ্জাম বোতাম বা কোনও ফর্মের নীচে একটি বড় ওকে বোতামের মধ্যে পার্থক্য করতে পারে না। সুতরাং হয় একটি ভাল উইজেট সেট, বা কিছু আকারের ইঙ্গিত প্রয়োজন, না?
জি বি

@ জিবি নোপ, এটি আসলে একটি লাল পতাকার একটি প্রধান উদাহরণ। আপনার যা করা উচিত তা হ'ল JTextField.setColumnsকলামের গণনা সেট করতে ব্যবহার করুন যা সেই অনুসারে পছন্দসই আকারটি সামঞ্জস্য করে। যদি আপনি এটি করেন setPreferredSizeতবে আপনি কোনও আকারকে শক্ত কোডিং করছেন যা প্ল্যাটফর্মের ফন্টের আকারের উপর নির্ভর করে আপনার বিন্যাসগুলি ভেঙে দেবে। এখানে গ্রিড ব্যাগ বিন্যাসে কিছু পাঠ্য ক্ষেত্র রয়েছে setColumnsযা যথাযথভাবে বলা হয় । আপনার বোতামগুলির জন্য, আকারগুলি নিয়ন্ত্রণ করতে উপযুক্ত লেআউট / গ্রিড ওজন ব্যবহার করুন।
জেসন সি

@ জিবি এবং এখন, এটি সঠিকভাবে সম্পন্ন করার সাথে লক্ষ্য করুন যে আমি যখন ফন্টের আকার হ্রাস করব তখন পাঠ্য ক্ষেত্রের প্রস্থগুলি কীভাবে হ্রাস পাবে: i.snag.gy/ZULulh.jpg । এমনকি ফ্লাইতে ফন্টের আকার পরিবর্তন করা এখন আপনার পরিবর্তে স্বয়ংক্রিয়ভাবে কাজ করে, বলুন, প্রতিটি পাঠ্যের ক্ষেত্রের প্রস্থকে পুনরায় গণনা করতে হবে এবং প্রতিটিটির জন্য স্পষ্টতই সেটপ্রিফারড সাইজ কল করতে হবে, আপনাকে যা করতে হবে তা লেআউটটিকে অকার্যকর করে দেবে এবং তাদের আকারগুলি সামঞ্জস্য করবে।
জেসন সি

20

আপনার যদি জাভা সুইংয়ের লেআউটগুলির সাথে সমস্যা হয় তবে আমি এখানেFormLayout কার্স্টেন লেন্টজস্কের ফর্মস ফ্রিওয়্যার লাইব্রেরির অংশ হিসাবে নিখরচায় সরবরাহিত জেগুডিগুলিকে সুপারিশ করতে পারি ।

এই খুব জনপ্রিয় লেআউট ম্যানেজার অত্যন্ত নমনীয়, খুব পালিশ জাভা UI গুলি বিকাশ করার অনুমতি দেয়।

আপনি কার্স্টেন এর ডকুমেন্টেশন পাবেন এখানে , এবং অন্ধকার থেকে কিছু বরং ভাল ডকুমেন্টেশন এখানে


16

এই পদ্ধতিগুলি বেশিরভাগ লোকের দ্বারা খারাপভাবে বোঝা যায়। আপনার এই পদ্ধতিগুলি একেবারেই উপেক্ষা করা উচিত নয়। যদি তারা এই পদ্ধতিগুলিকে সম্মান করে তবে এটি লেআউট ম্যানেজারের উপর নির্ভর করে। এই পৃষ্ঠায় একটি সারণী রয়েছে যা দেখায় কোন লেআউট ম্যানেজাররা এই পদ্ধতিগুলির মধ্যে কোনটিকে সম্মান করে:

http://thebadprogrammer.com/swing-layout-manager-sizing/

আমি 8+ বছর ধরে সুইং কোডটি লিখছি এবং জেডিকে অন্তর্ভুক্ত লেআউট ম্যানেজাররা সর্বদা আমার প্রয়োজনগুলি পরিবেশন করেছেন। আমার লেআউটগুলি অর্জনের জন্য আমার তৃতীয় পক্ষের লেআউট ম্যানেজারের কখনও প্রয়োজন নেই।

আমি বলব যে আপনার নিজের প্রয়োজন নিশ্চিত না হওয়া অবধি এই পদ্ধতিগুলির সাহায্যে লেআউট ম্যানেজারকে ইঙ্গিত দেওয়ার চেষ্টা করা উচিত নয়। কোনও আকারের ইঙ্গিত না দিয়ে আপনার বিন্যাসটি করুন (যেমন লেআউট ম্যানেজারটিকে তার কাজটি করতে দিন) এবং তারপরে আপনার প্রয়োজনের সাথে সামান্য সংশোধন করতে পারেন।


1
হয় সামান্য ভুল ধারণা (আপনার পক্ষ থেকে) বা ভুল বোঝাবুঝি (আমার পক্ষ থেকে), আপনার পছন্দটি নিন :-) আপনি পুনরাবৃত্তি করে যান (এখানে, আপনার ব্লগে, বক্সলয়েটের সাথে সম্পর্কিত আপনার উত্তরে) সেট XXSize গুরুত্বপূর্ণ হিসাবে রয়েছে - আসলে লেআউটম্যানেজার XXX আকারে আগ্রহী (বা না), এটি কীভাবে আসে তার উপর সাইজিং ইঙ্গিতটি স্বাধীন (উপাদান দ্বারা অভ্যন্তরীণ গণনা বা অ্যাপ্লিকেশন কোড দ্বারা ম্যানুয়ালি জোর করে)
ক্লেওপাত্র

1
আমি নিশ্চিত না যে আপনি এখানে কী পাচ্ছেন তা আমি বুঝতে পেরেছি। আমি উপরে উল্লেখ করেছি যে XXSize () পদ্ধতিগুলি কেবল ইঙ্গিত। প্রয়োজনবোধে একটি লেআউট ম্যানেজারকে একটু ইঙ্গিত দেওয়ার সাথে আমি সত্যই কিছুই দেখছি না। আমার সুইং কোডে আপনি মাঝে মধ্যে সেটএক্সএক্সএক্স সাইজ () পদ্ধতি পাবেন। অনেকগুলি নয়, তবে একবারে একবারে আমি তাদের প্রয়োজন বলে মনে করি। জকমোবক্স এবং জেএসপিনারের প্রায়শই ইঙ্গিত দরকার। বিশেষত একটি জকমোবক্স যা উপলব্ধি হওয়ার পরে এটি জনবহুল। আপনি এই পদ্ধতিগুলির যে কোনও এবং সমস্ত ব্যবহারের বিরোধী বলে মনে করছেন এবং কেন তা আমি জানি না। (সম্ভবত আমি অনুমান করি যে এটিই নৌকোটি মিস করছি)।
মাইকেল

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

15

কোন অবস্থার বাচ্চাদের মধ্যে অনুপাতের সংজ্ঞা দিতে হবে (সন্তানের 1 এর 10% স্থান, চাইল্ড 2 40%, চাইল্ড 3 50%) ব্যবহার করা উচিত, কাস্টম লেআউট ম্যানেজার বাস্তবায়ন না করে কি এটি অর্জন সম্ভব?

হয়তো GridBagLayoutআপনার চাহিদা মেটাবে তদ্ব্যতীত, ওয়েবে একটি টন লেআউট ম্যানেজার রয়েছে এবং আমি বাজি রেখেছি যে আপনার প্রয়োজনীয়তার সাথে খাপ খায়।


উত্তরের জন্য ধন্যবাদ. আমাকে ধরে নিতে হবে যে আপনি এটিও বোঝাতে চেয়েছিলেন: "সেটপ্রেফার্ডসাইজ মোটেও ব্যবহার করবেন না", তাই না?
হাইজেনবাগ

1
গ্রিডব্যাগএলআউট সীমাবদ্ধতাগুলি ব্যবহার করে, যেখানে আপনি প্রদত্ত উপাদানগুলির জন্য এক্স এবং ওয়াই উভয় ক্ষেত্রেই "ওজন" নির্দিষ্ট করতে পারেন, যাতে একটি আকার পরিবর্তন করতে অতিরিক্ত স্থান নিয়ে কী করা যায় তা লেআউটম্যানেজার সিদ্ধান্ত নিতে পারে। তবে প্রতিটি घटকের পছন্দসই আকার নির্ধারণ করতে আপনার এখনও সেটপ্রেফার্ড সাইজ ব্যবহার করতে পারেন / উল্লেখ করতে পারেন , নোট করুন "পছন্দসই" এর অর্থ এটি সর্বদা সম্মানিত হতে চলেছে না। বিশেষ ক্ষেত্রে আপনার যাইহোক সেট মাইনিমাম সাইজ এবং সেট ম্যাক্সিমিমাস সাইজের প্রয়োজন হতে পারে। তারা মন্দ নয় , এটি কেনা না। docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html
ル ち ゃ ん だ

5

আমি এটি স্বীকৃত উত্তরের চেয়ে আলাদা দেখছি।

1) আমার কি এই পদ্ধতিগুলির ব্যবহার সম্পূর্ণভাবে এড়ানো উচিত?

কখনই এড়াবেন না! আপনার উপাদানগুলির আকারের সীমাবদ্ধতাগুলি বিন্যাস পরিচালককে প্রকাশ করার জন্য তারা সেখানে রয়েছে express আপনি যদি কোনও লেআউট ম্যানেজার ব্যবহার না করেন এবং সেগুলি নিজেই ভিজ্যুয়াল লেআউটটি পরিচালনা করার চেষ্টা করেন তবে আপনি সেগুলি এড়াতে পারবেন।

দুর্ভাগ্যক্রমে, সুইং যুক্তিসঙ্গত ডিফল্ট মাত্রা নিয়ে আসছে না। তবে কোনও উপাদানটির মাত্রা নির্ধারণের পরিবর্তে যুক্তিযুক্ত ডিফল্ট দিয়ে নিজের উপাদানটি অবতরণ করা ভাল OP (সেক্ষেত্রে আপনি আপনার বংশধর শ্রেণিতে সেট এক্সএক্সএক্সএক্সএক্সকে কল করুন।) বিকল্পভাবে, আপনি একই প্রভাবের জন্য getXXX পদ্ধতিগুলিকে ওভাররাইড করতে পারেন।

2) পদ্ধতিগুলি একটি কারণে সংজ্ঞায়িত করা হয়েছে। সুতরাং আমি তাদের কখন ব্যবহার করব? কোন প্রসঙ্গে? কি উদ্দেশ্যে?

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

3) এই পদ্ধতিগুলি ব্যবহারের নেতিবাচক পরিণতিগুলি আসলে কী?

(আমি কেবল ভিন্ন পর্দার রেজোলিউশন সহ সিস্টেমগুলির মধ্যে বহনযোগ্যতা যুক্ত করতেই ভাবতে পারি)।

কোন নেতিবাচক ফলাফল। এগুলি লেআউট ম্যানেজারের জন্য ইঙ্গিত।

4) আমি মনে করি না যে কোনও লেআউটম্যানেজার সঠিকভাবে সমস্ত পছন্দসই বিন্যাসটি পূরণ করতে পারে।

আমার লেআউটটিতে প্রতিটি সামান্য প্রকরণের জন্য আমাকে কী নতুন লেআউট ম্যানেজার বাস্তবায়িত করতে হবে?

না, অবশ্যই না। স্বাভাবিক পদ্ধতির হ'ল অনুভূমিক এবং উল্লম্ব বিন্যাসের মতো বিভিন্ন বেসিক লেআউট ম্যানেজারকে ক্যাসকেড করা।

উদাহরণস্বরূপ, নীচে লেআউট:

<pre>
+--------------+--------+
| ###JTABLE### | [Add]  | 
| ...data...   |[Remove]|
| ...data...   |        |
| ...data...   |        |
+--------------+--------+
</pre>

দুটি অংশ আছে। বাম এবং ডান অংশগুলি একটি অনুভূমিক বিন্যাস। ডান অংশটি হ'ল আনুভূমিক বিন্যাসে যুক্ত একটি জেপানেল এবং এই জেপানেলটির একটি উল্লম্ব বিন্যাস রয়েছে যা বোতামগুলি উল্লম্বভাবে আউট করে।

অবশ্যই, এটি বাস্তব জীবনের বিন্যাসের সাথে জটিল হয়ে উঠতে পারে। সুতরাং গ্রিড ভিত্তিক লেআউট ম্যানেজার যেমন মিগলআউট আপনি যদি গুরুতর কিছু বিকাশ করতে চলেছেন তবে আরও ভাল।

5) 4 টির উত্তর যদি "হ্যাঁ" হয় তবে এটি কি লেআউট ম্যানেজার শ্রেণীর বিস্তার বাড়ে না যা রক্ষণাবেক্ষণ করা কঠিন হয়ে উঠবে?

না, আপনি স্পষ্টতই বিন্যাস পরিচালকদের বিকাশ করতে পারবেন না, যদি না আপনার খুব বিশেষ কিছু প্রয়োজন হয়।

)) এমন পরিস্থিতিতে যেখানে আমার অনুপাতের সংজ্ঞা দেওয়া দরকার ...

কম্পোনেন্টের বাচ্চাদের মধ্যে (যেমন, চাইল্ড 1 এর 10% স্পেস, চাইল্ড 2 40%, চাইল্ড 3 50% ব্যবহার করা উচিত), কাস্টম লেআউটম্যানেজার বাস্তবায়ন না করে এটি অর্জন করা সম্ভব?

মূলত, একবার পছন্দসই আকারগুলি ঠিক হয়ে গেলে আপনি শতাংশে কিছু করতে নাও চান। সহজভাবে, কারণ শতাংশগুলি অর্থহীন (যেমন উইন্ডো আকারের 10% জে টেক্সটফিল্ড রাখা অর্থহীন - যেহেতু কেউ উইন্ডোটি সঙ্কুচিত করতে পারে যাতে জেেক্সটফিল্ডটি 0 পিএক্স প্রশস্ত হয়, বা উইন্ডোটি প্রসারিত করতে পারে যাতে জে টেক্সটফিল্ডটি দুটি ডিসপ্লে জুড়ে থাকে) মাল্টি-ডিসপ্লে সেটআপ)।

তবে, আপনি বার বার শতাংশ ব্যবহার করতে পারেন আপনার গুইয়ের আকারের বৃহত বিল্ডিং ব্লকগুলি নিয়ন্ত্রণ করতে (উদাহরণস্বরূপ প্যানেল)।

আপনি জেএসপ্লিটপেন ব্যবহার করতে পারেন যেখানে আপনি উভয় পক্ষের অনুপাতটি প্রাক সেট করতে পারেন। অথবা, আপনি মিগলআউট ব্যবহার করতে পারেন যা আপনাকে শতাংশ, পিক্সেল এবং অন্যান্য ইউনিটে এই জাতীয় সীমাবদ্ধতা সেট করতে দেয়।


সত্যি? এই 0 ছিল? এটি 100+ আপসযুক্ত গ্রহণযোগ্য উত্তরের চেয়ে ভাল। এটি মূলত বলেছে "আপনি নেভার সেটপ্রেফার্ডসাইজ ব্যবহার করবেন!" যা মারাত্মক। আমার কাজের লাইনে, নির্দিষ্ট আকারের প্রয়োজনীয়তা প্রচুর রয়েছে যেমন "সুরক্ষার প্রয়োজনীয়তার মধ্যে" টাচ স্ক্রিনের বোতামগুলি [ওয়াই] দ্বারা [ওয়াই] দ্বারা হওয়া আবশ্যক "। btnBar.setPreferredSize( dimTouchBtn );এটি করার সেরা উপায়। সোজা, কাস্টম লেআউট ম্যানেজারের প্রয়োজন নেই। আমি বেশিরভাগটি GridBagLayoutসাথে ব্যবহার করি BorderLayoutএবং BoxLayoutসুবিধাজনক হলে বাসা বাঁধি। এটি একটি শক্তিশালী সমন্বয় এবং সহজেই ব্যবহারযোগ্য।
লুডুভিজক

আমার উপরের মন্তব্যে আমি তাড়াহুড়ো করেছিলাম। গৃহীত উত্তরের পরে এটিই আমি প্রথম উত্তর দেখেছি। কেন আর ভোটের গণনা অনুসারে বাছাই করা হয় না? আমি ভেবেছিলাম যে এটি মূলত ভোট গণনার অন্যতম মূল কারণ ছিল। আমি এখনও তবুও মূল মন্তব্যে দাঁড়িয়ে আছি; এটি আরও ভাল উত্তর। এটির বিন্দু # 6 ব্যতীত - এটি এত দুর্দান্ত নয়। আকার পরিবর্তন করার জন্য প্রচুর পরিমাণে (সংখ্যালঘু এখনও সংখ্যালঘু হতে পারে), এবং গ্রিডব্যাগলআউট আমার বেশিরভাগ ক্ষেত্রেই তা সমর্থন করে।
লুডুভিজক

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

0

আমার কি এই পদ্ধতিগুলির ব্যবহার সম্পূর্ণভাবে এড়ানো উচিত? আমি তাদের "এড়ানো" বলব না। আমি বলব যে আপনার যদি তাদের দরকার হয় তবে আপনি সম্ভবত কিছু ভুল করছেন। উপাদান আকারগুলি প্রসঙ্গে নির্ধারিত হয়। উদাহরণস্বরূপ, পাঠ্য উপাদানগুলির মাপগুলি আপনি নির্বাচিত ফন্টের সাথে মিলিত করে নির্দিষ্ট করা সারি এবং কলামগুলির সংখ্যা দ্বারা নির্ধারিত হয়। আপনার বোতাম এবং লেবেলের আকার গ্রাফিকের আকার হবে, যদি আপনি একটি সেট করেন, বা আপনার সেট করা পাঠ্যটি প্রদর্শনের জন্য প্রয়োজনীয় স্থান প্রয়োজন। প্রতিটি উপাদান একটি প্রাকৃতিক আকার আছে, এবং বিন্যাস পরিচালকরা মাপ নির্দিষ্টকরণের প্রয়োজন ছাড়াই এগুলি সব কিছু ছড়িয়ে দিতে ব্যবহার করবেন। প্রধান ব্যতিক্রম জেএসক্রোলপ্যান, যা এতে রয়েছে তার থেকে একটি আকার পৃথক। তাদের জন্য, আমি মাঝে মাঝে কল করব setSize()এবং সেই আকারটিকে কল করে প্রাথমিক উইন্ডোর আকার নির্ধারণ করিJFrame.pack()। সাধারণত, আমি উইন্ডোটির আকারটি JScrollPane আকার নির্ধারণ করতে দেব। ব্যবহারকারী উইন্ডোর আকার নির্ধারণ করবে। অনেক লেআউট ম্যানেজার আপনার যাইহোক নির্ধারিত আকারগুলি উপেক্ষা করে, তাই তারা প্রায়শই খুব বেশি ভাল কাজ করে না।

পদ্ধতিগুলি একটি কারণে সংজ্ঞায়িত করা হয়েছে। সুতরাং আমি তাদের কখন ব্যবহার করব? কোন প্রসঙ্গে? কি উদ্দেশ্যে? আমি বিশ্বাস করি যে এগুলি লেআউট পরিচালকদের ইঙ্গিত দেওয়ার জন্য যুক্ত করা হয়েছিল। এগুলি historicalতিহাসিক কারণে লিখিত হতে পারে কারণ লেআউট ম্যানেজাররা নতুন ছিলেন এবং লোকেরা তাদের উপর পুরোপুরি বিশ্বাস করেনি। আমি কয়েকজন বিকাশকারীকে জানি যারা লেআউট ম্যানেজারদের এড়িয়ে গিয়ে ম্যানুয়ালি সবকিছু রেখেছিলেন, কারণ তারা কোনও নতুন দৃষ্টান্ত শিখতে বিরক্ত করতে চান না। এটি একটি ভয়ানক ধারণা।

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

আমি মনে করি না যে কোনও লেআউটম্যানেজার সঠিকভাবে সমস্ত পছন্দসই বিন্যাসটি পূরণ করতে পারে। আমার লেআউটটিতে প্রতিটি সামান্য প্রকরণের জন্য আমাকে কী নতুন লেআউট ম্যানেজার বাস্তবায়িত করতে হবে? আপনার একটি নতুন লেআউটম্যানেজার "প্রয়োগ" করা উচিত নয়। আপনার বিদ্যমানগুলি ইনস্ট্যান্ট করা উচিত। আমি প্রায়শই একক উইন্ডোতে বেশ কয়েকটি লেআউট ম্যানেজার ব্যবহার করি। প্রতিটি জেপানেলের নিজস্ব লেআউট ম্যানেজার থাকবে। কিছু লোক নেস্টেড লেআউটগুলিতে ঝাঁকুনি দেয় কারণ তাদের রক্ষণাবেক্ষণ করা শক্ত। আমি যখন এগুলি ব্যবহার করি, তখন প্রত্যেকে কী করে তা সহজে দেখার জন্য আমি প্রত্যেককে তার নিজস্ব তৈরি পদ্ধতিটি দিয়ে থাকি। তবে আমি কখনও কোনও লেআউট ম্যানেজারকে "প্রয়োগ" করি না। আমি শুধু তাদের তাত্ক্ষণিক।

যদি 4 এর উত্তরটি "হ্যাঁ" হয় তবে এটি কি লেআউট ম্যানেজার শ্রেণীর বিস্তার বাড়ে না যা রক্ষণাবেক্ষণ করা কঠিন হয়ে উঠবে? আপনি যদি বিন্যাসে কিছুটা ভিন্নতার জন্য নতুন লেআউট ম্যানেজার ক্লাস প্রয়োগ করছেন তবে আপনি সেগুলি ভুল ব্যবহার করছেন। আপনি যদি কেবল নতুন লেআউট পরিচালকদের বাস্তবায়ন করেন তবে আপনি সম্ভবত কিছু ভুল করছেন। আমি কেবলমাত্র একটি লেআউটম্যানেজার ক্লাস বাড়িয়েছি, এটি ছিল জেএসক্রোলপ্যানে একটি জুম স্লাইডার যুক্ত করা।

কোন অবস্থার বাচ্চাদের মধ্যে অনুপাতের সংজ্ঞা দেওয়া দরকার (যেমন, চাইল্ড 1 এর 10% স্পেস, চাইল্ড 2 40%, চাইল্ড 3 50% ব্যবহার করা উচিত), কাস্টম লেআউটম্যানেজার বাস্তবায়ন না করে কি এটি অর্জন করা সম্ভব? জেএসপ্লিটপ্যানে প্রতিটি উপাদানকে যে শতাংশে প্রাপ্ত শতাংশ নির্ধারণের একটি উপায় রয়েছে। ডিভাইডারটি ডিফল্টরূপে চলনযোগ্য তবে আপনি চাইলে এটি বন্ধ করতে পারেন। আমি সেই বৈশিষ্ট্যটি বেশি ব্যবহার করি না। আমার সাধারণত কিছু উপাদান থাকে যা একটি সেট আকার নেয় এবং বাকী স্থানটি একটি স্ক্রল ফলক দ্বারা গ্রহণ করা হয়। স্ক্রোল ফলকটির আকার উইন্ডো আকারের সাথে সামঞ্জস্য করবে। যদি আপনার পাশাপাশি দুটি স্ক্রোল ফলক থাকে, আপনি এগুলি জেএসপ্লিটপ্যানে রাখতে পারেন এবং ব্যবহারকারীরা উইন্ডোগুলি প্রসারিত ও চুক্তি করার সাথে সাথে প্রত্যেককে দেওয়া নতুন জায়গার শতাংশ নির্দিষ্ট করতে পারে।

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