我正在制作一个简单的Java Swing GUI棋盘,玩家可以拖放棋子。问题是,由于框架周围的边框(标题在顶部,最大化/最小化/关闭按钮等),坐标偏斜 - (0,0)是左上角的框架,也就是说,稍微高于X按钮,但是GUI会在标题栏的正下方开始构建,因此GUI不会与坐标对齐,并且事情不会以应有的方式结束。此外,当我将帧的大小设置为例如100 x 100时,我的GUI的下半部分和一些右手部分被切断,因为帧不会补偿其边框。当我将它作为applet运行时,我没有这个问题,但我不想这样做。我怎样才能摆脱框架窗口周围的边框,这样我就可以拥有简单的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);
}
}
答案 0 :(得分: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();
}
});
}
}