Как установить определенный размер окна (кадра) в java swing?
Мой код не работает:
JFrame frame = new JFrame("mull");
mull panel = new mull();
// add panel to the center of window
frame.getContentPane().add("Center", panel);
frame.setSize(500, 300); // << not working!!!
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack(); // give a suitable size to window automatically
frame.setVisible(true); // make window visible
Я получаю очень маленькое окно. Как это исправить?
Ответы
Ответ 1
Ну, вы используете как frame.setSize()
, так и frame.pack()
.
Вы должны использовать один из них за один раз.
Используя setSize()
, вы можете указать размер кадра, но если вы используете pack()
, он автоматически изменит размер кадров в соответствии с размером компонентов в нем. Он не будет учитывать размер, который вы упомянули ранее.
Попробуйте удалить frame.pack()
из своего кода или поместить его перед настройкой размера, а затем запустите его.
Ответ 2
Большинство менеджеров макетов лучше всего работают с компонентом preferredSize, и большинство графических интерфейсов лучше всего разрешать компонентам, которые они содержат, устанавливать свои собственные предпочтительные значения на основе их содержимого или свойств. Чтобы использовать эти менеджеры макетов в своих лучших интересах, вызовите pack()
на своих контейнерах верхнего уровня, таких как ваши JFrames, прежде чем сделать их видимыми, поскольку это скажет этим менеджерам делать свои действия - для компоновки их компонентов.
Часто, когда мне нужно было играть более прямую роль в настройке размера одного из моих компонентов, я переопределю getPreferredSize и верну его размер, размер которого больше, чем super.preferredSize(или, если не тогда возвращает супер значение).
Например, здесь небольшое приложение drag-a-rectangle, которое я создал для другого вопроса на этом сайте:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class MoveRect extends JPanel {
private static final int RECT_W = 90;
private static final int RECT_H = 70;
private static final int PREF_W = 600;
private static final int PREF_H = 300;
private static final Color DRAW_RECT_COLOR = Color.black;
private static final Color DRAG_RECT_COLOR = new Color(180, 200, 255);
private Rectangle rect = new Rectangle(25, 25, RECT_W, RECT_H);
private boolean dragging = false;
private int deltaX = 0;
private int deltaY = 0;
public MoveRect() {
MyMouseAdapter myMouseAdapter = new MyMouseAdapter();
addMouseListener(myMouseAdapter);
addMouseMotionListener(myMouseAdapter);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (rect != null) {
Color c = dragging ? DRAG_RECT_COLOR : DRAW_RECT_COLOR;
g.setColor(c);
Graphics2D g2 = (Graphics2D) g;
g2.draw(rect);
}
}
@Override
public Dimension getPreferredSize() {
return new Dimension(PREF_W, PREF_H);
}
private class MyMouseAdapter extends MouseAdapter {
@Override
public void mousePressed(MouseEvent e) {
Point mousePoint = e.getPoint();
if (rect.contains(mousePoint)) {
dragging = true;
deltaX = rect.x - mousePoint.x;
deltaY = rect.y - mousePoint.y;
}
}
@Override
public void mouseReleased(MouseEvent e) {
dragging = false;
repaint();
}
@Override
public void mouseDragged(MouseEvent e) {
Point p2 = e.getPoint();
if (dragging) {
int x = p2.x + deltaX;
int y = p2.y + deltaY;
rect = new Rectangle(x, y, RECT_W, RECT_H);
MoveRect.this.repaint();
}
}
}
private static void createAndShowGui() {
MoveRect mainPanel = new MoveRect();
JFrame frame = new JFrame("MoveRect");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
Обратите внимание, что мой основной класс - JPanel, и что я переопределяю JPanel getPreferredSize:
public class MoveRect extends JPanel {
//.... deleted constants
private static final int PREF_W = 600;
private static final int PREF_H = 300;
//.... deleted fields and constants
//... deleted methods and constructors
@Override
public Dimension getPreferredSize() {
return new Dimension(PREF_W, PREF_H);
}
Также обратите внимание, что когда я показываю свой графический интерфейс, я помещаю его в JFrame, вызываю pack();
в JFrame, устанавливаю его позицию, а затем вызываю setVisible(true);
на моем JFrame:
private static void createAndShowGui() {
MoveRect mainPanel = new MoveRect();
JFrame frame = new JFrame("MoveRect");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}