Как разместить JPanel в верхнем правом углу JFrame - PullRequest
0 голосов
/ 11 мая 2019

Я написал настольную игру и дошел до того, что хочу добавить таймер в правый угол моего JFrame. Я думал, что это может быть лучше всего решить, поместив JPanel в верхний правый угол, который я обновлю со временем обратного отсчета. Однако я столкнулся с проблемой, которую я не могу понять, как разместить JPanel в заданном месте. Все, что я пытаюсь сделать, похоже, охватывает весь экран, а не размер и местоположение, к которому я его приложил.


    private final JFrame frame = new JFrame("myBoardGame");
    private JPanel jp = new JPanel();

    public ShowBoard(Board board){
        frame.setResizable(false);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setContentPane(board);
        frame.setLayout(new BorderLayout());
        frame.pack();
        frame.setVisible(true);
        jp.setLayout(null);
        jp.setLocation(300,300);
        jp.setSize(100,100)
        frame.add(jp);
        this.board = board;
        getKeyBindings(); }

Вместо того, чтобы перемещаться в положение 300x300 и устанавливать его в размере 100x100, экран становится серым. Что я делаю неправильно? Я просто хочу иметь возможность перемещать JPanel вокруг JFrame туда, где он подходит лучше всего.

1 Ответ

1 голос
/ 11 мая 2019

Вы можете использовать BorderLayout contentPane в качестве панели содержимого фрейма. Эта панель будет включать в себя:

  1. В положении BorderLayout.NORTH, JPanel (timerPane) с FlowLayout (с ориентацией ComponentOrientation.RIGHT_TO_LEFT). Вы можете использовать эту панель для размещения своего таймера Component.
  2. В своем BorderLayout.CENTER положении ваш board.

Ваш код (измененный с учетом этих соображений) будет выглядеть следующим образом:

private final JFrame frame = new JFrame("myBoardGame");
private JPanel contentPane = new JPanel(new BorderLayout());
private JPanel timerPane = new JPanel(new FlowLayout());

public ShowBoard(Board board){
    timerPane.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
    contentPane.add(timerPane, BorderLayout.NORTH);
    contentPane.add(board, BorderLayout.CENTER);

    frame.setResizable(false);
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    frame.setContentPane(contentPane);
    frame.pack();
    frame.setVisible(true);

    this.board = board;
    getKeyBindings(); 
}
...