ウィンドウの境界線の位置とサイズ変更不可のウィンドウ
Java Swing アプリケーションで、サイズ変更不可の JFrame を作成すると、setLocation メソッドが正しく動作しない場合があります。 Windows Aero が有効になっている場合は、ウィンドウの境界線を考慮します。これにより、ウィンドウを並べて配置するときにウィンドウの境界線が重なり合います。
次のコードを検討してください:
import java.awt.Rectangle; import javax.swing.JFrame; public class WindowBorders { 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); } }
Windows Aero を使用する場合、フレーム 2 の境界線がフレーム 1 の境界線と重なるように配置されます。ただし、Windows Aero が無効になっている場合、またはフレームがサイズ変更可能に設定されている場合、配置は期待どおりに機能します。
この問題を理解するには、サイズ変更できないコンテナーがオペレーティング システムによってどのように処理されるかを考慮してください。ウィンドウのサイズを変更できない場合、オペレーティング システムはウィンドウのコンテンツと境界線に必要な最小サイズを決定します。この最小サイズが適用され、ウィンドウをそれ以上小さくすることはできません。
コードでは、setLocation メソッドを使用してフレーム 2 の位置を設定するときに、ウィンドウの位置を指定しているため、問題が発生します。ウィンドウの境界線ではなく、コンテンツです。これは、フレーム 2 の境界線が考慮されないことを意味し、その結果、境界線が重なり合います。
この問題を回避するには、境界線を考慮してフレーム 2 の位置を調整できます。これを行う 1 つの方法は、目的の X 座標から境界線の幅を減算することです。
frame2.setLocation(bounds.x + bounds.width - frame2.getInsets().right, bounds.y);
これにより、frame2 の境界線が適切に考慮され、2 つのウィンドウが境界線を重なり合うことなく並べて配置されます。
以上がWindows Aero を有効にして Java Swing に並べて配置すると、サイズ変更できない JFrame が重なるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。