第十四周總結java
1、知識總結ide
1.模型-視圖-控制器模式
模型:儲存內容
視圖:顯示內容
控制器:處理用戶輸入函數
2.佈局管理
2-1.流佈局管理器(FlowLayout)
JPanel對象的默認佈局管理器爲FlowLayout,組件加入JPanel中老是處於中央,一行能夠排列多個組件,若是一行的空間容納不下全部的組件則換行。當頂層窗口縮放時,JPanel中組件的大小不會隨之縮放。
2-2.邊框佈局管理器(BorderLayout)
是JFrame的內容窗格的默認佈局管理器,能夠選擇將空間放在內容窗格的東、南、西、北、中。 且將組件加入其中時,組件會充滿其對應的整個區域,若是在這個方位再加入一個組件,會覆蓋本來存在的組件。當頂層窗口縮放時,東南西北的組件不會隨之變化,中部的組件會等比例變化。
若是要在某方法並排加入幾個組件,則能夠先將組件加入JPanel中,再放入邊框佈局管理器。
BorderLayout的常量定義爲字符串工具
frame.add(new JButton("Yes"),BorderLayout.SOUTH);
2-3.網格佈局(Grid Layout)
佈局相似於表格,每一個單元大小一致,當頂層窗口縮放時組件大小也隨之變化,可是尺寸比例保持一致。佈局
frame.SetLayout(new GridLayout(4,4));//造成4x4的網格
frame.add(new JButton("1"));
GridLayout(int r,int c) 參數之一能夠爲0,可是不能同時爲0
GridLayout(int r,int c,int hgap,int vgap) hgap表示單元之間的水平間距,vgap表示單元之間的垂直間距學習
3.文本輸入
3-1.擴展於JTextComponent的JTextField和JTextArea
JTextField和JTextArea都用於文本輸入,其中JTextField接收單行文本的輸入,而JTextArea可接收多行文本的輸入。 測試
列數爲文本域的寬度,若是但願文本域最多能輸入N個字符,則將寬度設置爲Nspa
JTextField text = new JTextField("Input Here",20);設計
第二個構造函數能夠指定文本區顯示的行數和列數。若是須要設置滾動條,則須要將文本區加入JScrollPane中,再講JScrollPane插入容器。3d
JTextArea area = new TextArea(4,10);
JScrollPane pane = new JScrollPane(area);
panel.add(pane);
3-2.擴展於JTextField的JPasswordField
接受單行輸入,輸入字符被特殊字符掩蓋
3-3.JLabel
沒有任何修飾,不能響應用戶輸入,只是容納文本的組件。能夠設置標籤的顯示文字、圖標以及對其方式
其中對其方式是SwingConstants裏的常量,如LEFT/RIGHT/CENTER等
JLabel label = new JLabel("User Name:",SwingConstants.RIGHT);
4.選擇組件
4-1.JCheckBox
複選框自動帶有標籤和圖標,在構造時能夠提供,當用戶選中複選框時會觸發動做事件。
JCheckBox box = new JCheckBox("Bold");
box.setSelected(true);
4-2.單選鈕(JRadioButton)
自帶標籤和圖標。單選鈕只能多選其一,要打到這種效果須要把全部的單選鈕加入ButtonGroup的對象裏,從而使得新按鈕被按下時,取消前一個選中的按鈕的狀態。ButtonGroup直接擴展於Object類,因此單選鈕需加入容器中進行佈局,ButtonGroup和容器(如JPanel)是相互獨立的。
選中時觸發動做事件。
4-3.邊框(Border)
任何繼承自JComponent的組件均可以使用邊框(void setBorder(Border b))。經常使用的方法是將組件放入容器中,而後容器使用邊框。是經過調用BorderFactory的靜態方法構建邊框。
同時能夠爲邊框設置標題:
Border etch = BorderFactory.createEtchedBorder();
Border title = BorderFactory.createTitleBorder(etch,"Title");
panel.setBorder(title);
4-4.組合框
JComboBox< T>是泛型類,構建時需注意。
組合框不只有下拉選擇的功能,還具備文本框編輯的功能。
得到當前選中內容:
combo.getItemAt(combo.getSelectedIndex());
//Object getItemAt(int index)
當用戶從組合框中選中一個選項時,組合框就會產生一個動做事件。
4-5.滑動條(JSlider)
滑動條在構造時默認是橫向,若是須要縱向滑動條:
JSlider s = new JSlider(SwingConstants.VERTICAL,min,max,initialValue);
當滑動條滑動時,會觸發ChangeEvent,須要調用addChangeListener()而且安裝一個實現了ChangeListener接口的對象。這個接口只有一個StateChanged方法
//獲得滑動條的當前值
ChangeListener listen = event ->{
JSlider s = (JSlider)event.getSource();
int val = s.getValue();
...
};
若是須要顯示滑動條的刻度,則setPaintTicks(true);
若是要將滑動條強制對準刻度,則setSnapToTicks(true);
若是要爲滑動條設置標籤,則須要先構建一個Hashtable< Integer,Component>,將數字與標籤對應起來,再調用setLabelTable(Dictionary label);
5.複雜的佈局管理
5-1.GridBagLayout(網格組佈局)
即沒有限制的網格佈局,行和列的尺寸能夠改變,且單元格能夠合併
過程:
1)建議一個GridBagLayout對象,不須要指定行列數
2)將容器setLayout爲GBL對象
3)爲每一個組件創建GridBagConstraints對象,即約束組件的大小以及排放方式
4)經過add(component,constraints)增長組件
使用幫助類來管理約束會方便不少。
5-2.不使用佈局管理器
frame.setLayout(null);
JButton btn = new JButton("Yes");
frame.add(btn);
btn.setBounds(10,10,100,30);
//void setBounds(int x,int y,int width,int height)//x,y表示左上角的座標,width/height表示組件寬和高,Component類的方法
5-3.組件的遍歷順序(焦點的順序):從左至右從上到下
component.setFocusable(false);//組件不設置焦點
6.菜單
分爲JMenuBar/JMenu/JMenuItem,當選擇菜單項時會觸發一個動做事件,須要註冊監聽器監聽
7.對話框
對話框分爲模式對話框和無模對話框,模式對話框就是未處理此對話框以前不容許與其餘窗口交互。
7-1.JOptionPane
提供了四個用靜態方法(showxxxx)顯示的對話框:
構造對話框的步驟:
1)選擇對話框類型(消息、確認、選擇、輸入)
2)選擇消息類型(String/Icon/Component/Object[]/任何其餘對象)
3)選擇圖標(ERROR_MESSAGE/INFORMATION_MESSAGE/WARNING_MESSAGE/QUESTION_MESSAGE/PLAIN_MESSAGE)
4)對於確認對話框,選擇按鈕類型(DEFAULT_OPTION/YES_NO_OPTION/YES_NO_CANCEL_OPTION/OK_CANCEL_OPTION)
5)對於選項對話框,選擇選項(String/Icon/Component)
6)對於輸入對話框,選擇文本框或組合框
確認對話框和選擇對話框調用後會返回按鈕值或被選的選項的索引值
7-2.JDialog類
能夠本身建立對話框,需調用超類JDialog類的構造器
public aboutD extends JDialog
{
public aboutD(JFrame owner)
{
super(owner,"About Text",true);
....
}
}
構造JDialog類後須要setVisible才能時窗口可見
if(dialog == null)
dialog = new JDialog();
dialog.setVisible(true);
7-3.文件對話框(JFileChooser類)
7-4.顏色對話框(JColorChooser類)
2、實驗部分——Swing圖形界面組件
1、實驗目的與要求
(1) 掌握GUI佈局管理器用法;
(2) 掌握各種Java Swing組件用途及經常使用API;
2、實驗內容和步驟
實驗1: 導入第12章示例程序,測試程序並進行組內討論。
測試程序1
l 在elipse IDE中運行教材479頁程序12-1,結合運行結果理解程序;
l 掌握各類佈局管理器的用法;
l 理解GUI界面中事件處理技術的用途。
l 在佈局管理應用代碼處添加註釋;
測試程序2
l 在elipse IDE中調試運行教材486頁程序12-2,結合運行結果理解程序;
l 掌握各類文本組件的用法;
l 記錄示例代碼閱讀理解中存在的問題與疑惑。
測試程序3
l 在elipse IDE中調試運行教材489頁程序12-3,結合運行結果理解程序;
l 掌握複選框組件的用法;
l 記錄示例代碼閱讀理解中存在的問題與疑惑。
測試程序4
l 在elipse IDE中調試運行教材491頁程序12-4,運行結果理解程序;
l 掌握單選按鈕組件的用法;
l 記錄示例代碼閱讀理解中存在的問題與疑惑。
測試程序5
l 在elipse IDE中調試運行教材494頁程序12-5,結合運行結果理解程序;
l 掌握邊框的用法;
l 記錄示例代碼閱讀理解中存在的問題與疑惑。
測試程序6
l 在elipse IDE中調試運行教材498頁程序12-6,結合運行結果理解程序;
l 掌握組合框組件的用法;
l 記錄示例代碼閱讀理解中存在的問題與疑惑。
測試程序7
l 在elipse IDE中調試運行教材501頁程序12-7,結合運行結果理解程序;
l 掌握滑動條組件的用法;
l 記錄示例代碼閱讀理解中存在的問題與疑惑。
測試程序8
l 在elipse IDE中調試運行教材512頁程序12-8,結合運行結果理解程序;
l 掌握菜單的建立、菜單事件監聽器、複選框和單選按鈕菜單項、彈出菜單以及快捷鍵和加速器的用法。
l 記錄示例代碼閱讀理解中存在的問題與疑惑。
測試程序9
l 在elipse IDE中調試運行教材517頁程序12-9,結合運行結果理解程序;
l 掌握工具欄和工具提示的用法;
l 記錄示例代碼閱讀理解中存在的問題與疑惑。
測試程序10
l 在elipse IDE中調試運行教材524頁程序12-十、12-11,結合運行結果理解程序,瞭解GridbagLayout的用法。
l 在elipse IDE中調試運行教材533頁程序12-12,結合程序運行結果理解程序,瞭解GroupLayout的用法。
l 記錄示例代碼閱讀理解中存在的問題與疑惑。
測試程序11
l 在elipse IDE中調試運行教材539頁程序12-1三、12-14,結合運行結果理解程序;
l 掌握定製佈局管理器的用法。
l 記錄示例代碼閱讀理解中存在的問題與疑惑。
測試程序12
l 在elipse IDE中調試運行教材544頁程序12-1五、12-16,結合運行結果理解程序;
l 掌握選項對話框的用法。
l 記錄示例代碼閱讀理解中存在的問題與疑惑。
測試程序13
l 在elipse IDE中調試運行教材552頁程序12-1七、12-18,結合運行結果理解程序;
l 掌握對話框的建立方法;
l 記錄示例代碼閱讀理解中存在的問題與疑惑。
測試程序14
l 在elipse IDE中調試運行教材556頁程序12-1九、12-20,結合運行結果理解程序;
l 掌握對話框的數據交換用法;
l 記錄示例代碼閱讀理解中存在的問題與疑惑。
測試程序15
l 在elipse IDE中調試運行教材556頁程序12-2一、12-2212-23,結合程序運行結果理解程序;
l 掌握文件對話框的用法;
l 記錄示例代碼閱讀理解中存在的問題與疑惑。
測試程序16
l 在elipse IDE中調試運行教材570頁程序12-24,結合運行結果理解程序;
l 瞭解顏色選擇器的用法。
l 記錄示例代碼閱讀理解中存在的問題與疑惑。
實驗2:組內討論反思本組負責程序,理解程序整體結構,梳理程序GUI設計中應用的相關組件,整理相關組件的API,對程序中組件應用的相關代碼添加註釋。
負責程序:12-7
程序GUI設計中應用的相關組件:滑動條(JSlider)
【 滑動條在構造時默認是橫向,若是須要縱向滑動條:
JSlider s = new JSlider(SwingConstants.VERTICAL,min,max,initialValue);
當滑動條滑動時,會觸發ChangeEvent,須要調用addChangeListener()而且安裝一個實現了ChangeListener接口的對象。這個接口只有一個StateChanged方法
//獲得滑動條的當前值
ChangeListener listen = event ->{
JSlider s = (JSlider)event.getSource();
int val = s.getValue();
...
};
若是須要顯示滑動條的刻度,則setPaintTicks(true);
若是要將滑動條強制對準刻度,則setSnapToTicks(true);
若是要爲滑動條設置標籤,則須要先構建一個Hashtable< Integer,Component>,將數字與標籤對應起來,再調用setLabelTable(Dictionary label);】
package slider; import java.awt.*; import javax.swing.*; /** * @version 1.15 2015-06-12 * @author Cay Horstmann */ public class SliderTest { public static void main(String[] args) { EventQueue.invokeLater(() -> { SliderFrame frame = new SliderFrame();//生成類對象 frame.setTitle("SliderTest");//將此窗體的標題設置爲指定的字符串 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//設置用戶在此窗體上發起 "close" 時默認執行的操做 frame.setVisible(true);//根據參數 b 的值顯示或隱藏此 Window }); } }
package slider; import java.awt.*; import java.util.*; import javax.swing.*; import javax.swing.event.*; /** * A frame with many sliders and a text field to show slider values. */ public class SliderFrame extends JFrame//類的繼承 { private JPanel sliderPanel; private JTextField textField; private ChangeListener listener; public SliderFrame() { sliderPanel = new JPanel();//生成類對象 sliderPanel.setLayout(new GridBagLayout());//設置此容器的佈局管理器爲網格包佈局管理器。 // 爲全部 sliders註冊監聽器 listener = event -> { //當滑動slider的時候 更新文本域的值 JSlider source = (JSlider) event.getSource();//生成一個讓用戶以圖形方式在有界區間內經過移動滑塊來選擇值的組件類對象。 textField.setText("" + source.getValue());//將此 TextComponent 文本設置爲指定文本 }; JSlider slider = new JSlider();//建立一個水平滑塊。 addSlider(slider, "Plain"); slider = new JSlider(); slider.setPaintTicks(true);//在滑塊上繪製刻度標記 slider.setMajorTickSpacing(20);//設置主刻度標記的間隔 slider.setMinorTickSpacing(5); addSlider(slider, "Ticks"); slider = new JSlider(); slider.setPaintTicks(true); slider.setSnapToTicks(true); slider.setMajorTickSpacing(20); slider.setMinorTickSpacing(5); addSlider(slider, "Snap to ticks"); // 添加沒有軌跡的平滑快 slider = new JSlider(); slider.setPaintTicks(true); slider.setMajorTickSpacing(20); slider.setMinorTickSpacing(5); slider.setPaintTrack(false); addSlider(slider, "No track"); //添加倒置的平滑快 slider = new JSlider(); slider.setPaintTicks(true); slider.setMajorTickSpacing(20); slider.setMinorTickSpacing(5); slider.setInverted(true); addSlider(slider, "Inverted"); // 添加一個數字標籤的平滑快 slider = new JSlider(); slider.setPaintTicks(true); slider.setPaintLabels(true);//在滑塊上繪製標籤。 slider.setMajorTickSpacing(20); slider.setMinorTickSpacing(5); addSlider(slider, "Labels"); // 添加一個字母標籤的平滑快 slider = new JSlider(); slider.setPaintLabels(true); slider.setPaintTicks(true);//在滑塊上繪製刻度標記 slider.setMajorTickSpacing(20); slider.setMinorTickSpacing(5); Dictionary<Integer, Component> labelTable = new Hashtable<>(); labelTable.put(0, new JLabel("A"));//建立 JLabel 實例。 labelTable.put(20, new JLabel("B")); labelTable.put(40, new JLabel("C")); labelTable.put(60, new JLabel("D")); labelTable.put(80, new JLabel("E")); labelTable.put(100, new JLabel("F")); slider.setLabelTable(labelTable);//在給定值處繪製標籤 addSlider(slider, "Custom labels"); slider = new JSlider(); slider.setPaintTicks(true); slider.setPaintLabels(true); slider.setSnapToTicks(true); slider.setMajorTickSpacing(20); slider.setMinorTickSpacing(20); labelTable = new Hashtable<Integer, Component>();//構造一個新的空哈希表。 // 添加圖像 labelTable.put(0, new JLabel(new ImageIcon("nine.gif"))); labelTable.put(20, new JLabel(new ImageIcon("ten.gif"))); labelTable.put(40, new JLabel(new ImageIcon("jack.gif"))); labelTable.put(60, new JLabel(new ImageIcon("queen.gif"))); labelTable.put(80, new JLabel(new ImageIcon("king.gif"))); labelTable.put(100, new JLabel(new ImageIcon("ace.gif"))); slider.setLabelTable(labelTable);//用於指定將在給定值處繪製標籤 addSlider(slider, "Icon labels"); // 添加文本域 textField = new JTextField(); add(sliderPanel, BorderLayout.CENTER); add(textField, BorderLayout.SOUTH); pack();//調整此窗口的大小,以適合其子組件的首選大小和佈局。 } /** * Adds a slider to the slider panel and hooks up the listener * @param s the slider * @param description the slider description */ public void addSlider(JSlider s, String description)//一個讓用戶以圖形方式在有界區間內經過移動滑塊來選擇值的組件。 { s.addChangeListener(listener); JPanel panel = new JPanel(); panel.add(s); panel.add(new JLabel(description)); panel.setAlignmentX(Component.LEFT_ALIGNMENT);//設置垂直對齊方式。 GridBagConstraints gbc = new GridBagConstraints();//設置組件間的約束關係 gbc.gridy = sliderPanel.getComponentCount(); gbc.anchor = GridBagConstraints.WEST; sliderPanel.add(panel, gbc); } }
實驗3:組間協同窗習:在本班課程QQ羣內,各位同窗對實驗1中存在的問題進行提問,提問時註明實驗1中的測試程序編號,負責對應程序的小組需及時對羣內提問進行回答。
3、實驗總結
這周有不少的測試實驗,在測試後,結合書上的知識,學習了程序GUI設計中應用的相關組件以及各種Java Swing組件用途及經常使用API;在學習過程當中我發現對於以前學過的知識掌握還不夠好,在學習新知識的同時忘記了複習以前的知識,之後也要多注意知識的回顧。