حجم JPanel تلقائيا داخل JFrame
سؤال
لدي فئة فرعية JPanel التي أضيف فيها التروما، التسميات، الجداول، إلخ. لتظهر على الشاشة، استخدم JFrame:
MainPanel mainPanel = new MainPanel(); //JPanel subclass
JFrame mainFrame = new JFrame();
mainFrame.setTitle("main window title");
mainFrame.getContentPane().add(mainPanel);
mainFrame.setLocation(100, 100);
mainFrame.pack();
mainFrame.setVisible(true);
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ولكن عندما أكون حجم النافذة، لا تتغير حجم اللوحة. كيفية جعل حجم لوحة لتكون نفس حجم النافذة حتى لو تم تغيير حجمها؟
المحلول
يمكنك تعيين مدير تخطيط مثل Borderlayout ثم حدد أكثر تحديدا، حيث يجب أن تذهب اللوحة الخاص بك:
MainPanel mainPanel = new MainPanel();
JFrame mainFrame = new JFrame();
mainFrame.setLayout(new BorderLayout());
mainFrame.add(mainPanel, BorderLayout.CENTER);
mainFrame.pack();
mainFrame.setVisible(true);
هذا يضع اللوحة في منطقة مركز الإطار وتتيح أنه ينمو تلقائيا عند تغيير حجم الإطار.
نصائح أخرى
تحتاج إلى تعيين مدير تخطيط ل Jeframe للاستخدام - هذا يتعامل مع كيفية وضع المكونات. واحد مفيد هو مدير Borderlayout.
ببساطة إضافة سطر التعليمات البرمجية التالي يجب إصلاح مشاكلك:
mainFrame.setLayout(new BorderLayout());
(قم بذلك قبل إضافة مكونات إلى JFrame)
إذا كان خيار Borderlayout الذي يوفره أصدقاؤنا لا يعمل، فحاول إضافة مكونات NectentListerner إلى JFrame وتنفيذ طريقة ComponentResized (Event). عند تغيير حجم كائن JFrame، سيتم استدعاء هذه الطريقة. لذلك إذا كتبت التعليمات البرمجية لتعيين حجم JPanel في هذه الطريقة، فستحقق النتيجة المقصودة.
أنا أعرف أن هذا "الحل" ليس جيدا ولكن استخدامه كشبكة أمان. ؛)
من تجربتي، استخدمت Gridlayout.
thePanel.setLayout(new GridLayout(a,b,c,d));
A = رقم الصف، B = رقم العمود، C = الفجوة الأفقية، D = الفجوة الرأسية.
على سبيل المثال، إذا كنت ترغب في إنشاء لوحة مع:
- صف غير محدود (تعيين A = 0)
- 1 عمود (تعيين ب = 1)
- الفجوة الرأسية = 3 (مجموعة D = 3)
الرمز أدناه:
thePanel.setLayout(new GridLayout(0,1,0,3));
هذه الطريقة مفيدة عندما تريد إضافة jscrollpane إلى JPanel الخاص بك. سيتغير حجم JPanel داخل Jscrollpane تلقائيا عند إضافة بعض المكونات عليها، لذلك سيتم إعادة ضبط JSCrollPane تلقائيا شريط التمرير تلقائيا.
كما قالت الملصقات الأخرى، تحتاج إلى تغيير LayoutManager التي يتم استخدامها. كنت أفضل دائما باستخدام Gridlayout حتى يصبح الكود الخاص بك:
MainPanel mainPanel = new MainPanel();
JFrame mainFrame = new JFrame();
mainFrame.setLayout(new GridLayout());
mainFrame.pack();
mainFrame.setVisible(true);
يبدو أن Gridlayout صحيحة من المفاهيم بالنسبة لي عندما تريد أن تأخذ اللوحة الخاصة بك الشاشة بأكملها.