Установите маржу для JPanel GridLayout в Swing - PullRequest
0 голосов
/ 18 июня 2020

enter image description here Я пытаюсь настроить поле для JPanel, которое у него внутри GridLayout, относится к JFrame, но я не нашел решения, используя другие ответ. Я не знаю, важна ли это проблема, но также он показывает только первую кнопку перед I go для каждой кнопки с помощью мыши. Изображение является примером, я хочу настроить JPanel для запуска из угла сетки изображения, потому что изображение имеет границу (не из кода, а из декоративной доски), синие квадраты - это кнопка внутри GridView, но я пытаюсь подогнать gridView к сетке рисования изображения, используя свойство set (используя пропорцию пикселя).

public class Gui extends JPanel implements View {
  private final JPanel gui = new JPanel(new BorderLayout(3, 3));
  private JButton[][] chessBoardSquares = new JButton[5][5];
  private JPanel chessBoard;
  private ImageIcon ArrayWithoutPlayer[] = new ImageIcon[7]; //{1,2,3,4,10,11,12}
  private ImageIcon ArrayWithPlayer[] = new ImageIcon[3]; //{1,2,3}

private JFrame frame; //This is the whole frame

public Gui() {
    createAndShowGUI();
}

private void createAndShowGUI() {
    //Create and set up the window.
    JFrame frame = new JFrame("TextDemo");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    //Display the window.
    frame.setSize(800, 800);
    frame.setLocationRelativeTo(null);
    frame.setResizable(false);
    //frame.setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS));
    //frame.pack();
    frame.getContentPane().add(new ImagePanel( setImageIconFromUrl("/home/amministratore/Documenti/Java/ing-sw-2020-palini-rigutti-vangi/image/SantoriniBoardR.png",800,800).getImage()));

    chessBoard = new JPanel(new GridLayout(0, 5));
    chessBoard.setBorder(BorderFactory.createEmptyBorder(2,2,2,2));
    //chessBoard.setLayout(new BoxLayout());
    //chessBoard.setPreferredSize(new Dimension(400, 100));
    chessBoard.setBackground(Color.blue);

    //chessBoard.setAlignmentX((float) (2.2/21)*frame.getWidth());
    //chessBoard.setAlignmentY((float) (2.2/21)*frame.getHeight());
    //chessBoard.setMaximumSize(new Dimension((16/21)*frame.getWidth(),(16/21)*frame.getHeight()));
    //chessBoard.setAlignmentX(JLabel.LEFT_ALIGNMENT);
    //chessBoard.setBorder(new LineBorder(Color.BLACK));

    Insets buttonMargin = new Insets(0,0,0,0);
    for (int ii = 0; ii < chessBoardSquares.length; ii++) {
        for (int jj = 0; jj < chessBoardSquares[ii].length; jj++) {
            JButton b = new JButton();
            b.setMargin(buttonMargin);

            b.setBorder(null);
            b.setBorderPainted(false);
            b.setContentAreaFilled(false);
            b.setOpaque(false);
            chessBoardSquares[ii][jj] = b;
            b.setText("AA");
            chessBoard.add(chessBoardSquares[ii][jj]);
        }
    }

    //chessBoard.setOpaque( false );
    chessBoard.setBackground(new Color(255,0,0,0));
    frame.dispose();
    frame.add(chessBoard);
    frame.setVisible(true);

    //chessBoardSquares[0][0].setIcon( ArrayWithoutPlayer[0]); //This is the method to set Icon inside the button
}
}

1 Ответ

0 голосов
/ 18 июня 2020

Я пытаюсь настроить отступ для jpanel, который он имеет внутри GridLayout

        //b.setMargin(buttonMargin);
        //b.setBorder(null);
        //b.setBorderPainted(false);

Я не думаю, что вам нужен весь этот код.

Вместо этого просто установите Border кнопки:

b.setBorder( new EmptyBorder(5, 5, 5, 5) );

Edit:

frame.getContentPane().add(new ImagePanel(...));
…
frame.add(chessBoard);

Прежде всего, frame.getContentPane().add(…) и frame.add(…) - это одно и то же. То есть компонент будет добавлен на панель содержимого. Второй формат - это просто ярлык для первого.

Итак, вы пытаетесь добавить два компонента в BorderLayout.CENTER. Это не сработает, поскольку BorderLayout будет поддерживать только один компонент в любом месте.

Swing был разработан с отношениями родитель / потомок, поэтому, похоже, вам нужно что-то вроде:

  • JFrame (панель содержимого)
    • ImagePanel
      • chessBoard

Итак, ваш лог c должен выглядеть примерно так:

ImagePanel background = new ImagePanel(…);
background.setLayout( new BorderLayout() );
background.add(chessPanel, BorderLayout.CENTER);
frame.add(background, BorderLayout.CENTER);

Теперь вы иметь отношения родитель / потомок между компонентами.

frame.setSize(800, 800); 

Не устанавливать размер рамки. (800, 800) неправильный размер. Если ваш ImagePanel имеет размер (800, 800), тогда фрейм должен быть больше, потому что фрейм также включает в себя строку заголовка и границу.

Таким образом, вместо вашего logi c должно быть:

frame.pack();
frame.setVisible(true);

Метод pack () позволит фрейму определять свой собственный предпочтительный размер ПОСЛЕ того, как в фрейм добавлены все компоненты.

Примечание:

В вашем классе ImagePanel вам также потребуется реализовать метод getPreferresSize() вашего изображения. Это позволит методу pack () работать правильно. Прочтите раздел из учебника Swing на Custom Painting для рабочего примера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...