लेआउट असाइन करने में त्रुटि: BoxLayout साझा नहीं किया जा सकता है


114

मेरे पास यह जावा JFrameवर्ग है, जिसमें मैं एक बॉक्सऑउटआउट का उपयोग करना चाहता हूं, लेकिन मुझे एक त्रुटि मिलती है java.awt.AWTError: BoxLayout can't be shared। मैंने दूसरों को इस समस्या के साथ देखा है, लेकिन उन्होंने इसे कंटेंटपैन पर बॉक्सऑलआउट बनाकर हल किया, लेकिन मैं यहाँ क्या कर रहा हूँ। यहाँ मेरा कोड है:

class EditDialog extends JFrame {
    JTextField title = new JTextField();
    public editDialog() {
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        setTitle("New entity");
        getContentPane().setLayout(
            new BoxLayout(this, BoxLayout.PAGE_AXIS));
        add(title);
        pack();
        setVisible(true);
    }
}

जवाबों:


173

आपकी समस्या यह है कि आप BoxLayouta JFrame( this) के लिए बना रहे हैं , लेकिन इसे a JPanel( getContentPane()) के लिए लेआउट के रूप में सेट कर रहे हैं । प्रयत्न:

getContentPane().setLayout(
    new BoxLayout(getContentPane(), BoxLayout.PAGE_AXIS)
);

5
हां, लेकिन इसे हटाने से यह समस्या दूर हो जाएगी, अब नहीं होगा?
माइकल मायर्स

75

मैंने इस त्रुटि को भी बनाया है:

JPanel panel = new JPanel(new BoxLayout(panel, BoxLayout.PAGE_AXIS));

JPLel को अभी तक आरंभ नहीं किया गया है जब इसे BoxLayout के पास भेजा जा रहा है। तो इस लाइन को इस तरह विभाजित करें:

JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS));

यह काम करेगा।


16

मुझे लगता है कि पिछले उत्तरों से हाइलाइट करने के लिए एक महत्वपूर्ण बात यह है कि BoxLayout का लक्ष्य (पहला पैरामीटर) एक ही कंटेनर होना चाहिए जिसे setLayout विधि निम्न उदाहरण में कहा जा रहा है:

JPanel XXXXXXXXX = new JPanel();
XXXXXXXXX.setLayout(new BoxLayout(XXXXXXXXX, BoxLayout.Y_AXIS));

6

यदि आप लेआउट का उपयोग कर रहे हैं JFrameजैसे:

JFrame frame = new JFrame();
frame.setLayout(new BoxLayout(frame, BoxLayout.Y_AXIS));
frame.add(new JLabel("Hello World!"));

नियंत्रण को वास्तव में जोड़ा जा रहा है, ContentPaneइसलिए ऐसा लगेगा कि यह JFrameऔर के बीच 'साझा' हैContentPane

इसके बजाय यह करें:

JFrame frame = new JFrame();
frame.setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS));
frame.add(new JLabel("Hello World!"));

डांग आपने मुझे बचा लिया, - यह एकमात्र उत्तर क्यों है जिसमें उल्लेख मिलता हैकेंटपेंट ()?
अलेक्जेंडर मैकएनके

@AlexanderMcN संकाय, शायद इसलिए JFrameकि आम तौर पर इसकी आवश्यकता नहीं है (AWT के विपरीत Frame)। से JFrameप्रलेखन: As a convenience, the add, remove, and setLayout methods of this class are overridden, so that they delegate calls to the corresponding methods of the ContentPane. For example, you can add a child component to a frame as follows: frame.add(child); And the child will be added to the contentPane. The content pane will always be non-null. तक frameवे एक संदर्भ दे रहे JFrameउदाहरण।
एलिफैन

@AlexanderMcN संकाय, आगे, एक JFrame में केवल एक सामग्री फलक है, और यह हमेशा वहाँ रहने की गारंटी है।
एलिफैन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.