📄 s18.htm
字号:
private ColorKeySelectionManager ksm = <br> new ColorKeySelectionManager();</p> <p> private JComboBox colorCombo = new JComboBox(new Object[] {<br> new Item(new Object[] { Color.gray, "gray" }),<br> new Item(new Object[] { Color.orange, "orange" }),<br> new Item(new Object[] { Color.red, "red" }),<br> new Item(new Object[] { Color.blue, "blue" }),<br> new Item(new Object[] { Color.yellow, "yellow" }),<br> new Item(new Object[] { Color.magenta, "magenta" }),<br> new Item(new Object[] { Color.black, "black" }),<br> new Item(new Object[] { Color.green, "green" }),<br> new Item(new Object[] { Color.lightGray, "lightGray"})<br> });<br> public void init() {<br> final Container contentPane = getContentPane();</p> <p> colorCombo.setRenderer(new ColorRenderer());<br> colorCombo.setKeySelectionManager(ksm);</p> <p> contentPane.setLayout(new FlowLayout());<br> contentPane.add(colorCombo);</p> <p> colorCombo.addActionListener(new ActionListener(){<br> public void actionPerformed(ActionEvent e) {<br> Item item = (Item)colorCombo.getSelectedItem();<br> String itemString = item.toString();</p> <p> showStatus("'" + ksm.getSearchString() +<br> "'" + " is for " + itemString);<br> }<br> });<br> }<br> }<br> class Item {<br> private Color color;<br> private String string;</p> <p> public Item(Object[] array) {<br> color = (Color)array[0];<br> string = (String)array[1];<br> }<br> public Color getColor() { return color; }<br> public String toString() { return string; }<br> }<br> class ColorRenderer extends JLabel implements ListCellRenderer {<br> private static ColorIcon icon = new ColorIcon();</p> <p> private Border <br> redBorder = BorderFactory.createLineBorder(Color.red,2),<br> emptyBorder = BorderFactory.createEmptyBorder(2,2,2,2);</p> <p> public Component getListCellRendererComponent(<br> JList list,<br> Object value,<br> int index,<br> boolean isSelected,<br> boolean cellHasFocus) {<br> Item item = (Item)value;</p> <p> icon.setColor(item.getColor());<br> setIcon(icon);<br> setText(item.toString());</p> <p> if(isSelected) setBorder(redBorder);<br> else setBorder(emptyBorder);</p> <p> return this;<br> }<br> }<br> class ColorIcon implements Icon {<br> private Color color;<br> private int w, h;</p> <p> public ColorIcon() {<br> this(Color.gray, 50, 15);<br> }<br> public ColorIcon(Color color, int w, int h) {<br> this.color = color;<br> this.w = w;<br> this.h = h;<br> }<br> public void paintIcon(Component c, Graphics g, int x, int y) {<br> g.setColor(Color.black);<br> g.drawRect(x, y, w-1, h-1);<br> g.setColor(color);<br> g.fillRect(x+1, y+1, w-2, h-2);<br> }<br> public Color getColor() {<br> return color;<br> }<br> public void setColor(Color color) {<br> this.color = color;<br> }<br> public int getIconWidth() {<br> return w;<br> }<br> public int getIconHeight() {<br> return h;<br> }<br> }<br> class ColorKeySelectionManager <br> implements JComboBox.KeySelectionManager {<br> private String searchString = new String();<br> private long lastTime;</p> <p> public int selectionForKey(char key,ComboBoxModel model) {<br> updateSearchString(model, key);</p> <p> int start = getIndexAfter(model,getSelectedString(model));<br> int selection = search(model, start);</p> <p> if(selection == -1 && start != 0)<br> selection = search(model, 0);</p> <p> return selection;<br> }<br> public String getSearchString() {<br> return searchString;<br> }<br> private int search(ComboBoxModel model, int start) {<br> for(int i=start; i < model.getSize(); ++i) {<br> String s = getString(model, i);<br> int searchLength = searchString.length();</p> <p> if(s.regionMatches(0,searchString,0,searchLength))<br> return i;<br> }<br> return -1;<br> }<br> private int getIndexAfter(ComboBoxModel model, String find) {<br> int size = model.getSize();</p> <p> if(find != null) {<br> for(int i=0; i < size; ++i) {<br> String s = getString(model, i);</p> <p> if(s.compareToIgnoreCase(find) == 0) {<br> return (i == size-1) ? 0 : i + 1;<br> }<br> }<br> }<br> return 0;<br> }<br> private String getString(ComboBoxModel model, int index) {<br> Item item = (Item)model.getElementAt(index);<br> return item.toString();<br> }<br> private String getSelectedString(ComboBoxModel model) {<br> Item item = (Item)model.getSelectedItem();<br> return item.toString();<br> }<br> private void updateSearchString(<br> ComboBoxModel model, char key) {<br> long time = System.currentTimeMillis();</p> <p> if(time - lastTime < 500) searchString += key;<br> else searchString = "" + key;</p> <p> lastTime = time;<br> }<br> }</p> <hr size="1" noshade> <p> 18.5.3 程序式的键选取</p> <p> </p> <p align="center"><b>例18-5 使用SwingUtilities.invokeLater()</b></p> <hr noshade size="1"> import java.awt.*;<br> import java.awt.event.*;<br> import javax.swing.*;<br> import javax.swing.border.*; <p>public class Test extends JApplet {<br> private JComboBox charsCombo = new JComboBox(new Object[] {<br> new Character('g'), new Character('o'), <br> new Character('r'), new Character('b'), <br> new Character('y'), new Character('m'), <br> new Character('g'), new Character('l'),<br> });<br> private JComboBox colorCombo = new JComboBox(new Object[] {<br> new Item(new Object[] { Color.gray, "gray" }),<br> new Item(new Object[] { Color.orange, "orange" }),<br> new Item(new Object[] { Color.red, "red" }),<br> new Item(new Object[] { Color.blue, "blue" }),<br> new Item(new Object[] { Color.yellow, "yellow" }),<br> new Item(new Object[] { Color.magenta, "magenta" }),<br> new Item(new Object[] { Color.black, "black" }),<br> new Item(new Object[] { Color.green, "green" }),<br> new Item(new Object[] { Color.lightGray, "lightGray"})<br> });</p> <p> public void init() {<br> final Container contentPane = getContentPane();</p> <p> colorCombo.setRenderer(new ColorRenderer());</p> <p> colorCombo.addActionListener(new ActionListener(){<br> public void actionPerformed(ActionEvent e) {<br> Item item = (Item)colorCombo.getSelectedItem();<br> Character first = new Character(<br> item.toString().charAt(0));</p> <p> showStatus("'" + first.toString() + "'" +<br> " is for " + item);<br> }<br> });<br> charsCombo.addActionListener(new ActionListener() {<br> public void actionPerformed(ActionEvent e) {<br> final Character c = (Character)<br> charsCombo.getSelectedItem();</p> <p> colorCombo.selectWithKeyChar(c.charValue());</p> <p> SwingUtilities.invokeLater(new Runnable() {<br> public void run() {<br> Item item = (Item)<br> colorCombo.getSelectedItem();</p> <p> JOptionPane.showMessageDialog(contentPane,<br> "'" + c.toString() + "'" +<br> " is for " + item.toString());<br> }<br> });<br> }<br> });<br> contentPane.setLayout(<br> new FlowLayout(FlowLayout.CENTER, 10, 35));</p> <p> contentPane.add(new JLabel("Select a Character:"));<br> contentPane.add(charsCombo);<br> contentPane.add(colorCombo);<br> }<br> }<br> class Item {<br> private Color color;<br> private String string;</p> <p> public Item(Object[] array) {<br> color = (Color)array[0];<br> string = (String)array[1];<br> }<br> public Color getColor() { return color; }<br> public String toString() { return string; }<br> }</p> <p>class ColorRenderer extends JLabel implements ListCellRenderer {<br> private static ColorIcon icon = new ColorIcon();</p> <p> private Border <br> redBorder = BorderFactory.createLineBorder(Color.red,2),<br> emptyBorder = BorderFactory.createEmptyBorder(2,2,2,2);</p> <p> public Component getListCellRendererComponent(<br> JList list,<br> Object value,<br> int index,<br> boolean isSelected,<br> boolean cellHasFocus) {<br> Item item = (Item)value;</p> <p> icon.setColor(item.getColor());</p> <p> setIcon(icon);<br> setText(item.toString());</p> <p> if(isSelected) setBorder(redBorder);<br> else setBorder(emptyBorder);</p> <p> return this;<br> }<br> }<br> class ColorIcon implements Icon {<br> private Color color;<br> private int w, h;</p> <p> public ColorIcon() {<br> this(Color.gray, 50, 15);<br> }<br> public ColorIcon(Color color, int w, int h) {<br> this.color = color;<br> this.w = w;<br> this.h = h;<br> }<br> public void paintIcon(Component c, Graphics g, int x, int y) {<br> g.setColor(Color.black);<br> g.drawRect(x, y, w-1, h-1);<br> g.setColor(color);<br> g.fillRect(x+1, y+1, w-2, h-2);<br> }<br> public Color getColor() {<br> return color;<br> }<br> public void setColor(Color color) {<br> this.color = color;<br> }<br> public int getIconWidth() {<br> return w;<br> }<br> public int getIconHeight() {<br> return h;<br> }<br> }</p> <hr size="1" noshade> <p> 18.6 组合框编辑器</p> <p> </p> <p align="center"><b>例18-6 实现一个定制的组合框编辑器</b></p> <hr noshade size="1"> import java.awt.*;<br> import java.awt.event.*;<br> import javax.swing.*;<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -