Java 中的 pack() 方法
在 Java 的 Window 類中定義的 pack()
方法調整框架的大小,使框架的內容等於或大於它們的首選大小。
我們可以通過顯式定義幀大小來替換 pack()
方法。為此,我們使用 setSize()
或 setBounds()
方法。setBounds()
方法還設定框架位置。
但是這些方法不會讓框架佈局管理器負責框架大小,這與 pack()
方法不同。框架佈局管理器可以根據不同的平臺和其他影響元件大小的因素進行調整。因此,建議使用 pack()
方法。
語法:
public void pack()
pack()
方法將所有元件繫結在一起。要了解它是如何工作的,讓我們看一個工作示例。我們將建立一個按鈕,在單擊它時在文字欄位中返回一些文字。
import java.awt.event.*;
import javax.swing.*;
public class ButtonDemo {
public static void main(String[] args) {
JFrame jf = new JFrame("Button Example");
final JTextField tf = new JTextField();
// using setBounds() method for textfield
tf.setBounds(50, 50, 150, 20);
JButton b = new JButton("Click this button");
// using setBounds() method for Button
b.setBounds(50, 100, 95, 30);
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
tf.setText("Java is interesting.");
}
});
jf.add(b);
jf.add(tf);
jf.setSize(300, 300);
jf.setLayout(null);
jf.setVisible(true);
}
}
輸出:
請注意,我們在此示例中的任何地方都沒有使用 pack()
方法。相反,我們使用 setBounds()
方法。文字欄位的 setBounds()
方法的引數是 50, 50, 150, 20
,對於按鈕,它們是 50, 100, 95, 30
。
另外,請注意該按鈕無法顯示整個文字。我們將在以下部分中對此進行研究。我們知道佈局管理器會自動設定新增元件的大小和位置。
由於 pack()
方法是讓佈局管理器負責框架的方法,所以我們需要在沒有它的情況下使用 setBounds()
方法。
在 Java 中使用 SetBounds()
方法
要使用它來代替 pack()
方法,我們需要傳遞引數來指定主視窗內元件的位置和大小。
它需要四個引數。前兩個用於指定元件的 position(top-left)
,後兩個用於指定元件的 size(width-height)
。
語法:
setBounds(int x - coordinate, int y - coordinate, int width, int height)
檢視上面示例中的以下程式碼。
jf.setLayout(null);
當我們使用 setBounds()
方法時,我們將 layout manager
設定為 null。
在 Java 中使用 Pack()
方法
現在,再看一個使用 pack()
方法的示例。
import java.awt.*;
import javax.swing.*;
public class ButtonDemo extends JFrame {
public ButtonDemo() { // This is the name of the class
// This will appear in the title bar of output window
setTitle("Buttons using pack()");
setLayout(new FlowLayout());
setButton();
// This calls the pack method
pack();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setVisible(true);
}
void setButton() {
for (int i = 1; i < 9; i++) {
add(new JButton("Button" + i));
}
}
public static void main(String args[]) {
new ButtonDemo();
}
}
輸出:
在這個例子中,我們沒有使用 setBounds()
方法來設定元件的位置和大小。相反,我們呼叫 pack()
方法,它自己處理元件的大小和位置。
這裡,ButtonDemo
類擴充套件了 JFrame
類。JFrame
類是一個容器,它充當一個視窗,用於儲存 GUI 的各種元件,如按鈕、標籤和文字欄位。
此外,我們可以使用以下程式碼來代替 for
迴圈,但這會不必要地增加程式碼長度。
JButton b1 = new JButton("Button 1");
JButton b2 = new JButton("Button 2");
JButton b3 = new JButton("Button 3");
JButton b4 = new JButton("Button 4");
JButton b5 = new JButton("Button 5");
JButton b6 = new JButton("Button 6");
JButton b7 = new JButton("Button 7");
JButton b8 = new JButton("Button 8");
add(b1);
add(b2);
add(b3);
add(b4);
add(b5);
add(b6);
add(b7);
add(b8);
要了解有關使用 Java 製作框架的更多資訊,請參閱此文件。
如果我們刪除 pack()
方法,我們將獲得輸出,但按鈕僅在調整面板大小時可見。這是我們不使用 pack()
或 setBounds()
方法時的輸出。
我們可以調整它的大小以檢視按鈕。
但這不是一個好的表示,因此,我們必須使用 pack()
或 setBounds()
方法。pack()
方法易於使用且精確,只需一行程式碼即可達到目的。
setBounds()
方法需要 x
和 y
座標作為引數。這可能需要進行大量更改和重新調整,因為一次確定座標通常並不容易。
此外,pack()
方法會相應地調整按鈕的大小,但 setBounds()
方法不能單獨做到這一點。我們需要為按鈕內的不同文字長度傳遞不同的寬度和高度引數。
再次檢視第一個示例的輸出。
按鈕無法顯示完整的文字單擊此按鈕
,因為按鈕的大小小於此文字的要求。為了糾正這個問題,我們將不得不改變寬度引數的值。
但是如果我們使用 pack()
方法,它會根據裡面的文字自行調整按鈕的大小。
import java.awt.*;
import javax.swing.*;
public class ButtonDemo extends JFrame {
public ButtonDemo() {
setTitle("Using the pack() method");
setLayout(new FlowLayout());
setButton();
// Calling the pack() method
pack();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setVisible(true);
}
void setButton() {
for (int i = 1; i < 7; i++) {
add(new JButton("Click this Button" + i));
}
}
public static void main(String args[]) {
new ButtonDemo();
}
}
輸出:
請注意,整個文字都適合按鈕,而無需手動調整大小。這是使用 pack()
方法優於 setBounds()
方法的優勢。
要了解有關使用 Swing 製作 GUI 的更多資訊,請參閱此文件。
まとめ
pack()
方法讓佈局管理器負責,它在面板上正確調整元件的大小和位置。
我們可以使用 setBounds()
方法作為 pack()
方法的替代方法,但首選 pack()
方法,因為它可以輕鬆地自行調整以適應變化,不像 setBounds()
方法。pack()
方法是將所有元件繫結在一起所必需的。