Как я могу правильно центрировать JPanel (FIXED SIZE) внутри JFrame?
Привет всем!
Я пытаюсь решить непростую задачу, но я не могу ее исправить.
Я работаю над примером приложения с библиотеками Java/Swing;
У меня есть JFrame и JPanel.
Я просто хочу достичь следующих целей:
-
JPanel ДОЛЖЕН быть центрирован внутри JFrame.
-
JPanel ДОЛЖЕН иметь ВСЕГДА размер, указанный с помощью
setPreferredSize(). Он НЕ ДОЛЖЕН быть изменен под этим размером.
Я попытался использовать GridBagLayout: это ТОЛЬКО способ, которым я могу это сделать.
См. пример ниже:
/* file StackSample01.java */
import java.awt.*;
import javax.swing.*;
public class StackSample01 {
public static void main(String [] args) {
JFrame frame = new JFrame();
JPanel panel = new JPanel();
panel.setPreferredSize(new Dimension(100, 100));
panel.setBackground(Color.RED);
frame.setLayout(new GridBagLayout());
frame.add(panel, new GridBagConstraints());
frame.setSize(new Dimension(200, 200));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
Здесь скриншот:
Я бы не использовал GridBagLayout, чтобы сделать что-то слишком простое.
Я попробовал самое простое решение, используя Box, но это не работает:
Пример кода:
/* file StackSample02.java */
import java.awt.*;
import javax.swing.*;
public class StackSample02 {
public static void main(String [] args) {
JFrame frame = new JFrame();
JPanel panel = new JPanel();
panel.setPreferredSize(new Dimension(100, 100));
panel.setBackground(Color.RED); // for debug
panel.setAlignmentX(JComponent.CENTER_ALIGNMENT); // have no effect
Box box = new Box(BoxLayout.Y_AXIS);
box.add(Box.createVerticalGlue());
box.add(panel);
box.add(Box.createVerticalGlue()); // causes a deformation
frame.add(box);
frame.setSize(new Dimension(200, 200));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
Здесь скриншот,
Любые идеи? Спасибо всем: -)
Ответы
Ответ 1
BoxLayout может довольно держать ваш setXxxSize(), а затем просто добавить panel.setMaximumSize(new Dimension(100, 100));
и ваш результат будет
Удалено setMinimumSize (обратите внимание, если контейнер имеет больший размер как...)
![enter image description here]()
![enter image description here]()
![enter image description here]()
import java.awt.*;
import javax.swing.*;
public class CustomComponent12 extends JFrame {
private static final long serialVersionUID = 1L;
public CustomComponent12() {
Box box = new Box(BoxLayout.Y_AXIS);
box.setAlignmentX(JComponent.CENTER_ALIGNMENT);
box.add(Box.createVerticalGlue());
box.add(new CustomComponents12());
box.add(Box.createVerticalGlue());
add(box);
pack();
setTitle("Custom Component Test / BoxLayout");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setMaximumSize(getMinimumSize());
setMinimumSize(getMinimumSize());
setPreferredSize(getPreferredSize());
setLocation(150, 150);
setVisible(true);
}
public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
CustomComponent12 main = new CustomComponent12();
}
};
javax.swing.SwingUtilities.invokeLater(r);
}
}
class CustomComponents12 extends JPanel {
private static final long serialVersionUID = 1L;
@Override
public Dimension getMinimumSize() {
return new Dimension(100, 100);
}
@Override
public Dimension getMaximumSize() {
return new Dimension(100, 100);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(100, 100);
}
@Override
public void paintComponent(Graphics g) {
int margin = 10;
Dimension dim = getSize();
super.paintComponent(g);
g.setColor(Color.red);
g.fillRect(margin, margin, dim.width - margin * 2, dim.height - margin * 2);
}
}
Ответ 2
Прежде всего, спасибо всем.
Я отвечаю в другой раз на свой вопрос, чтобы показать всем, что я сделал.
См. Пример кода ниже;
Как вы можете видеть, я включил только минимальные шаги, которые абсолютно необходимы для достижения цели.
/* file StackResponse.java */
import java.awt.*;
import javax.swing.*;
public class StackResponse {
public static void main(String [] args) {
JPanel panel = new JPanel();
Dimension expectedDimension = new Dimension(100, 100);
panel.setPreferredSize(expectedDimension);
panel.setMaximumSize(expectedDimension);
panel.setMinimumSize(expectedDimension);
panel.setBackground(Color.RED); // for debug only
Box box = new Box(BoxLayout.Y_AXIS);
box.add(Box.createVerticalGlue());
box.add(panel);
box.add(Box.createVerticalGlue());
JFrame frame = new JFrame();
frame.add(box);
frame.setSize(new Dimension(200, 200));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setMinimumSize(frame.getMinimumSize()); // cannot be resized-
frame.setVisible(true);
}
}
Здесь вы можете увидеть скриншот.
Проблема решена.
Еще раз спасибо всем.
IT
Ответ 3
создать панель по имени "FixedPanel" с помощью GridBagLayout и установить предпочтительный размер в размере кадра
затем добавьте свой фрейм в FixedPanel.
Frame = new JFrame("CenterFrame");
Frame.setLocation(0, 0);
Frame.setSize(new Dimension(400,400));//dim
JPanel FixedPanel = new JPanel(new GridBagLayout());
FixedPanel.setPreferredSize(Frame.getSize());
JPanel myPanel = new JPanel();
myPanel.setPreferredSize(new Dimension(100,100));
myPanel.setBackground(Color.BLACK);
FixedPanel.add(myPanel);
Frame.add(FixedPanel);
Frame.setVisible(true);
Ответ 4
Вы можете это сделать. Я должен был сыграть в шахматы, и я хотел, чтобы кусочек шахматной фигуры всегда находился в центре ячейки, которая была JlayeredPane:
private void formMouseReleased(java.awt.event.MouseEvent evt) {
// TODO add your handling code here:
if (jl != null)
{
jl.setLocation(evt.getX()+10, evt.getY()+10);
Component com = findComponentAt(evt.getPoint());
if (com instanceof JPanel)
{
// System.out.println("Yes, it a jpanel");
((JPanel)com).add(jl);
((JPanel)com).validate();
}
}
}
Ответ 5
Только что
jPanel.setBounds(x, y, 1046, 503);
Где x - пространство для правой стороны, а y - пространство для левой стороны.
вам нужно вычислить пространство с обеих сторон в соответствии с высотой и шириной экрана
Ответ 6
использовать
panel.setMaximumSize(new Dimension(200,200));
panel.setResizable(false)
вместо