實現原理很簡單,
1清空布局(使用絕對布局)
2添加監聽器(監聽窗口是否被拖動)
3在監聽器里面動態調整 組件的位置
效果如下:
拖動之后效果:
代碼實現:
import java.awt.EventQueue; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JButton; import javax.swing.JTextField; public class Test { private JFrame frame; private JTextField textField; public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { Test window = new Test(); window.frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } public Test() { initialize(); } private void initialize() { frame = new JFrame(); frame.setBounds(100, 100, 450, 300); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().setLayout(null);//清空布局 JLabel label = new JLabel("標簽"); label.setBounds(81, 63, 61, 16); frame.getContentPane().add(label); JButton button = new JButton("按鈕"); button.setBounds(252, 58, 117, 29); frame.getContentPane().add(button); textField = new JTextField(); textField.setText("文本框"); textField.setBounds(81, 110, 288, 26); frame.getContentPane().add(textField); textField.setColumns(10); frame.addComponentListener(new ComponentAdapter() {//拖動窗口監聽 public void componentResized(ComponentEvent e) { int whidth=frame.getWidth();//獲取窗口寬度 int height=frame.getHeight();//獲取窗口高度 你也可以設置高度居中 //將lable放在 窗口左邊的1/3處 label.setBounds(whidth/3, 63, 61, 16);//(起始點x,起始點y,寬地w,高h) 標簽設置寬高不明顯 //將lable放在 窗口左邊的1/2處 button.setBounds(whidth/2, 63, 61, 16);//(起始點x,起始點y,寬地w,高h) //寬度始終是窗口的1/2 textField.setBounds(81, 110, whidth/2, 26);//(起始點x,起始點y,寬地w,高h) } }); } }