#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, но ширина и высота основных окон — такими, чтобы ширина и высота доски были правильными?
Прямо сейчас это выглядит так…
Редактировать:
Все работает… почти.
Основной класс:
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