java गैर resizable खिड़की सीमा और स्थिति




windows swing (2)

अगर मैं गैर-पुन: आकारणीय JFrames बना देता हूं, और विंडो ऐरो को सक्षम किया setLocation है setLocation विंडो सीमा को सही ढंग से लेना नहीं प्रतीत होता है

निम्नलिखित कोड में मुझे उम्मीद है कि दूसरी फ़्रेम को पहले फ्रेम के दाईं ओर स्थित किया जाएगा, बजाय सीमाएं अतिव्यापी हैं। यदि एयरो अक्षम है या अगर मैं कॉल को setResizable करने के लिए setResizable यह संभव है जैसा अपेक्षित है

import java.awt.Rectangle;
import javax.swing.JFrame;
public class FrameBorders {
public static void main(String[] args) {
    JFrame frame1 = new JFrame("frame 1");
    JFrame frame2 = new JFrame("frame 2");

    frame1.setResizable(false);
    frame2.setResizable(false);

    frame1.setVisible(true);        
    Rectangle bounds = frame1.getBounds();      
    frame2.setLocation(bounds.x+bounds.width, bounds.y);
    frame2.setVisible(true);

}
}

क्या मैं कुछ गलत कर रहा हूं या क्या यह एक बग है? अतिपरिवर्तन सीमाओं के बिना मैं कैसे 2 अपरिहार्य संवाद साइड की तरफ प्रदर्शित कर सकता हूं?

संपादित करें: स्क्रीनशॉट जोड़ा गया (फ़्रेम 2 को JFial के बजाय JDialog में बदल दिया गया)

एयरो ऑन:

एयरो ऑफ:

एयरो पर लेकिन resizable:


ऐसा लगता है कि यह जावा मुद्दा नहीं है बल्कि एक एरो ऐप कॉमटैप इश्यू है, जैसा कि यहां वर्णित है

जावा में देखे जाने वाले एक समाधान यह है कि विंडोज़ का आकार बदलने योग्य हो तो setMaximumSize बग के आसपास काम करें


गैर resizable कंटेनर पर सेटिंग की सीमा के साथ क्या समस्याएं हैं?

मान लीजिए कि आप अपने प्लेटफ़ॉर्म पर अच्छा देखने के लिए सीमा को समायोजित करते हैं। मान लीजिए कि उपयोगकर्ता के प्लेटफॉर्म में अलग-अलग फ़ॉन्ट है, बड़ा, FontMetrics कहते हैं। यह उदाहरण कुछ हद तक contrived है, लेकिन आप विचार मिलता है। यदि आप एक गैर-पुनर्जीवित कंटेनर की सीमाओं को बदलते हैं, तो सुनिश्चित करें कि मेजबान प्लेटफ़ॉर्म के डिफ़ॉल्ट फ़ॉन्ट पर ध्यान दिए बिना किसी पाठ को दिखाई दे।

import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

/**
 * @see http://.com/a/12532237/230513
 */
public class Evil extends JPanel {

    private static final String s =
        "Tomorrow's winning lottery numbers: 42, ";
    private JLabel label = new JLabel(s + "3, 1, 4, 1, 5, 9", JLabel.LEFT);

    public Evil() {
        this.add(label);
    }

    private void display() {
        JFrame f = new JFrame("Evil");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(this, BorderLayout.WEST);
        f.pack();
        int w = SwingUtilities.computeStringWidth(
            label.getFontMetrics(label.getFont()), s);
        int h = f.getHeight();
        f.setSize(w, h);
        f.setResizable(false);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new Evil().display();
            }
        });
    }
}