Вопрос

Я работаю над созданием шахматной игры в Java, и у меня сейчас немного неприятностей, получая GUI именно так, как я хочу, чтобы это с качанием. Я использую A. GridLayout Организовать сетку 8х8 ChessButtons (которые переопределяют JButton Так что я могу хранить дополнительную информацию внутри них, таких как координаты). Первоначально то ChessButtonS не будет появиться, если я не буду не раздражать их, но я решил эту проблему, поместив каждый ChessButton внутри отдельной JPanel и установка каждой кнопки setPreferredSize() на множество высоты и ширины.

Теперь, моя проблема заключается в том, что, кажется, есть небольшой запас или прокладки выше (и / или ниже?) Каждая кнопка. Я обязательно установил setHgap(0) и setVgap(0) для GridLayout, Итак, я уверен, что таинственная маржа исходит из кнопок, либо JPanelс. Но я не могу избавиться от них, и они, кажется, вызывают каждый ChessButton Чтобы немного сдвинуть немного вверх / вниз, когда мы мывеем их.

Я понимаю, что это описание проблемы может быть немного сложно визуализировать, поэтому я взял скриншот (используя JButtonскорее, чем ChessButtonS Так что пробелы немного легче распознать): http://img3.imageshack.us/img3/6656/jbuttonmargins.png.png.

Вот код, который я использовал для инициализации каждого ChessButton:

    chessBoard = new JPanel(new GridLayout(8, 8, 0, 0));
    chessBoard.setBorder(BorderFactory.createEmptyBorder());

    for (int i = 0; i <= 65; i++) {
            //Create a new ChessButton
            ChessButton button = new ChessButton("hi");
            button.setBorder(BorderFactory.createEmptyBorder());
            button.setPreferredSize(new Dimension(75, 75));
            button.setMargin(new Insets(0, 0, 0, 0));

            //Create a new JPanel that the ChessButton will go into
            JPanel buttonPanel = new JPanel();
            buttonPanel.setPreferredSize(new Dimension(75, 75));
            buttonPanel.setBorder(BorderFactory.createEmptyBorder());
            buttonPanel.add(button);

            //Add the buttonPanel to the grid
            chessBoard.add(buttonPanel);
    }

Итак, как я могу избавиться от этих вертикальных пробелов между кнопками? Я относительно новый, чтобы качаться, поэтому извините, если ответ чрезвычайно очевиден, но я признателен за любую помощь, которую кто-то может предложить! Заранее спасибо!

Это было полезно?

Решение

Первоначально Chessbuttons не появится, если я не буду радует их, но я решил эту проблему, поместив каждый ChessButton внутри отдельной JPANEL и устанавливая SetPreredsize каждую кнопку () на установленную высоту и ширину

Это не правильное решение. Нет причин использовать jpanel для удержания кнопок. На самом деле это, вероятно, причина проблемы. Кнопки должны появляться, когда вы добавляете их в GridLayout. Если они не появляются, вероятно, потому что вы добавили кнопки в графический интерфейс после того, как видимый графический интерфейс. Компоненты должны быть добавлены в графический интерфейс, прежде чем он сделан видимым.

Теперь, моя проблема заключается в том, что, кажется, небольшой маржа или прокладки выше (и / или ниже?) Каждая кнопка

Я не понимаю, почему также не горизонтальный разрыв. Когда вы создаете JPanel, по умолчанию он использует FlowLayout, которая также содержит горизонтальный / вертикальный зазор из 5 пикселей. Поэтому я понимаю, почему у вас может быть вертикальный разрыв из 10 пикселей. Я не понимаю, почему нет горизонтального разрыва.

Если вам нужно больше помочь опубликовать свой Соревнование демонстрируя проблему. И SSCCE должен использовать обычные JButtons. Получите основы, работающие со стандартными компонентами, прежде чем начать играть с пользовательскими компонентами. Таким образом, вы знаете, если проблема с вашим пользовательским кодом или нет.

Другие советы

Не добавляйте пустую границу; использовать setBorderPainted(false).

Приложение: Как отмечает @Camickr, макет панели может включать пробелы по умолчанию. Пример ниже использует no-gap GridLayout соответственно.

alt text

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

/** @see http://stackoverflow.com/questions/4331699 */
public class ButtonBorder extends JPanel {

    private static final int N = 8;
    private static final int SIZE = 75;

    public ButtonBorder() {
        super(new GridLayout(N, N));
        this.setPreferredSize(new Dimension(N * SIZE, N * SIZE));
        for (int i = 0; i < N * N; i++) {
            this.add(new ChessButton(i));
        }
    }

    private static class ChessButton extends JButton {

        public ChessButton(int i) {
            super(i / N + "," + i % N);
            this.setOpaque(true);
            this.setBorderPainted(false);
            if ((i / N + i % N) % 2 == 1) {
                this.setBackground(Color.gray);
            }
        }
    }

    private void display() {
        JFrame f = new JFrame("ButtonBorder");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(this);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new ButtonBorder().display();
            }
        });
    }
}

Попробуйте добавить Chessboard.SetPreferredsize (600, 600) для создания JPANEL для доски, который имеет только место для установки кнопок (8 кнопок каждый путь * 75 по размеру на кнопку).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top