Hầu hết các trình quản lý bố cục hoạt động tốt nhất với tùy chọn ưu tiên của thành phần và hầu hết các GUI đều cho phép các thành phần có chứa tùy chọn của riêng chúngSize dựa trên nội dung hoặc thuộc tính của chúng. Để sử dụng các trình quản lý bố cục này để có lợi thế tốt nhất, hãy gọi pack()
trên các vùng chứa cấp cao nhất như JFrames của bạn trước khi hiển thị chúng vì điều này sẽ cho những người quản lý này thực hiện hành động của họ - để bố cục các thành phần của họ.
Thông thường khi tôi cần đóng vai trò trực tiếp hơn trong việc thiết lập kích thước của một trong các thành phần của tôi, tôi sẽ ghi đè getPreferredSize và đặt nó trở lại Thứ nguyên lớn hơn super.preferredSize (hoặc nếu không thì nó trả về giá trị của siêu).
Ví dụ, đây là một ứng dụng kéo một hình chữ nhật nhỏ mà tôi đã tạo cho another question on this site:
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();
}
});
}
}
Lưu ý rằng lớp học chính của tôi là một JPanel, và rằng tôi ghi đè lên JPanel của 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);
}
Cũng lưu ý rằng khi tôi hiển thị GUI, tôi đặt nó vào JFrame, gọi pack();
trên JFrame, đặt vị trí của nó và sau đó gọi setVisible(true);
trên JFrame của tôi:
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();
}
});
}
}
* "Cách đặt kích thước cửa sổ (khung) cụ thể trong xoay java?" * Thông thường bạn muốn đặt kích thước ưa thích của ngăn nội dung của khung hoặc có thể là thành phần trong ngăn nội dung . Để đoán xem làm thế nào lớn để làm cho khung chính nó là, và từ đó làm thế nào để sắp xếp hoặc làm cho nội dung, là đầy khó khăn. –