Как я могу центрировать кнопки и верхний центр заголовка? - PullRequest
0 голосов
/ 12 января 2020

Я пытаюсь центрировать эти две кнопки Пуск и Назад , но каждый раз, когда я пытаюсь что-либо, например BoxLayout, .SetLocation, SwingConstant.CENTER, .setVerticalAlignment, .setHorizonatalAlignment это не работает. Может ли кто-нибудь помочь мне с тем, как установить две кнопки в центре по центру и заголовок «Змея» в верхней части кадра? Спасибо.

package snake;

public class Start {
    public static void main(String[] args) {
        startScreen startFrame = new startScreen();
    }
}

  class startScreen extends JFrame {
      // constructor
      public startScreen() {
          // fonts
          Font snakeTitleFont = new Font("Arial", Font.BOLD, 50);
          Font buttonFont = new Font("Arial", Font.CENTER_BASELINE, 20);

          // text
          JLabel snakeTitle = new JLabel("Snake", SwingConstants.CENTER);
          snakeTitle.setFont(snakeTitleFont);
          add(snakeTitle);

          // start button
          JButton startButton = new JButton("Start");
          startButton.setBackground(Color.MAGENTA);
          startButton.setOpaque(true);
          startButton.setBorderPainted(false);
          startButton.setFont(buttonFont);

          this.setLayout(new BoxLayout(this.getContentPane(), BoxLayout.LINE_AXIS));

          add(startButton);

          // action listener for start btn
          startButton.addActionListener(new ActionListener() {
              // once this is clicked on, it should call the GUI
              @Override
              public void actionPerformed(ActionEvent e) {
                  new Frame();
                  dispose(); // closes the old form after start is clicked
              }
          });

          // back button
          JButton backButton = new JButton("Back");
          backButton.setLayout(null);
          backButton.setBackground(Color.YELLOW);
          backButton.setOpaque(true);
          backButton.setBorderPainted(false);
          backButton.setFont(buttonFont);
          backButton.setBounds(getBounds());
          this.setLayout(new BoxLayout(this.getContentPane(), BoxLayout.LINE_AXIS));

          add(backButton);

          // action listener for start btn
          startButton.addActionListener(new ActionListener() {
              // once this is clicked on, it should call the GUI
              @Override
              public void actionPerformed(ActionEvent e) {
                  new Frame();
                  dispose(); // closes the old form after start is clicked
              }
          });

          this.setVisible(true);
          this.setSize(800, 500);
          this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          this.setResizable(false);
          this.setLocationRelativeTo(null);
      }
  }

Ответы [ 3 ]

1 голос
/ 13 января 2020

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

Вместо этого используйте несколько / составных макетов, например ...

Example

Это просто использует BorderLayout для управления панелью заголовка и кнопок и GridBagLayout для управления самими кнопками (как по умолчанию это центрирует кнопки по вертикали и по горизонтали)

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new BorderLayout());

            JLabel title = new JLabel("Snake");
            title.setHorizontalAlignment(JLabel.CENTER);
            add(title, BorderLayout.NORTH);

            JPanel buttonsPane = new JPanel(new GridBagLayout());
            buttonsPane.setBorder(new EmptyBorder(50, 50, 50, 50));

            buttonsPane.add(makeButton("Start"));
            buttonsPane.add(makeButton("Back"));

            add(buttonsPane);
        }

        protected JButton makeButton(String text) {
            JButton btn = new JButton(text);
            return btn;
        }


    }

}
1 голос
/ 13 января 2020

Быстрый взгляд здесь . Для вашего приложения лучше всего подойдет BoxLayout или FlowLayout .

Оба они являются очень и очень мощными инструментами для своей области применения.

Кроме того, попробуйте взглянуть на учебники по макетированию для Java. Вы всегда должны использовать метод « getContentPane () » для фреймов и применять компоновку и добавление компонентов в «ContentPane»!

0 голосов
/ 13 января 2020

Вы можете использовать BorderLayout следующим образом:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;

public class Start {
    public static void main(String[] args) {
        StartScreen startFrame = new StartScreen();
    }
}

class StartScreen extends JFrame {
    // Constructor
    public StartScreen() {
        // Fonts
        Font snakeTitleFont = new Font("Arial", Font.BOLD, 50);
        Font buttonFont = new Font("Arial", Font.CENTER_BASELINE, 20);

        // Text
        JLabel snakeTitle = new JLabel("Snake", SwingConstants.CENTER);
        snakeTitle.setFont(snakeTitleFont);
        add(snakeTitle, BorderLayout.NORTH);

        // Start button
        JButton startButton = new JButton("Start");
        startButton.setBackground(Color.MAGENTA);
        startButton.setOpaque(true);
        startButton.setBorderPainted(false);
        startButton.setFont(buttonFont);

        // ActionListener for Start button
        startButton.addActionListener(new ActionListener() {
            // once this is clicked on, it should call the GUI
            @Override
            public void actionPerformed(ActionEvent e) {
                new Frame();
                // closes the old form after start is clicked
                dispose();
            }
        });

        // Back button
        JButton backButton = new JButton("Back");
        backButton.setLayout(null);
        backButton.setBackground(Color.YELLOW);
        backButton.setOpaque(true);
        backButton.setBorderPainted(false);
        backButton.setFont(buttonFont);

        // Panel for Start and Back buttons
        JPanel panel = new JPanel();
        panel.add(startButton);
        panel.add(backButton);
        add(panel, BorderLayout.CENTER);

        this.setVisible(true);
        this.setSize(800, 500);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setResizable(false);
        this.setLocationRelativeTo(null);
    }
}
...