سؤال

أنا أستخدم أ GridBagLayout إلى (حاليا) عرض صفين. أدرك أن هذا التصميم مبالغ فيه لهذه المهمة ، لكنني أحاول تعلم كيفية استخدامه. المشكلة هي أنني أضفت اللوحتين إلى صفين منفصلين وهناك فجوة كبيرة حول المحتوى (انظر الصورة والرمز أدناه):alt text http://www.imagechicken.com/uploads/1264533379009864500.png

Image background;
    public Table(){
        super();
        ImageIcon ii = new ImageIcon(this.getClass().getResource("pokerTableV2.png"));
        background = ii.getImage();
        setSize(Constants.FRAME_WIDTH, Constants.TABLE_HEIGHT);

        setLayout(new GridBagLayout());

        GridBagConstraints constraints = new GridBagConstraints();
        constraints.gridx = 0;
        constraints.gridy = 0;
        constraints.fill = GridBagConstraints.HORIZONTAL;

        JButton button = new JButton("hello world");
        JPanel panel1 = new JPanel();
        panel1.setPreferredSize(new Dimension(800,100));
        panel1.add(button, BorderLayout.CENTER);
        panel1.setBackground(Color.yellow);
        add(panel1, constraints);

        constraints.gridx = 0;
        constraints.gridy = 1;

        JPanel middlePanel = new JPanel();
        middlePanel.setPreferredSize(new Dimension(800,350));
        middlePanel.add(button, BorderLayout.CENTER);
        middlePanel.setBackground(Color.blue);
        add(middlePanel, constraints);


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

المحلول

لسوء الحظ ، مع GridBagLayout, ، إذا لم تملأ المحتويات الحاوية بأكملها ، فسيتمركز تلقائيًا جميع محتوياتها داخل الحاوية. هذا هو السبب في أنك تحصل على فجوة كبيرة حقًا.

هناك طريقتان في الأساس لإصلاح هذا:

  1. الطريقة الصعبة: كمان مع GridBagConstraints. لقد حققت نجاحًا محدودًا في هذا عند محاولة تجنب سلوك الوسط.
  2. الطريقة السهلة: ضع GridBagLayout داخل أ FlowLayout, ثم اضبط محاذاة FlowLayout إلى أعلى اليسار ، أو أي شيء تريده.

لقد سألت ، وأجبت ، هذا السؤال نفسي في وقت ما الأسبوع الماضي.

لذا في حالتك ، تضيف panel1 و middlePanel مباشرة إلى JFrame (؟) ، مع أ GridBagLayout

JFrame (GridBagLayout)
 - panel1
 - middlePanel

أود أن أقترح هذا الهيكل البديل بدلاً من ذلك ، للتخلص من جميع المساحة الإضافية (والمحاذاة المركزية أيضًا ، إذا أردت).

JFrame (FlowLayout)
 - JPanel (GridBagLayout)
   - panel1
   - middlePanel

HTH

نصائح أخرى

يستخدم

constraints.fill = GridBagConstraints.BOTH;
constraints.weightx = 1d;
constraints.weighty = 1d;

جافادوك ل weightx/weighty يقول:

يحدد كيفية توزيع مساحة أفقية/عمودية إضافية.

جافادوك ل fill:

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

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