1. 程式人生 > 其它 >Java Swing在沒有佈局管理器的情況下進行操作(絕對定位)

Java Swing在沒有佈局管理器的情況下進行操作(絕對定位)

儘管沒有佈局管理器也是可以的,但您應該儘可能使用佈局管理器。佈局管理器使調整與外觀依賴的元件外觀,不同的字型大小,容器的不斷變化的大小以及不同的語言環境變得更加容易。佈局管理器也可以很容易地被其他容器和其他程式重用。


注意:本課程涵蓋手工編寫佈局程式碼,這可能會很困難。如果您不希望學習佈局管理的所有詳細資訊,則可能更喜歡將GroupLayout佈局管理器與構建器工具結合使用來佈局GUI。NetBeans IDE就是這樣一種構建器工具。否則,如果您想手工編寫程式碼並且不想使用GroupLayout,那麼GridBagLayout建議將其作為下一個最靈活,功能最強大的佈局管理器。

如果您對使用JavaFX建立GUI感興趣,請參閱使用JavaFX中的

佈局

如果容器中容納的元件的大小不受容器的大小或字型,外觀和語言的變化的影響,則絕對定位可能很有意義。包含內部框架的桌面窗格在此類別中。內部框架的大小和位置不直接取決於桌面窗格的大小。程式設計師確定桌面窗格中內部框架的初始大小和位置,然後使用者可以移動或調整框架的大小。在這種情況下,不需要佈局管理器。

絕對定位可能有意義的另一種情況是定製容器的情況,該容器執行特定於容器的尺寸和位置計算,並且可能需要了解容器的特殊狀態。分割窗格就是這種情況。

建立沒有佈局管理器的容器涉及以下步驟。

  1. 通過呼叫將容器的佈局管理器設定為nullsetLayout(null)
  2. 為容器的每個子代呼叫Component類的setbounds
    方法。
  3. 呼叫Component類的repaint方法。

但是,如果調整包含容器的視窗的大小,則使用絕對定位的容器建立容器會引起問題。

這是其內容窗格使用絕對定位的框架的快照。

AbsoluteLayoutDemo的快照

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();
			}
		});
	}
}