java-swing
JFrame窗體
窗體是一個元件容器,所有元件都必須有窗體去承載它們,所有jframe窗體類包含一個容器類,所有放置在窗體上的元件實際上都是放置在這容器類中,通過getContentPane()方法可以獲取它
JFrame jf=new JFrame();
Container c=jf.getContentPane();
通過add方法把元件新增到容器中
JButton jb=new JButton();
c.add(jb);//新增按鈕元件
JFrame用兩個常用的構造器:
public JFrame();//1
public JFrame(String name);//2
第二種是帶有標題的窗體,也可通過settitle
jf.setDefaultCloseOperation(jf.EXIT_ON_CLOSE);該方法是最常見的關閉窗體的方法。
常用的佈局管理器
1.絕對佈局管理器
JFrame jf=new JFrame();
Container c=jf.getContentPane();
JButton jb=new JButton("按鈕");
c.setLayout(null);//設定無佈局管理器
jb.setBounds(10, 30, 40, 50);//設定元件位置,大小
絕對佈局管理器,硬性規定了每個元件的位置大小,在不同的系統可能會出現元件重疊的現象。
2.流佈局管理器
流佈局管理器讓元件按指定方向排列,直到這一行放滿了元件,才移動到下一行放
for(int i=1;i<10;i++){
c.add(new JButton(String.valueOf(i)));
}
c.setLayout(new FlowLayout(FlowLayout.CENTER,10,10));//設定為流佈局管理器,元件居中對齊
在FlowLayout構造器中,alignment引數是元件的對齊方式,FlowLayout.LEFT(左對齊),FlowLayout.CENTER(居中對齊),FlowLayout.RIGHT(右對齊)。
3.邊界佈局管理器
Jframe窗體的元件容器使用BorderLayout作為預設佈局方式,BorderLayout將元件放置在頂部,底部,左邊,右邊和中間(BorderLayout.NORTH/SOUTH/EAST/WEST/CENTER)
4.網格佈局管理器
GridLayout將容器劃分為網格,所有元件可以按行和列進行排列,引數rows為行,columns為列,horizGap為網格之間的水平間距,vertGap為網格之間的垂直間距。
常用面板
JPanel,JScrollPane面板
面板也是一個容器,可以容納其他元件,但必須新增到其他容器中才能發揮作用,JScrollPane是帶有滾動條的面板,常用於佈置單個元件,並且可以不使用佈局管理器,如需要在JScrollPane中放置多個元件,需要將多個元件放置在JPanel面板上,再講JPanel作為一個元件放置在JScrollPane上。
標籤與圖示
標籤有JLabel類定義,標籤不能產生任何型別的事件,只是簡單的顯示文字和圖片
JLabel(String text,Icon icon,int aligment)//建立帶文字,圖示的JLabel物件,並且設定標籤內容的水平對齊方式
ImageIcon(Image image)直接從圖片源建立圖片
在Swing中放置圖示時,把圖示放在工程目錄下,再直接引用即可
JLabel jl=new JLabel("帶有圖示的標籤",JLabel.CENTER);
Icon icon=new ImageIcon("3.jpg");
jl.setIcon(icon);
按鈕
JButton button=new JButton (Icon icon);//帶有圖示的按鈕
JButton button=new JButton (String text);//帶文字的按鈕
JButton button=new JButton (String text,Icon icon);//帶有文字和圖示的按鈕
單選按鈕(JRadioButton)
JRadioButton button=new JRadioButton(Icon icon);//帶有圖示的按鈕
JRadioButton button=new JRadioButton(String text);//帶文字的按鈕
JRadioButton button=new JRadioButton(String text,Icon icon);//帶有文字和圖示的按鈕
JRadioButton button=new JRadioButton(String text,boolean selected)//帶有文字以及選中狀態的按鈕
單選按鈕的使用需要使用ButtonGroup類(按鈕組)將單選按鈕分組,通過add方法新增到按鈕組中,多個單選按鈕新增到按鈕組後,同一個時間只能有一個單選按鈕能被選中,如果沒有指定,可以同時選中多個單選按鈕
複選框按鈕(JCheckBox)
JCheckBox jc=new JCheckBox("足球");
JCheckBox jc2=new JCheckBox("籃球");
JCheckBox jc3=new JCheckBox("跑步");
複選框按鈕可以新增到ButtonGroup類(按鈕組)中,使用add方法,被新增到同一個按鈕組的複選框和單選按鈕,同一個時間只能有一個元件處於選中選中狀態
文字框(JTextField)
JTextField j=new JTextField();
JTextField j=new JTextField(columns);//構造一個具有指定列數的文字框
JTextField j=new JTextField(text);//構造一個指定字串內容的文字框
JTextField j=new JTextField(text, columns)//構造一個具有指定列數幷包含文字內容的文字框
密碼框(JPaasswordField)
密碼框的構造方法與文字框相同,密碼框是將使用者輸入的字串以某種字元顯示,如*,同時還可以通過setEchoChar方法,改變密碼框的回顯字元
文字域(JTextArea)
在JTextArea類中存在一個setLineWrap方法,該方法用於設定文字域是否可以自動換行,設定為true,文字會自動換行,也可以使用JScrollPane面板管理文字,當文字超過元件長度時,會出現滾動條
JScrollPane sp=new JScrollPane();//滾動面板
JTextArea jt=new JTextArea("哈哈是驕傲是的卡上開啟哈啥資料庫匯頂科"
+ "啥的卡號時間的話斯卡哈的卡號可適當看哈很深刻好看好"
+ "大好時機多看哈隨機獲得卡號"
+ "技愛仕達卡技術科技的哈卡時間段哈薩克和卡金黃色的看好看的哈燒開後打瞌睡回單卡好");
jt.setLineWrap(true);//設定可以換行
sp.setViewportView(jt);//設定滾動面板管理文字
下拉列表框(JComboBox)
JComboBox jc=new JComboBox();//建立具有預設資料模型的空的JComboBox
JComboBox jc=new JComboBox<>(aModel);//建立一個JComboBox,其列表專案取自指定的ComboBoxModel
JComboBox jc=new JComboBox<>(items);//建立包含指定陣列中元素的JComboBox
JComboBox jc=new JComboBox<>(items);//建立包含指定Vector向量物件中元素的JComboBox
一般將下拉列表框中的專案封裝為ComboBoxModel型別,ComboBoxModel為介面,可以自定義一個類實現該介面,然後在初始化ComboBoxModel物件時向上轉型為ComboBoxModel介面型別,但是必須實現下面兩個方法
public void setSelectedItem(Object anItem)//設定下拉列表框中的選項
public Object getSelectedItem()//返回下拉列表中選擇的項
還可以繼承AbstractListModel類,該類中也有兩種方法
getSize()//返回列表長度
getElement()//返回指定索引處的值
列表框(JList)
列表框的構造方法和使用方法與下拉列表框大同小異
進度條(JProgressBar)
JProgressBar jp=new JProgressBar();//建立一個進度條
JProgressBar jp=new JProgressBar(orient);//建立一個具有指定方向的進度條
JProgressBar jp=new JProgressBar(min, max);//建立一個具有指定最小值和最大值的進度條
JProgressBar jp=new JProgressBar(orient, min, max);//建立一個指定方向,最小值和最大值的進度條
setIndeterminate方法設定進度條的樣式,true表示不確定任務的執行進度,false則表示確定任務的執行進度
setStringPainted方法設定是否顯示提示資訊,true顯示,false不顯示,預設為顯示當前任務完成的百分比,可通過setString方法設定指定的提示資訊
採用指示確定進度的進度條,不能自動獲取任務的執行進度,則必須通過setValue方法反覆修改當前的執行進度。
swing事件派發程序
事件派發程序又叫EDT,因為swing是單執行緒的,所以swing專門提供了一個執行緒用於元件安全訪問,這個執行緒就是事件派發執行緒,
EDT實際上是一個佇列,先進先出,只有當先前的事件執行完成了,才會去執行後面一個,所以在EDT中不適合進行耗時的事件,會導致程序堵塞,應該把耗時的事件放在獨立的一個執行緒中,然後再通過invokeLater方法使事件派發執行緒上的可執行物件排隊。當可執行物件排在事件派發佇列的隊首時,就呼叫其run方法。其效果是允許事件派發執行緒呼叫另一個執行緒中的任意一個程式碼塊。
Swing程式只有一個用EDT,該執行緒負責GUI元件的繪製和更新,通過呼叫程式的事件處理器來響應使用者互動。所有事件處理都是在EDT上進行的,程式同UI元件和其基本資料模型的互動只允許在EDT上進行,所有執行在EDT上的任務應該儘快完成,以便UI能及時響應使用者輸入。