BUG:
在JColorChooser初始化之前先修改它的UI,使它的swatches标签显示为"S"
UIManager.put("ColorChooser.swatchesNameText", "S");之后初始化JColorChooser
JColorChooser.showDialog(null, "select", Color.red);这里就出错了
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Invalid mnemonic index: 3at javax.swing.JTabbedPane$Page.setDisplayedMnemonicIndex(JTabbedPane.java:2065)at javax.swing.JTabbedPane.setDisplayedMnemonicIndexAt(JTabbedPane.java:1597)at javax.swing.plaf.basic.BasicColorChooserUI$Handler.propertyChange(BasicColorChooserUI.java:278)at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:339)at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:276)at java.awt.Component.firePropertyChange(Component.java:7865)at javax.swing.JColorChooser.setChooserPanels(JColorChooser.java:459)at javax.swing.plaf.basic.BasicColorChooserUI.installUI(BasicColorChooserUI.java:91)at javax.swing.JComponent.setUI(JComponent.java:673)at javax.swing.JColorChooser.setUI(JColorChooser.java:222)at javax.swing.JColorChooser.updateUI(JColorChooser.java:233)at javax.swing.JColorChooser.(JColorChooser.java:196) at javax.swing.JColorChooser.(JColorChooser.java:184) at javax.swing.JColorChooser.showDialog(JColorChooser.java:122)
大致看了一下javax.swing.plaf.basic.BasicColorChooserUI和javax.swing.colorchooser.AbstractColorChooserPanel下的源码,大致BUG原因是在BasicColorChooserUI中public void propertyChange(PropertyChangeEvent evt)中的代码:
if (mnemonic > 0) {tabbedPane.setMnemonicAt(i, mnemonic);tabbedPane.setDisplayedMnemonicIndexAt(i, newPanels[i].getDisplayedMnemonicIndex());}
以及JTablePanel中的代码:
void setDisplayedMnemonicIndex(int mnemonicIndex) { if (this.mnemonicIndex != mnemonicIndex) { if (mnemonicIndex != -1 && (title == null || mnemonicIndex <>= title.length())) { throw new IllegalArgumentException( "Invalid mnemonic index: " + mnemonicIndex); } this.mnemonicIndex = mnemonicIndex; JTabbedPane.this.firePropertyChange("displayedMnemonicIndexAt", null, null); } }
也就是说每个标签有一个助记符可以用来标记快捷键,这里是s,在paint是用mnemonicIndex来标记这个位置应该画个下划线。JColorChooser把menmonicIndex完全封装实现了,以至于当标签的text发生变化时,menmonicIndex却没有发生变化,以至于menmonicIndex大于text的长度,从而发生了上面所述的BUG。
如上图所示,当语言环境为日文时,该变量亦没有发生变化,而是静态的在第4个字符下面画下划线。

没有评论:
发表评论