7

サイズ変更できない JFrame を作成し、Windows Aero が有効になっsetLocationている場合、ウィンドウの境界が正しく考慮されていないようです。

次のコードでは、境界線が重なっている代わりに、2 番目のフレームが最初のフレームの右側に配置されることが期待されます。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 を JFrame ではなく JDialog に変更)

エアロオン: エアロオン

エアロオフ: エアロオフ

Aero オンだがサイズ変更可能: Aero オンだがサイズ変更可能

4

2 に答える 2

7

サイズ変更できないコンテナの設定境界の問題は何ですか?

プラットフォームで見栄えがよくなるように境界を調整するとします。ユーザーのプラットフォームに、異なる、たとえば大きいフォントがあるとしますFontMetrics。この例はやや不自然ですが、おわかりいただけると思います。サイズ変更できないコンテナの境界を変更する場合は、ホスト プラットフォームのデフォルト フォントに関係なく、すべてのテキストが表示されるようにしてください。

画像

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'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();
            }
        });
    }
}
于 2012-09-21T14:12:09.237 に答える
5

こちらで説明されているように、これは Java の問題ではなく、Aero アプリの互換性の問題のようです

Java で見られる解決策の 1 つは、ウィンドウのサイズを変更できるようにしてから、setMaximumSize バグを回避することです。

于 2012-09-24T14:22:03.850 に答える