当前位置:首页 > Windows程序 > 正文

高级Swing

2021-05-26 Windows程序

标签:

1. 列表 1.1 JList构件

  JList可以将多个选项放置在单个框中。为了构建列表框,首先需要创建一个字符串数组,然后将这个数组传递给JList构造器。

String[] words= { "quick", "brown", "hungry", "wild", . . . }; JList<String> wordList = new JList<>(words);

  列表框不能自动滚动,要想为列表框加上滚动条,必须将它插入到一个滚动面板中:

JScrollPane scrollPane = new JScrollPane(wordList);

  然后应该应该把滚动面板而不是列表框,插入到外围面板上。

  默认情况下,列表框构件可以显示8个选项;可以使用setVisibleRowCount方法改变这个值:

wordList.setVisibleRowCount(4); // display 4 items

  还可以使用以下三个值中的任意一个来设置列表框摆放的方向:

• JList.VERTICAL ( 默认值) :垂直摆放所有选项。
• JList.VERTICAL_WRAP: 如果选项数超过了可视行数,就开始新的一列。

•  JList.HORIZONTAL_WRAP:  如果选项数超过了可视行数,就开始新的一行,并且按照水平方向进行填充。

  在默认的情况下,用户可以选择多个选项。为了选择多个选项,只需要按住CTRL键,然后在要选择的选项上单击。要选择处于连续范围内的选项,首先选择第一个选项,然后按住SHIFT键,并在最后一个选项上点击即可。

  使用setSelectionMode方法,还可以对用户的选择模式加以限制:

wordList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); // select one item at a time wordList.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION); // select one item or one range of items

  列表框使用一种不同的事件通知机制,它不需要监听动作事件,而是监听列表选择事件。可以向列表构件添加一个列表选择监听器,然后在监听器中实现下面这个方法:

public void valueChanged(ListSelectionEvent evt)

  在用户选择了若干个选项的同时,将产生一系列列表选择事件。假如用户在一个新选项上单击,当鼠标按下的时候,就会有一个事件来报告选项的改变。这是一种过渡型事件,,在调用event.getValueIsAdjusting()时,如果该选择仍未最终结束则返回true。然后,当松开鼠标时,就产生另一事件,此时event.getValueIsAdjusting()返回false。如果你对这种过渡型事件不感兴趣,那么可以等待event.getValueIsAdjusting()调用返回false的事件。不过,如果希望只是要点击鼠标就给用户一个即时反馈,那么就需要处理所有的事件。

  一旦被告知某个事件已经发生,那么就需要弄清楚当前选择了哪些选项。如果是单选模式,调用getSelectedValue可以获取所有选中列表的元素的值;否则调用getSelectedValues返回一个包含所有选中选项的对象数组。之后,可以以常规方式处理它。

for (String value : wordList.getSelectedValuesList()) // do something with value

注意:列表构件不响应鼠标的双击事件。正如Swing设计者所构想的那样,使用列表选择一个选项,然后点击某个按钮执行某个动作。但是,某些用户界面允许用户在一个列表选项上双击鼠标,作为选择一个选项并调用一个默认动作的快捷方式。如果想实现这中行为,那么必须对这个列表框添加一个鼠标监听器,然后按照下面这样捕获鼠标事件:

public void mouseClicked(MouseEvent evt) { if (evt.getClickCount() == 2) { JList source = (JList) evt.getSource(); Object[] selection = source.getSelectedValues(); doAction(selection); } }

下面的程序展示了一个填入字符串的列表框。请注意valueChanged方法是怎样根据被选项来创建消息字符的。

package list; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; public class ListFrame extends JFrame { private static final int DEFAULT_WIDTH=400; private static final int DEFAULT_HEIGHT=300; private JPanel listPanel; private JList<String> wordlist; private JLabel label; private JPanel buttonPanel; private ButtonGroup group; private String prefix="The "; private String suffix="fox jump over the lazy dog."; public ListFrame(){ this.setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT); String[] words = {"quick","brown","hungry","wild","silent","huge","private","abstract","static","final"}; wordlist = new JList<>(words); wordlist.setVisibleRowCount(4); JScrollPane scrollPane = new JScrollPane(wordlist); listPanel = new JPanel(); listPanel.add(scrollPane); wordlist.addListSelectionListener(new ListSelectionListener(){ @Override public void valueChanged(ListSelectionEvent e) { StringBuilder text = new StringBuilder(prefix); for(String value : wordlist.getSelectedValuesList()){ text.append(value); text.append(" "); } text.append(suffix); label.setText(text.toString()); } }); buttonPanel = new JPanel(); group = new ButtonGroup(); makeButton("Vertical", JList.VERTICAL); makeButton("Vertical Wrap",JList.VERTICAL_WRAP); makeButton("Horizontal Wrap",JList.HORIZONTAL_WRAP); this.add(listPanel, BorderLayout.NORTH); label = new JLabel(prefix+suffix); this.add(label, BorderLayout.CENTER); this.add(buttonPanel, BorderLayout.SOUTH); this.setTitle("ListTest"); this.setVisible(true); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } /** * 设置按钮 * @param string 按钮名字 * @param vertical 按钮类型 */ private void makeButton(String string, final int vertical) { JRadioButton button = new JRadioButton(string); buttonPanel.add(button); if(group.getButtonCount()==0) button.setSelected(true); group.add(button); button.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { wordlist.setLayoutOrientation(vertical); listPanel.revalidate(); //重新布局并绘制 } }); } public static void main(String[] args) { new ListFrame(); } }

 1.2 列表模式

  通过前一节,我们已经对列表构件的一些常用方法有了一定的了解:

  1)指定一组在列表中显示的固定字符串

  2)将列表放置到一个滚动面板中

  3)捕获列表选择事件

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/71586.html