GroupLayout
घटकों के केंद्र का समर्थन करता है। यह एक बहुत सक्षम लेआउट प्रबंधक है। मैंने व्यक्तिगत रूप से इसे MigLayout
प्रबंधक के बाद और FormLayout
प्रबंधक के बाद रखा है।
निम्नलिखित तीन उदाहरणों में, हमारे पास एक पैनल और एक बटन है। बटन क्षैतिज केंद्रित है।
NetBeans बिल्डर
साथ केंद्रित एक Netbeans निर्माता का उपयोग करके एक घटक केंद्र के लिए, हम बटन के दोनों ओर से क्षैतिज आकार बदलने योग्य अंतराल बनाने की जरूरत है।
स्क्रीनशॉट का हरा क्षेत्र वर्तमान में चयनित अंतराल है। अंतराल के अंदर तार बताते हैं कि यह एक आकार बदलने योग्य अंतर है। जब हम फार्म पर घटक जगह
अंतराल स्वचालित रूप से जुड़ जाते हैं। एक अंतर को आकार बदलने योग्य परिभाषित करने के लिए, हम अंतराल पर राइट क्लिक करें और "लेआउट स्पेस संपादित करें" विकल्प का चयन करें।
एक आकार बदलने योग्य अंतराल पाने के लिए, हम आकार बदलने योग्य चेक बॉक्स की जाँच करें: हम निम्नलिखित संवाद मिलता है।
एक समानांतर समूह
अवयव का उपयोग करके स्वयं केंद्रित GroupLayout.Alignment.CENTER
पैरामीटर पारित करके समानांतर समूह में केंद्रित किया जा सकता है।
package com.zetcode;
import java.awt.Container;
import java.awt.EventQueue;
import javax.swing.BorderFactory;
import javax.swing.GroupLayout;
import static javax.swing.GroupLayout.Alignment.CENTER;
import static javax.swing.GroupLayout.DEFAULT_SIZE;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class GroupLayoutCenter extends JFrame {
public GroupLayoutCenter() {
initUI();
setTitle("Centered button");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
}
private void initUI() {
Container pane = getContentPane();
GroupLayout gl = new GroupLayout(pane);
pane.setLayout(gl);
gl.setAutoCreateGaps(true);
gl.setAutoCreateContainerGaps(true);
JPanel pnl = new JPanel();
pnl.setBorder(BorderFactory.createEtchedBorder());
JButton btn = new JButton("Button");
gl.setHorizontalGroup(gl.createParallelGroup(CENTER)
.addComponent(pnl, DEFAULT_SIZE, 200, DEFAULT_SIZE)
.addComponent(btn)
);
gl.setVerticalGroup(gl.createSequentialGroup()
.addComponent(pnl, DEFAULT_SIZE, 200, DEFAULT_SIZE)
.addComponent(btn)
);
pack();
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
GroupLayoutCenter ex = new GroupLayoutCenter();
ex.setVisible(true);
}
});
}
}
अंतराल का उपयोग करके स्वयं केंद्रित
यह समाधान क्या NetBeans उत्पन्न कोड करता है। हम बटन के बाएं और दाएं किनारे पर दो आकार बदलने योग्य अंतराल रखते हैं।
package com.zetcode;
import java.awt.Container;
import java.awt.EventQueue;
import javax.swing.BorderFactory;
import javax.swing.GroupLayout;
import static javax.swing.GroupLayout.DEFAULT_SIZE;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class GroupLayoutCenter2 extends JFrame {
public GroupLayoutCenter2() {
initUI();
setTitle("Centered button");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
}
private void initUI() {
Container pane = getContentPane();
GroupLayout gl = new GroupLayout(pane);
pane.setLayout(gl);
gl.setAutoCreateGaps(true);
gl.setAutoCreateContainerGaps(true);
JPanel pnl = new JPanel();
pnl.setBorder(BorderFactory.createEtchedBorder());
JButton btn = new JButton("Button");
gl.setHorizontalGroup(gl.createParallelGroup()
.addComponent(pnl, DEFAULT_SIZE, 200, DEFAULT_SIZE)
.addGroup(gl.createSequentialGroup()
.addGap(5, 100, Short.MAX_VALUE)
.addComponent(btn)
.addGap(5, 100, Short.MAX_VALUE))
);
gl.setVerticalGroup(gl.createSequentialGroup()
.addComponent(pnl, DEFAULT_SIZE, 200, DEFAULT_SIZE)
.addComponent(btn)
);
pack();
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
GroupLayoutCenter2 ex = new GroupLayoutCenter2();
ex.setVisible(true);
}
});
}
}
मामले (मुझे लगता है कि यह बहुत अक्सर होता है) आप कई नियंत्रण के साथ एक रूप होता है। नियंत्रण का लेआउट GroupLayout को एक आदर्श विकल्प बनाता है। अंत में बटन को छोड़कर, यह केंद्रित होना चाहिए। निस्संदेह मैं पृष्ठ के अंत में एक जेपीनल डाल सकता हूं, इसे क्षैतिज रूप से आकार देने योग्य बना सकता हूं और JButton को अपने (डिफ़ॉल्ट) केंद्रित फ्लोलाउट में डाल सकता हूं। लेकिन सवाल इस तथ्य से उत्पन्न होता है कि अन्य जीयूआई बिल्डरों (इतनी परिष्कृत नहीं) में डेल्फी के समान, केंद्र केंद्रित तर्क का एक बिड़ौड़ा विस्तार है। कहीं भी नियंत्रण को लंगरने का मतलब यह नहीं है कि इसे केंद्र में "फ्लोट" दें। – AgostinoX
@AgostinoX आपको इस 'लेआउटमैनेजर' पीट +1 – mKorbel
@mKorbel के साथ बहुत आश्चर्य होगा, मुझे यह सुनकर बहुत खुशी नहीं हुई :-)। क्या आप कुछ नमूने प्रदान कर सकते हैं? – AgostinoX