Как установить ширину и высоту JPanel?

#java #swing #fixed-width

#java #качать #фиксированная ширина

Вопрос:

Я разрабатываю игру Snake, используя Java. Ширина и высота доски (на которой выполняются все действия) должны быть фиксированными (640 пикселей * 480 пикселей).

Структура:

  • Основной класс, который является продолжением класса JFrame,
  • Класс Board, который является продолжением класса JPanel;

В основном классе у меня есть что-то вроде…

 setSize( 1024, 768 );
  

… и в классе Board у меня есть…

 setSize( BOARDS_WIDTH, BOARDS_HEIGHT );
  

Проблема в том, что основная и единственная windows выглядит как 1024 * 768, но панель внутри нее — не как 640 * 480. У меня также есть setBackground (), и фон заполнен более чем на 640 * 480.

Есть ли какой-либо способ сделать ширину и высоту панели такими, чтобы они были 640 * 480, но ширина и высота основных окон — такими, чтобы ширина и высота доски были правильными?

Прямо сейчас это выглядит так…

Ширина и высота равны ~ 1000 * ~ 750, а не 640 * 480.

Редактировать:

Все работает… почти.

Основной класс:

 add( new Board(), BorderLayout.CENTER );
pack();
setResizable( false );
setLocationRelativeTo( null );
setVisible( true );
setDefaultCloseOperation( EXIT_ON_CLOSE );
setTitle( "Snake (by daGrevis)" );
  

Класс Board:

 setPreferredSize( new Dimension( 640, 480 ) );
  

Серый фон равен 642 * 482! Как будто была бы граница, которая обтекает все на 1 пиксель!

Комментарии:

1. Обычно нет необходимости расширять компоненты, если не добавлять дополнительную функциональность (например, новые методы).

2. Буду держать это в уме. Я просто новичок в Java!

3. Для получения помощи, помимо той, что уже была предложена (кем-то, кого я считаю одним из «Гуру Swing»), я предлагаю вам опубликовать SSCCE .

Ответ №1:

пожалуйста, что-то пошло не так, и это совсем не так, проверьте это. xx * x

 JButton Size - java.awt.Dimension[width=400,height=40]
JPanel Size - java.awt.Dimension[width=640,height=480]
JFrame Size - java.awt.Dimension[width=646,height=505]
  

код (базовый материал из Trail: создание графического интерфейса с помощью JFC / Swing , и все же я все еще доволен тем, что это устарело)

РЕДАКТИРОВАТЬ: забыть setDefaultCloseOperation()

 import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class FrameSize {

    private JFrame frm = new JFrame();
    private JPanel pnl = new JPanel();
    private JButton btn = new JButton("Get ScreenSize for JComponents");

    public FrameSize() {
        btn.setPreferredSize(new Dimension(400, 40));
        btn.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("JButton Size - "   btn.getSize());
                System.out.println("JPanel Size - "   pnl.getSize());
                System.out.println("JFrame Size - "   frm.getSize());
            }
        });
        pnl.setPreferredSize(new Dimension(640, 480));
        pnl.add(btn, BorderLayout.SOUTH);
        frm.add(pnl, BorderLayout.CENTER);
        frm.setLocation(150, 100);
        frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // EDIT
        frm.setResizable(false);
        frm.pack();
        frm.setVisible(true);
    }

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

            @Override
            public void run() {
                FrameSize fS = new FrameSize();
            }
        });
    }
}
  

Комментарии:

1. «Большая проблема» заключалась в том, что мне нужно было вызвать setResizable( false ) false перед add()!

Ответ №2:

 Board.setPreferredSize(new Dimension(x, y));
.
.
//Main.add(Board, BorderLayout.CENTER);
Main.add(Board, BorderLayout.CENTER);
Main.setLocations(x, y);
Main.pack();
Main.setVisible(true);
  

Комментарии:

1. Да, 1, но я не использовал setLocations — возможно, s — это опечатка. Я также иногда вызываю setLocationRelativeTo(null) после вызова pack для центрирования графического интерфейса.

2. Спасибо, у меня сработало. Просто ‘Borderlayout’ должно быть ‘BorderLayout’.

3. @ Судно на воздушной подушке, полное угрей < 🙂 > хммм, просто .., ненавижу 🙂 setLocationRelativeTo(null) и setLocationByPlatform(true) </:-)>

4. -1 ответ должен способствовать правильному соглашению об именовании Java. Имена переменных не должны начинаться с символа в верхнем регистре.

5. @ camickr 1 за правильный совет, но это было сделано намеренно, я просто следую названиям классов @daGrevis