Gridbaglayout padding
-
22-09-2019 - |
سؤال
أنا أستخدم أ 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
, ، إذا لم تملأ المحتويات الحاوية بأكملها ، فسيتمركز تلقائيًا جميع محتوياتها داخل الحاوية. هذا هو السبب في أنك تحصل على فجوة كبيرة حقًا.
هناك طريقتان في الأساس لإصلاح هذا:
- الطريقة الصعبة: كمان مع
GridBagConstraints
. لقد حققت نجاحًا محدودًا في هذا عند محاولة تجنب سلوك الوسط. - الطريقة السهلة: ضع
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
:
يتم استخدام هذا الحقل عندما تكون منطقة عرض المكون أكبر من الحجم المطلوب للمكون. يحدد ما إذا كان سيتم تغيير حجم المكون ، وإذا كان الأمر كذلك ، فكيف.