2012-05-13 36 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 –