2012-05-13 6 views
2

Я делаю простую шахматную панель Java Swing GUI, где игрок может перетаскивать фигуры. Проблема состоит в том, что из-за границы вокруг кадра (с надписью вверху, кнопками максимизации/минимизации/закрытия и т. Д.) Координаты сдвигаются - (0, 0) - верхний левый угол кадр, то есть немного выше кнопки X, но GUI начинает строить себя прямо под заголовком, поэтому графический интерфейс не выравнивается с координатами, и все не работает так, как должно. Кроме того, когда я устанавливаю размер фрейма, например, 100 х 100, нижняя часть и часть правой части моего графического интерфейса прерываются, потому что рамка не компенсирует ее границу. Когда я запускаю его как апплет, у меня нет этой проблемы, но я не хочу этого делать. Как я могу либо избавиться от этой границы вокруг моего окна рамки, чтобы я мог просто иметь простой графический интерфейс или правильно настроить координаты?Java 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); 
    } 
} 

ответ

1

Это трудно понять, что не так с вашим кодом без кода, но я знаю, что если вы идете по легкому пути, используя различные менеджеры компоновки, и пусть эти менеджеры сделать выкладывание компонентов для вас и определение размеров вещей, в том числе вызов pack() на JFrame, обычно вещи легко и удобно складываются. Так что еще раз не устанавливайте размер ничего, но скорее позвольте предпочтительным размерам компонентов и менеджерам макетов сделать это за вас.

Если этот совет не поможет, пожалуйста, сообщите нам дополнительную информацию и код, предпочтительно sscce, небольшую компилируемую и управляемую программу, которая не делает ничего, кроме демонстрации вашей проблемы.

Редактировать: Я предполагаю, что это графический интерфейс Swing. Пожалуйста, проверьте это.

Редактировать 2: Одна проблема, с которой вы сталкиваетесь, заключается в том, что вы устанавливаете размер JFrame, не принимая во внимание его «украшения», включая панель меню, значок изменения размера/максимизации/закрытия. Опять же, вы не должны устанавливать размеры напрямую, но если вы должны лучше переопределить метод JPANel getPreferredSize(), который содержит вашу сетку.

Edit 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

@ Андрей: У вас есть крошка-загрузка файлов, загруженных там, вероятно, слишком много, чтобы разумно просить доброволец пересмотреть для вас. Можете ли вы сконденсировать свою проблему в одной небольшой программе, достаточно полной, чтобы мы могли ее запустить и увидеть вашу проблему, но достаточно маленькую, чтобы она была размещена непосредственно на этом сайте, [sscce] (http://sscce.org) (пожалуйста, прочитайте ссылку)? –

+0

Я добавил sscce в вопрос. При запуске щелчок в верхнем левом углу GUI дает (зависящую от машины) координату, которая не является (0, 0). Например, для меня это (3, 24). –

+0

@AndrewLatham: см. Править 2 –

Смежные вопросы