2012-05-13 33 views
2

我想提出一個簡單的Java Swing GUI的棋盤上,玩家可以通過拖放件。問題是,由於框架周圍的邊框(標題在頂部,最大化/最小化/關閉按鈕等),座標偏斜 - (0,0)是左上角框架,也就是說,稍微高於X按鈕,但GUI開始在標題欄下方自行構建,因此GUI不會與座標對齊,並且事情最終不會按照他們應該的方式工作。此外,當我將框架的大小設置爲例如100 x 100時,我的GUI的下半部分和右側部分會被截斷,因爲框架無法補償其邊框。當我將它作爲applet運行時,我沒有這個問題,但我不想這樣做。我怎麼能擺脫我的框架窗口周圍的邊界,所以我可以只有普通的圖形用戶界面,或讓座標正確設置自己?Java圖形用戶界面:使座標正確對齊

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); 
    } 
} 

回答

1

很難知道什麼是你的代碼錯誤無碼,但我知道,如果你去通過各種佈局管理器最簡單的方式,讓這些經理做爲您鋪設組件並確定事物的大小,包括在JFrame上調用pack(),通常情況下很容易就能很好地落實到位。所以再次,不要設置任何東西的大小,而是讓組件的首選大小和佈局管理器爲您做這件事。

如果這個建議沒有幫助,請給我們更多的信息和代碼,最好的sscce,小編譯和執行的程序並不做多展示你的問題的其他任何東西。

編輯:我假設這是一個Swing GUI。請確認是否如此。

編輯2:您遇到的一個問題是,你設置的一個JFrame沒有考慮到它的「裝飾」,包括菜單欄,調整大小尺寸/最大化/關閉圖標。同樣,您不應該直接設置大小,但是如果您必須覆蓋持有網格的JPanel的getPreferredSize()方法。

編輯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(); 
     } 
     }); 
    } 

} 
+0

@Andrew:你有沒有加載文件的保單負荷,可能太多的合理要求志願者爲您檢閱。你能把你的問題壓縮成一個小程序,一個足夠完整的程序,我們可以運行它並看到你的問題,但又足夠小,以便它直接發佈到這個網站上[sscce](http://sscce.org )(請閱讀鏈接)? –

+0

我在問題中添加了一個sscce。運行時,單擊GUI左上角的(機器相關)座標不是(0,0)。例如,對我來說是(3,24)。 –

+0

@AndrewLatham:請參閱編輯2 –