瘋狂JAVA講義—第十二章:Swing編程(六)微調控制器和列表框

來源:互聯網
上載者:User

今天主要講下JSpinner和JList。JSpinner用的不多,一般都用捲軸來代替,但當值要精確時,用捲軸會經常滾不到自己要的值,這也是很尷尬的,這時JSpinner就派上用場了。

其實JSpinner沒什麼花樣,主要構造時要傳個SpinnerModel,這個類有3個子類

SpinnerNumberModel用於設定數值型的JSpinner

SpinnerDateModel用於實現時間控制項的微調

SpinnerListModel用於傳入List或數組之間的微調,eg

public class TestJSpinner<br />{<br />final int SPINNER_NUM = 6;<br />JFrame mainWin = new JFrame("微調控制器示範");<br />Box spinnerBox = new Box(BoxLayout.Y_AXIS);<br />JSpinner[] spinners = new JSpinner[SPINNER_NUM];<br />JLabel[] valLabels = new JLabel[SPINNER_NUM];<br />JButton okBn = new JButton("確定");<br />public void init()<br />{<br />for (int i = 0 ; i < SPINNER_NUM ; i++ )<br />{<br />valLabels[i] = new JLabel();<br />}<br />//-----------普通Spinner-----------<br />spinners[0] = new JSpinner();<br />addSpinner(spinners[0], "普通" , valLabels[0]);</p><p>//-----------指定最小值、最大值、步長的Spinner-----------<br />//建立一個SpinnerNumberModel對象,指定最小值、最大值和步長<br />SpinnerNumberModel numModel = new SpinnerNumberModel(3.4,<br />-1.1, 4.3, 0.1);<br />spinners[1] = new JSpinner(numModel);<br />addSpinner(spinners[1], "數 值 範 圍" , valLabels[1]);</p><p>//-----------使用SpinnerListModel的Spinner------------<br />String[] books = new String[]<br />{<br />"輕量級J2EE公司專屬應用程式實戰",<br />"Struts2權威指南",<br />"基於J2EE的Ajax寶典"<br />};<br />//使用字串數組建立SpinnerListModel對象<br />SpinnerListModel bookModel = new SpinnerListModel(books);<br />//使用SpinnerListModel對象建立JSpinner對象<br />spinners[2] = new JSpinner(bookModel);<br />addSpinner(spinners[2], "字串序列值" , valLabels[2]);</p><p>//-----------使用序列值是ImageIcon的Spinner------------<br />ArrayList<ImageIcon> icons = new ArrayList<ImageIcon>();<br />icons.add(new ImageIcon("a.gif"));<br />icons.add(new ImageIcon("b.gif"));<br />//使用ImageIcon數組建立SpinnerListModel對象<br />SpinnerListModel iconModel = new SpinnerListModel(icons);<br />//使用SpinnerListModel對象建立JSpinner對象<br />spinners[3] = new JSpinner(iconModel);<br />addSpinner(spinners[3], "表徵圖序列值" , valLabels[3]);</p><p>//-----------使用SpinnerDateModel的Spinner------------<br />//分別擷取起始時間、結束時間、初時時間<br />Calendar cal = Calendar.getInstance();<br />Date init = cal.getTime();<br />cal.add(Calendar.DAY_OF_MONTH , -3);<br />Date start = cal.getTime();<br />cal.add(Calendar.DAY_OF_MONTH , 8);<br />Date end = cal.getTime();<br />//建立一個SpinnerDateModel對象,指定最小時間、最大時間和初始時間<br />SpinnerDateModel dateModel = new SpinnerDateModel(init ,<br />start , end , Calendar.HOUR_OF_DAY);<br />//以SpinnerDateModel對象建立JSpinner<br />spinners[4] = new JSpinner(dateModel);<br />addSpinner(spinners[4], "時 間 範 圍" , valLabels[4]);</p><p>//-----------使用DateEditor來格式化Spinner------------<br />dateModel = new SpinnerDateModel();<br />spinners[5] = new JSpinner(dateModel);<br />//建立一個JSpinner.DateEditor對象,用於對指定Spinner進行格式化<br />JSpinner.DateEditor editor = new JSpinner.DateEditor(spinners[5],<br />"公元yyyy年MM月dd日 HH時");<br />//設定使用JSpinner.DateEditor對象進行格式化<br />spinners[5].setEditor(editor);<br />addSpinner(spinners[5], "使用DateEditor" , valLabels[5]);<br />//為“確定”按鈕添加一個事件監聽器<br />okBn.addActionListener(new ActionListener()<br />{<br />public void actionPerformed(ActionEvent evt)<br />{<br />//取出每個微調控制器的值,並將該值用後面的Label標籤顯示出來。<br />for (int i = 0 ; i < SPINNER_NUM ; i++)<br />{<br />valLabels[i].setText(spinners[i].getValue().toString());<br />}<br />}<br />});</p><p>JPanel bnPanel = new JPanel();<br />bnPanel.add(okBn);<br />mainWin.add(spinnerBox, BorderLayout.CENTER);<br />mainWin.add(bnPanel, BorderLayout.SOUTH);<br />mainWin.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);<br />mainWin.pack();<br />mainWin.setVisible(true);</p><p>}<br />//定義一個方法,用於將滑動條添加到容器中<br />public void addSpinner(JSpinner spinner, String description<br />,JLabel valLabel)<br />{<br />Box box = new Box(BoxLayout.X_AXIS);<br />JLabel desc = new JLabel(description + ":");<br />desc.setPreferredSize(new Dimension(100 , 30));<br />box.add(desc);<br />box.add(spinner);<br />valLabel.setPreferredSize(new Dimension(180 , 30));<br />box.add(valLabel);<br />spinnerBox.add(box);<br />}<br />public static void main(String[] args)<br />{<br />new TestJSpinner().init();<br />}<br />}<br />

相比前面的Jspinner來說,JList和JComboBox就用的多些,eg

public class TestList<br />{<br />private JFrame mainWin = new JFrame("測試清單框");<br />String[] books = new String[]<br />{<br />"Spring2.0寶典",<br />"輕量級J2EE公司專屬應用程式實戰",<br />"基於J2EE的Ajax寶典",<br />"Struts2權威指南",<br />"ROR敏捷開發最佳實務"<br />};<br />JList bookList = new JList(books);<br />JComboBox bookSelector;<br />//定義布局選擇按鈕所在的面板<br />JPanel layoutPanel = new JPanel();<br />ButtonGroup layoutGroup = new ButtonGroup();<br />//定義選擇模式按鈕所在的面板<br />JPanel selectModePanel = new JPanel();<br />ButtonGroup selectModeGroup = new ButtonGroup();<br />JTextArea favoriate = new JTextArea(4 , 40);</p><p>public void init()<br />{<br />//JList的可視高度可同時顯示三個清單項目<br />bookList.setVisibleRowCount(3);<br />//預設選中第三項到第五項(第一項的索引是0)<br />bookList.setSelectionInterval(2, 4);<br />addLayoutButton("縱向滾動", JList.VERTICAL);<br />addLayoutButton("縱向換行", JList.VERTICAL_WRAP);<br />addLayoutButton("橫向換行", JList.HORIZONTAL_WRAP);<br />addSelectModelButton("無限制", ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);<br />addSelectModelButton("單選", ListSelectionModel.SINGLE_SELECTION);<br />addSelectModelButton("單範圍", ListSelectionModel.SINGLE_INTERVAL_SELECTION);<br />Box listBox = new Box(BoxLayout.Y_AXIS);<br />//將JList組件放在JScrollPane中,再將該JScrollPane添加到listBox容器中<br />listBox.add(new JScrollPane(bookList));<br />//添加布局選擇按鈕面板、選擇模式按鈕面板<br />listBox.add(layoutPanel);<br />listBox.add(selectModePanel);<br />//為JList添加事件監聽器<br />bookList.addListSelectionListener(new ListSelectionListener()<br />{<br />public void valueChanged(ListSelectionEvent e)<br />{<br />//擷取使用者所選擇的所有圖書<br />Object[] books = bookList.getSelectedValues();<br />favoriate.setText("");<br />for (Object book : books )<br />{<br />favoriate.append(book.toString() + "/n");<br />}<br />}<br />});</p><p>Vector<String> bookCollection = new Vector<String>();<br />bookCollection.add("Spring2.0寶典");<br />bookCollection.add("輕量級J2EE公司專屬應用程式實戰");<br />bookCollection.add("基於J2EE的Ajax寶典");<br />bookCollection.add("Struts2權威指南");<br />bookCollection.add("ROR敏捷開發最佳實務");<br />//用一個Vector對象來建立一個JComboBox對象<br />bookSelector = new JComboBox(bookCollection);<br />//為JComboBox添加事件監聽器<br />bookSelector.addItemListener(new ItemListener()<br />{<br />public void itemStateChanged(ItemEvent e)<br />{<br />//擷取JComboBox所選中的項<br />Object book = bookSelector.getSelectedItem();<br />favoriate.setText(book.toString());<br />}<br />});</p><p>//設定可以直接編輯<br />bookSelector.setEditable(true);<br />//設定下拉式清單方塊的可視高度可同時顯示4個清單項目<br />bookSelector.setMaximumRowCount(4);</p><p>JPanel p = new JPanel();<br />p.add(bookSelector);<br />Box box = new Box(BoxLayout.X_AXIS);<br />box.add(listBox);<br />box.add(p);<br />mainWin.add(box);<br />JPanel favoriatePanel = new JPanel();<br />favoriatePanel.setLayout(new BorderLayout());<br />favoriatePanel.add(new JScrollPane(favoriate));<br />favoriatePanel.add(new JLabel("您喜歡的圖書:") , BorderLayout.NORTH);<br />mainWin.add(favoriatePanel , BorderLayout.SOUTH);</p><p>mainWin.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);<br />mainWin.pack();<br />mainWin.setVisible(true);<br />}</p><p>private void addLayoutButton(String label, final int orientation)<br />{<br />layoutPanel.setBorder(new TitledBorder(new EtchedBorder(), "確定選項布局"));<br />JRadioButton button = new JRadioButton(label);<br />//把該選項按鈕添加到layoutPanel面板中<br />layoutPanel.add(button);<br />//預設選中第一個按鈕<br />if (layoutGroup.getButtonCount() == 0)<br />button.setSelected(true);<br />layoutGroup.add(button);<br />button.addActionListener(new ActionListener()<br />{<br />public void actionPerformed(ActionEvent event)<br />{<br />//改變列表框裡清單項目的布局方向<br />bookList.setLayoutOrientation(orientation);<br />}<br />});<br />}<br />private void addSelectModelButton(String label, final int selectModel)<br />{<br />selectModePanel.setBorder(new TitledBorder(new EtchedBorder(), "確定選擇模式"));<br />JRadioButton button = new JRadioButton(label);<br />//把該選項按鈕添加到selectModePanel面板中<br />selectModePanel.add(button);<br />//預設選中第一個按鈕<br />if (selectModeGroup.getButtonCount() == 0)<br />button.setSelected(true);<br />selectModeGroup.add(button);<br />button.addActionListener(new ActionListener()<br />{<br />public void actionPerformed(ActionEvent event)<br />{<br />//改變列表框裡的選擇模式<br />bookList.setSelectionMode(selectModel);<br />}<br />});<br />}</p><p>public static void main(String[] args)<br />{<br />new TestList().init();<br />}<br />}<br />

JList和JComboBox除了樣子上的區別,就是JComboBox只支援單選,而JList可以多選。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.