程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java Swing編程:微調控制器和列表框

Java Swing編程:微調控制器和列表框

編輯:關於JAVA

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

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

SpinnerNumberModel用於設置數值型的JSPinner

SpinnerDateModel用於實現時間控件的微調

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

  1. public class TestJSPinner
  2. {
  3. final int SPINNER_NUM = 6;
  4. JFrame mainWin = new JFrame("微調控制器示范");
  5. Box spinnerBox = new Box(BoxLayout.Y_AXIS);
  6. JSPinner[] spinners = new JSPinner[SPINNER_NUM];
  7. JLabel[] valLabels = new JLabel[SPINNER_NUM];
  8. JButton okBn = new JButton("確定");
  9. public void init()
  10. {
  11. for (int i = 0 ; i < SPINNER_NUM ; i++ )
  12. {
  13. valLabels[i] = new JLabel();
  14. }
  15. //-----------普通Spinner-----------
  16. spinners[0] = new JSPinner();
  17. addSpinner(spinners[0], "普通" , valLabels[0]);
  18. //-----------指定最小值、最大值、步長的Spinner-----------
  19. //創建一個SpinnerNumberModel對象,指定最小值、最大值和步長
  20. SpinnerNumberModel numModel = new SpinnerNumberModel(3.4,
  21. -1.1, 4.3, 0.1);
  22. spinners[1] = new JSPinner(numModel);
  23. addSpinner(spinners[1], "數 值 范 圍" , valLabels[1]);
  24. //-----------使用SpinnerListModel的Spinner------------
  25. String[] books = new String[]
  26. {
  27. "輕量級J2EE企業應用實戰",
  28. "Struts2權威指南",
  29. "基於J2EE的AJax寶典"
  30. };
  31. //使用字符串數組創建SpinnerListModel對象
  32. SpinnerListModel bookModel = new SpinnerListModel(books);
  33. //使用SpinnerListModel對象創建JSPinner對象
  34. spinners[2] = new JSPinner(bookModel);
  35. addSpinner(spinners[2], "字符串序列值" , valLabels[2]);
  36. //-----------使用序列值是ImageIcon的Spinner------------
  37. ArrayList<ImageIcon> icons = new ArrayList<ImageIcon>();
  38. icons.add(new ImageIcon("a.gif"));
  39. icons.add(new ImageIcon("b.gif"));
  40. //使用ImageIcon數組創建SpinnerListModel對象
  41. SpinnerListModel iconModel = new SpinnerListModel(icons);
  42. //使用SpinnerListModel對象創建JSPinner對象
  43. spinners[3] = new JSPinner(iconModel);
  44. addSpinner(spinners[3], "圖標序列值" , valLabels[3]);
  45. //-----------使用SpinnerDateModel的Spinner------------
  46. //分別獲取起始時間、結束時間、初時時間
  47. Calendar cal = Calendar.getInstance();
  48. Date init = cal.getTime();
  49. cal.add(Calendar.DAY_OF_MONTH , -3);
  50. Date start = cal.getTime();
  51. cal.add(Calendar.DAY_OF_MONTH , 8);
  52. Date end = cal.getTime();
  53. //創建一個SpinnerDateModel對象,指定最小時間、最大時間和初始時間
  54. SpinnerDateModel dateModel = new SpinnerDateModel(init ,
  55. start , end , Calendar.HOUR_OF_DAY);
  56. //以SpinnerDateModel對象創建JSPinner
  57. spinners[4] = new JSPinner(dateModel);
  58. addSpinner(spinners[4], "時 間 范 圍" , valLabels[4]);
  59. //-----------使用DateEditor來格式化Spinner------------
  60. dateModel = new SpinnerDateModel();
  61. spinners[5] = new JSPinner(dateModel);
  62. //創建一個JSPinner.DateEditor對象,用於對指定Spinner進行格式化
  63. JSPinner.DateEditor editor = new JSPinner.DateEditor(spinners[5],
  64. "公元yyyy年MM月dd日 HH時");
  65. //設置使用JSPinner.DateEditor對象進行格式化
  66. spinners[5].setEditor(editor);
  67. addSpinner(spinners[5], "使用DateEditor" , valLabels[5]);
  68. //為“確定”按鈕添加一個事件監聽器
  69. okBn.addActionListener(new ActionListener()
  70. {
  71. public void actionPerformed(ActionEvent evt)
  72. {
  73. //取出每個微調控制器的值,並將該值用後面的Label標簽顯示出來。
  74. for (int i = 0 ; i < SPINNER_NUM ; i++)
  75. {
  76. valLabels[i].setText(spinners[i].getValue().toString());
  77. }
  78. }
  79. });
  80. JPanel bnPanel = new JPanel();
  81. bnPanel.add(okBn);
  82. mainWin.add(spinnerBox, BorderLayout.CENTER);
  83. mainWin.add(bnPanel, BorderLayout.SOUTH);
  84. mainWin.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
  85. mainWin.pack();
  86. mainWin.setVisible(true);
  87. }
  88. //定義一個方法,用於將滑動條添加到容器中
  89. public void addSpinner(JSPinner spinner, String description
  90. ,JLabel valLabel)
  91. {
  92. Box box = new Box(BoxLayout.X_AXIS);
  93. JLabel desc = new JLabel(description + ":");
  94. desc.setPreferredSize(new Dimension(100 , 30));
  95. box.add(desc);
  96. box.add(spinner);
  97. valLabel.setPreferredSize(new Dimension(180 , 30));
  98. box.add(valLabel);
  99. spinnerBox.add(box);
  100. }
  101. public static void main(String[] args)
  102. {
  103. new TestJSPinner().init();
  104. }
  105. }

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

  1. public class TestList
  2. {
  3. private JFrame mainWin = new JFrame("測試列表框");
  4. String[] books = new String[]
  5. {
  6. "Spring2.0寶典",
  7. "輕量級J2EE企業應用實戰",
  8. "基於J2EE的AJax寶典",
  9. "Struts2權威指南",
  10. "ROR敏捷開發最佳實踐"
  11. };
  12. JList bookList = new JList(books);
  13. JComboBox bookSelector;
  14. //定義布局選擇按鈕所在的面板
  15. JPanel layoutPanel = new JPanel();
  16. ButtonGroup layoutGroup = new ButtonGroup();
  17. //定義選擇模式按鈕所在的面板
  18. JPanel selectModePanel = new JPanel();
  19. ButtonGroup selectModeGroup = new ButtonGroup();
  20. JTextArea favoriate = new JTextArea(4 , 40);
  21. public void init()
  22. {
  23. //JList的可視高度可同時顯示三個列表項
  24. bookList.setVisibleRowCount(3);
  25. //默認選中第三項到第五項(第一項的索引是0)
  26. bookList.setSelectionInterval(2, 4);
  27. addLayoutButton("縱向滾動", JList.VERTICAL);
  28. addLayoutButton("縱向換行", JList.VERTICAL_WRAP);
  29. addLayoutButton("橫向換行", JList.HORIZONTAL_WRAP);
  30. addSelectModelButton("無限制", ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
  31. addSelectModelButton("單選", ListSelectionModel.SINGLE_SELECTION);
  32. addSelectModelButton("單范圍", ListSelectionModel.SINGLE_INTERVAL_SELECTION);
  33. Box listBox = new Box(BoxLayout.Y_AXIS);
  34. //將JList組件放在JScrollPane中,再將該JScrollPane添加到listBox容器中
  35. listBox.add(new JScrollPane(bookList));
  36. //添加布局選擇按鈕面板、選擇模式按鈕面板
  37. listBox.add(layoutPanel);
  38. listBox.add(selectModePanel);
  39. //為JList添加事件監聽器
  40. bookList.addListSelectionListener(new ListSelectionListener()
  41. {
  42. public void valueChanged(ListSelectionEvent e)
  43. {
  44. //獲取用戶所選擇的所有圖書
  45. Object[] books = bookList.getSelectedValues();
  46. favoriate.setText("");
  47. for (Object book : books )
  48. {
  49. favoriate.append(book.toString() + "/n");
  50. }
  51. }
  52. });
  53. Vector<String> bookCollection = new Vector<String>();
  54. bookCollection.add("Spring2.0寶典");
  55. bookCollection.add("輕量級J2EE企業應用實戰");
  56. bookCollection.add("基於J2EE的AJax寶典");
  57. bookCollection.add("Struts2權威指南");
  58. bookCollection.add("ROR敏捷開發最佳實踐");
  59. //用一個Vector對象來創建一個JComboBox對象
  60. bookSelector = new JComboBox(bookCollection);
  61. //為JComboBox添加事件監聽器
  62. bookSelector.addItemListener(new ItemListener()
  63. {
  64. public void itemStateChanged(ItemEvent e)
  65. {
  66. //獲取JComboBox所選中的項
  67. Object book = bookSelector.getSelectedItem();
  68. favoriate.setText(book.toString());
  69. }
  70. });
  71. //設置可以直接編輯
  72. bookSelector.setEditable(true);
  73. //設置下拉列表框的可視高度可同時顯示4個列表項
  74. bookSelector.setMaximumRowCount(4);
  75. JPanel p = new JPanel();
  76. p.add(bookSelector);
  77. Box box = new Box(BoxLayout.X_AXIS);
  78. box.add(listBox);
  79. box.add(p);
  80. mainWin.add(box);
  81. JPanel favoriatePanel = new JPanel();
  82. favoriatePanel.setLayout(new BorderLayout());
  83. favoriatePanel.add(new JScrollPane(favoriate));
  84. favoriatePanel.add(new JLabel("您喜歡的圖書:") , BorderLayout.NORTH);
  85. mainWin.add(favoriatePanel , BorderLayout.SOUTH);
  86. mainWin.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
  87. mainWin.pack();
  88. mainWin.setVisible(true);
  89. }
  90. private void addLayoutButton(String label, final int orIEntation)
  91. {
  92. layoutPanel.setBorder(new TitledBorder(new EtchedBorder(), "確定選項布局"));
  93. JRadioButton button = new JRadioButton(label);
  94. //把該單選按鈕添加到layoutPanel面板中
  95. layoutPanel.add(button);
  96. //默認選中第一個按鈕
  97. if (layoutGroup.getButtonCount() == 0)
  98. button.setSelected(true);
  99. layoutGroup.add(button);
  100. button.addActionListener(new ActionListener()
  101. {
  102. public void actionPerformed(ActionEvent event)
  103. {
  104. //改變列表框裡列表項的布局方向
  105. bookList.setLayoutOrientation(orIEntation);
  106. }
  107. });
  108. }
  109. private void addSelectModelButton(String label, final int selectModel)
  110. {
  111. selectModePanel.setBorder(new TitledBorder(new EtchedBorder(), "確定選擇模式"));
  112. JRadioButton button = new JRadioButton(label);
  113. //把該單選按鈕添加到selectModePanel面板中
  114. selectModePanel.add(button);
  115. //默認選中第一個按鈕
  116. if (selectModeGroup.getButtonCount() == 0)
  117. button.setSelected(true);
  118. selectModeGroup.add(button);
  119. button.addActionListener(new ActionListener()
  120. {
  121. public void actionPerformed(ActionEvent event)
  122. {
  123. //改變列表框裡的選擇模式
  124. bookList.setSelectionMode(selectModel);
  125. }
  126. });
  127. }
  128. public static void main(String[] args)
  129. {
  130. new TestList().init();
  131. }
  132. }

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved