باستخدام تخطيطات مختلفة في واجهة المستخدم الرسومية

StackOverflow https://stackoverflow.com/questions/1593085

سؤال

هذا ما يجب أن يبدو عليه برنامجي وأنا مرتبك بعض الشيء حول المكان الذي يجب أن أستخدم فيه تخطيطات مختلفة.

لدي فئة نافذة تستدعي فئة الألواح ويدعو فئة اللوحة إلى فئات InputPanel و DisplayPanel. تستدعي فئة InputPanel الخاصة بي تفاصيل الفصول الخاصة بي و Cemepanel و ButtonPanel بحيث تشكل ما يظهر ضمن علامة تبويب الإدخال. قيل لي أن أستخدم حدوث حدود للنافذة بأكملها ، وأن يكون التفاصيل (اللوحة اليسرى) و Cemepanel Gridlayout.

هل هذا يعني أنني يجب أن:

  1. ضع رمز BorderLayout في لوحة ورمز GridLayout في Cremepanel و DelpainSpanel أو
  2. ضع رمز BorderLayout في النافذة ورمز GridLayout في اللوحة؟

ALT TEXT http://img137.imageshack.us/img137/6422/93381955.jpg

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

المحلول

حسنًا ، وصفك مربك بعض الشيء (أو ما زلت متعبًا جدًا اليوم أو لم يكن لدي ما يكفي من الكافيين حتى الآن). إن مفهومتك عن فصول لوحة "الاتصال" من الآخرين هي أيضًا غريبة بعض الشيء.

ولكن بقدر ما أستطيع رؤيته ، فإن الخيار الأول هو الخيار الصحيح.

بشكل عام ، يمكنك أن تعشق الكائنات في وقت التشغيل ، لذلك قد يبدو مثل ما يلي إلى حد ما:

InputPanel (has BorderLayout)
+--DetailsPanel (put in BorderLayout.WEST; has GridLayout)
|  +--nameLabel
|  +--nameTextField
|  +--...
+--CrimePanel (put in BorderLayout.NORTH; has GridLayout)
|  +--murderRadioButton
|  +--arsonRadioButton
|  +--...
+--ButtonPanel (put in BorderLayout.CENTER; has GridLayout)
   +--button

عادة ما تقوم بذلك في مُنشئ الفئة المناسبة:

public class InputPanel {
    public InputPanel() {
        this.setLayout(new BorderLayout());
        this.add(new DetailsPanel(), BorderLayout.WEST);
        this.add(new CrimePanel(), BorderLayout.NORTH);
        this.add(new ButtonPanel(), BorderLayout.CENTER);
    }
}

public class DetailsPanel {

    JLabel nameLabel;
    JTextField nameField;
    // ...

    public DetailsPanel() {
        this.setLayout(new GridLayout(5, 1));

        nameLabel = new JLabel("Name");
        nameField = new JTextField();
        // ...

        this.add(nameLabel);
        this.add(nameField);
        // ...
    }
}

...

ومع ذلك ، أرى مشكلة صغيرة هنا: منذ ذلك الحين GridLayout لا تسمح للمكونات بامتداد أعمدة متعددة قد تحتاج إلى عش اللوحات الأخرى في DetailsPanel على اليسار كذلك. يمكنك الابتعاد مع واحد GridBagLayout التي لديها القدرات المطلوبة ، أو أنك تعشق لوحات أخرى هناك:

DetailsPanel (has BorderLayout)
+--panel1 (has GridLayout with 2 rows, 1 column; put in BorderLayout.NORTH)
|  +--nameLabel
|  +--nameField
+--panel2 (has GridLayout with 3 rows, 2 columns; put in BorderLayout.CENTER)
   +--dayField
   +--dayLabel
   +--monthField
   +--...

نصائح أخرى

من وصفك ، يجب أن يعمل الخيار 1. إعطاء المدخلات JPanel أ BorderLayout, ، مع التفاصيل والجريمة والزر JPanelS (في الغرب والشمال والجنوب على التوالي) وجود GridLayoutس.

بادئ ذي بدء ، ستحتاج إلى وضع jtabbedpane في النافذة لاحتواء علامتي التبويب (الإدخال والعرض) ، كل منهما يتكون من JPanel.

يمكن تقسيم لوحة الإدخال باستخدام porderlayout كما تصف جوان ؛ بديل آخر هو Grouplayout تم تقديمه في Java 6 ، وهو قوي للغاية ، ولكن يصعب لف عقلك. يمكن استخدامه لتخطيط علامة التبويب بأكملها في لوحة واحدة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top