Java Swing - JPanel и Gridlayout Margis / Badding
-
30-09-2019 - |
Вопрос
Я работаю над созданием шахматной игры в Java, и у меня сейчас немного неприятностей, получая GUI именно так, как я хочу, чтобы это с качанием. Я использую A. GridLayout
Организовать сетку 8х8 ChessButton
s (которые переопределяют JButton
Так что я могу хранить дополнительную информацию внутри них, таких как координаты). Первоначально то ChessButton
S не будет появиться, если я не буду не раздражать их, но я решил эту проблему, поместив каждый ChessButton
внутри отдельной JPanel
и установка каждой кнопки setPreferredSize()
на множество высоты и ширины.
Теперь, моя проблема заключается в том, что, кажется, есть небольшой запас или прокладки выше (и / или ниже?) Каждая кнопка. Я обязательно установил setHgap(0)
и setVgap(0)
для GridLayout
, Итак, я уверен, что таинственная маржа исходит из кнопок, либо JPanel
с. Но я не могу избавиться от них, и они, кажется, вызывают каждый ChessButton
Чтобы немного сдвинуть немного вверх / вниз, когда мы мывеем их.
Я понимаю, что это описание проблемы может быть немного сложно визуализировать, поэтому я взял скриншот (используя JButton
скорее, чем ChessButton
S Так что пробелы немного легче распознать): 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
соответственно.
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 по размеру на кнопку).