2

プレイヤーが駒をドラッグ アンド ドロップできる単純な Java Swing GUI チェス盤を作成しています。問題は、フレームの周囲の境界線 (上部にタイトル、最大化/最小化/閉じるボタンなど) があるため、座標が歪んでいることです。(0, 0) はフレームの左上隅です。フレーム、つまり X ボタンの少し上ですが、GUI はタイトル バーのすぐ下から構築を開始するため、GUI は座標と一致せず、本来の方法で動作しません。さらに、フレームのサイズをたとえば 100 x 100 に設定すると、フレームが境界線を補正しないため、GUI の下部と右側の一部が切り取られます。アプレットとして実行すると、この問題は発生しませんが、実行したくありません。

sscce:

import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;

public class class1 extends JFrame{
    public class1(){
        addMouseListener(new MouseAdapter(){
            public void mousePressed(MouseEvent evt){
                System.out.print(evt.getPoint());
            }
        });
    }

    public static void main(String[] args){
        class1 c = new class1();
        c.setTitle("Test");
        c.setSize(320, 320);
        c.setLocationRelativeTo(null);
        c.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        c.setVisible(true);
    }
}
4

1 に答える 1

1

コードなしでコードの何が問題なのかを知るのは難しいですが、さまざまなレイアウト マネージャーを使用して簡単な方法で実行し、これらのマネージャーにコンポーネントのレイアウトとサイズ調整を任せれば、それは確かです。pack()JFrame の呼び出しを含め、通常、物事は簡単にうまく収まります。繰り返しになりますが、サイズを設定するのではなく、コンポーネントの優先サイズとレイアウト マネージャーに任せてください。

このアドバイスが役に立たない場合は、より多くの情報とコード、できればsscceを提供してください。これは、問題を実証する以外に何もしない、コンパイル可能で実行可能な小さなプログラムです。

編集: これは Swing GUI であると想定しています。そうであるかどうかを確認してください。

編集2:あなたが抱えている問題の1つは、メニューバー、サイズ変更/最大化/閉じるアイコンを含む「装飾」を考慮せずにJFrameのサイズを設定していることです。繰り返しますが、サイズを直接設定するべきではありませんがgetPreferredSize()、グリッドを保持する JPanel のメソッドをより適切にオーバーライドする必要がある場合。

編集 3: 例:

import java.awt.*;
import javax.swing.*;

public class Grid extends JPanel {
   public static final Color DARK_COLOR = Color.red.darker().darker().darker();
   public static final Color LIGHT_COLOR = Color.lightGray.brighter();
   public static final int SQUARE_SIDE = 60;
   private static final int ROW_COUNT = 8;

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(ROW_COUNT * SQUARE_SIDE, ROW_COUNT * SQUARE_SIDE);
   }

   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      for (int i = 0; i < ROW_COUNT; i++) {
         for (int j = 0; j < ROW_COUNT; j++) {
            Color c = (i % 2 == j % 2) ? LIGHT_COLOR : DARK_COLOR;
            g.setColor(c);
            int x = i * SQUARE_SIDE;
            int y = j * SQUARE_SIDE;
            g.fillRect(x, y, SQUARE_SIDE, SQUARE_SIDE);
         }
      }
   }

   public Grid() {
      // TODO Auto-generated constructor stub
   }

   private static void createAndShowGui() {
      Grid mainPanel = new Grid();

      JFrame frame = new JFrame("Grid");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }

}
于 2012-05-13T03:51:33.457 に答える