Не изменяемая размерность окна и расположение

Если я создаю не изменяемые по размеру JFrames, а окна Aero включены, setLocation, похоже, не учитывает границу окна правильно.

В следующем коде я ожидаю, что второй кадр будет расположен справа от первого кадра, вместо этого границы будут перекрываться. Если Aero отключен или я удаляю вызовы на 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 неразрешимых диалога рядом друг с другом без перекрытия границ?

Изменить: добавлены скриншоты (также изменился frame2 на JDialog вместо JFrame)

Aero On: Aero On

Aero Off: Aero Off

Aero On, но изменяемый размер: Aero On but resizable

Ответ 1

Каковы проблемы с ограничениями параметров в контейнерах, не изменяемых по размеру?

Предположим, вы скорректируете границы, чтобы хорошо выглядеть на своей платформе. Предположим, что пользовательская платформа имеет шрифт с разными, скажем, большими, FontMetrics. Этот пример несколько надуман, но вы получаете эту идею. Если вы измените границы контейнера без изменения размера, убедитесь, что любой текст отображается независимо от шрифта по умолчанию для платформы хоста.

image

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://stackoverflow.com/a/12532237/230513
 */
public class Evil extends JPanel {

    private static final String s =
        "Tomorrow 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();
            }
        });
    }
}

Ответ 2

Похоже, что это не проблема Java, а проблема aero appcompat, как описано здесь.

Одно из решений, которое я вижу на Java, - это позволить изменять размер окна, а затем работать с ошибкой setMaximumSize