Java Swing在沒有佈局管理器的情況下進行操作(絕對定位)
阿新 • • 發佈:2021-02-04
儘管沒有佈局管理器也是可以的,但您應該儘可能使用佈局管理器。佈局管理器使調整與外觀依賴的元件外觀,不同的字型大小,容器的不斷變化的大小以及不同的語言環境變得更加容易。佈局管理器也可以很容易地被其他容器和其他程式重用。
注意:本課程涵蓋手工編寫佈局程式碼,這可能會很困難。如果您不希望學習佈局管理的所有詳細資訊,則可能更喜歡將
GroupLayout
佈局管理器與構建器工具結合使用來佈局GUI。NetBeans IDE就是這樣一種構建器工具。否則,如果您想手工編寫程式碼並且不想使用GroupLayout
,那麼GridBagLayout
建議將其作為下一個最靈活,功能最強大的佈局管理器。
如果您對使用JavaFX建立GUI感興趣,請參閱使用JavaFX中的 佈局。
如果容器中容納的元件的大小不受容器的大小或字型,外觀和語言的變化的影響,則絕對定位可能很有意義。包含內部框架的桌面窗格在此類別中。內部框架的大小和位置不直接取決於桌面窗格的大小。程式設計師確定桌面窗格中內部框架的初始大小和位置,然後使用者可以移動或調整框架的大小。在這種情況下,不需要佈局管理器。
絕對定位可能有意義的另一種情況是定製容器的情況,該容器執行特定於容器的尺寸和位置計算,並且可能需要了解容器的特殊狀態。分割窗格就是這種情況。
建立沒有佈局管理器的容器涉及以下步驟。
- 通過呼叫將容器的佈局管理器設定為null
setLayout(null)
。 - 為容器的每個子代呼叫
Component
類的setbounds
- 呼叫
Component
類的repaint
方法。
但是,如果調整包含容器的視窗的大小,則使用絕對定位的容器建立容器會引起問題。
這是其內容窗格使用絕對定位的框架的快照。
import java.awt.Container; import java.awt.Insets; import java.awt.Dimension; import javax.swing.JButton; import javax.swing.JFrame; public class AbsoluteLayoutDemo { public static void addComponentsToPane(Container pane) { pane.setLayout(null); JButton b1 = new JButton("one"); JButton b2 = new JButton("two"); JButton b3 = new JButton("three"); pane.add(b1); pane.add(b2); pane.add(b3); Insets insets = pane.getInsets(); Dimension size = b1.getPreferredSize(); b1.setBounds(25 + insets.left, 5 + insets.top, size.width, size.height); size = b2.getPreferredSize(); b2.setBounds(55 + insets.left, 40 + insets.top, size.width, size.height); size = b3.getPreferredSize(); b3.setBounds(150 + insets.left, 15 + insets.top, size.width + 50, size.height + 20); } /** * Create the GUI and show it. For thread safety, this method should be invoked * from the event-dispatching thread. */ private static void createAndShowGUI() { // Create and set up the window. JFrame frame = new JFrame("AbsoluteLayoutDemo"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Set up the content pane. addComponentsToPane(frame.getContentPane()); // Size and display the window. Insets insets = frame.getInsets(); frame.setSize(300 + insets.left + insets.right, 125 + insets.top + insets.bottom); frame.setVisible(true); } public static void main(String[] args) { // Schedule a job for the event-dispatching thread: // creating and showing this application's GUI. javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); } }