JButtons неверный размер - PullRequest
0 голосов
/ 12 марта 2020

Я хочу нарисовать плитку размером 13x13, используя JFrame. Вот код:

public static void drawBoard() {
    final int TILE_SIZE = 60;
    final int TILES = 13;
    JFrame jFrame = new JFrame("Board");
    jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    jFrame.setSize(TILE_SIZE * TILES + 17, TILE_SIZE * TILES);
    jFrame.setResizable(false);
    JButton button = null;
    ImageIcon icon = null;
    for (int y = 0; y < TILES; y++) {
        for (int x = 0; x < TILES; x++) {
            button = new JButton(alphabet[x] + "" + alphabet[y]);
            button.setName(alphabet[x] + "" + alphabet[y]);
            button.setBounds(TILE_SIZE * y, TILE_SIZE * x, TILE_SIZE, TILE_SIZE);
            button.addActionListener(new Clicked());
            button.setBackground(Color.WHITE);
            jFrame.getContentPane().add(button);
        }
    }
    jFrame.setVisible(true);
}//end drawBoard

Теперь, когда я запускаю код, он показывает мне сетку кнопок, но та, что в нижнем правом углу, имеет тот же размер рамки.

Ответы [ 2 ]

1 голос
/ 13 марта 2020

, но тот, что в правом нижнем углу, имеет такой же размер рамки.

Swing был разработан для использования с менеджерами компоновки. Диспетчер компоновки будет определять размер / расположение компонента на основе правил диспетчера компоновки.

В случае JFrame диспетчером компоновки по умолчанию является BorderLayout. При добавлении компонента в BorderLayout без использования «ограничения» компонент добавляется в CENTER. Однако только один компонент может быть добавлен к CENTER. Таким образом, только последний добавленный компонент задает размер / местоположение менеджера макета. В этом случае правило состоит в том, чтобы сделать кнопку размером пространства, доступного в кадре.

Если вы хотите иметь сетку, то вы должны использовать GridLayout. Затем менеджер макетов сделает каждую кнопку одинакового размера.

Прочтите раздел из учебника по Swing в Менеджеры макетов для получения дополнительной информации. Есть рабочие примеры для BorderLayout и GridLayout.

0 голосов
/ 13 марта 2020

Вы должны действительно изучить макет, который обрабатывает размер компонента, а не устанавливать его на самом компоненте (см .: MIG Layout), но это должно получить то, что вы хотите.

public static void drawBoard(){
    final int TILE_SIZE = 60;
    final int TILES = 13;
    JFrame jFrame = new JFrame("Board");
    jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    jFrame.setSize(TILE_SIZE * TILES + 17, TILE_SIZE * TILES);
    jFrame.getContentPane().setLayout(new GridLayout(TILES, TILES));
    jFrame.setResizable(false);
    JButton button = null;
    Dimension dim = new Dimension(TILE_SIZE, TILE_SIZE);
    for (int y = 0; y < TILES; y++) {
        for (int x = 0; x < TILES; x++) {
            button = new JButton(alphabet[x] + "" + alphabet[y]);
            button.setSize(dim);
            button.addActionListener(new Clicked());
            button.setBackground(Color.WHITE);
            jFrame.getContentPane().add(button);
        }
    }
    jFrame.setVisible(true);
}
...