gpt4 book ai didi

java - JComboBox 中的空值停止箭头键使用

转载 作者:搜寻专家 更新时间:2023-11-01 03:13:35 24 4
gpt4 key购买 nike

下面的代码有一个错误。加载 JFrame 后,按 Tab 键将焦点放在 JComboBox 上,然后尝试按向下键。它什么都不做。

在位置 0 插入 Null 会导致这种情况。但是,我仍然希望能够选择 Null。我不想强制用户选择一个选项。

package kobalt.test.colin;

import java.awt.*;
import javax.swing.*;

public class ColinTest extends JFrame {

private JTextField mTextField;
private JComboBox mComboBox;

public ColinTest(){
setLayout(new BorderLayout());

mTextField = new JTextField("Something");
mComboBox = new JComboBox(new String[]{"One", "Two"});
mComboBox.insertItemAt(null, 0); //this line causes the bug

add(mTextField, "North");
add(mComboBox, "South");

pack();
setVisible(true);
}


public static void main(String[] argv) {
new ColinTest();
}
}

我可以在 JComboBox 中重写一些东西来修复这个行为吗?

我真的不喜欢在位置 0 插入一个空字符串,因为我必须在任何地方处理它。

使用 Wrapping 对象可能是一种选择,但我宁愿扩展然后覆盖 JComboBox 中的某些内容。

最佳答案

空对象在 JComboBox 中表现不佳。例如,组合框的 getSelectedIndex 方法在您选择一个项目时触发,如果该对象为 null,则返回 -1。可能还有其他方法执行空值检查并可能返回不正确的结果。

但您可以尝试覆盖 getSelectedIndex,以便在对象为 null 时返回 0 而不是 -1。同时重写 selectedItemChanged,这样它就不会检查空值。以下似乎有效,但可能还有其他方法也需要覆盖:

JComboBox mComboBox = new JComboBox(new String[]{"One", "Two"}){
@Override
public int getSelectedIndex() {
Object sObject = dataModel.getSelectedItem();
int i,c;
Object obj;

if(sObject==null){
return 0;
}
for ( i=0,c=dataModel.getSize();i<c;i++ ) {
obj = dataModel.getElementAt(i);

if ( obj != null && obj.equals(sObject) )
return i;
}
return -1;
}

@Override
protected void selectedItemChanged() {
fireItemStateChanged(new ItemEvent(this, ItemEvent.ITEM_STATE_CHANGED,
selectedItemReminder,
ItemEvent.DESELECTED));
selectedItemReminder = dataModel.getSelectedItem();

fireItemStateChanged(new ItemEvent(this, ItemEvent.ITEM_STATE_CHANGED,
selectedItemReminder,
ItemEvent.SELECTED));
}
};

但是,我建议不要使用上述方法,而是使用包装器对象。例如:

class StringWrapper{
final String s;
public StringWrapper(String s){
this.s=s;
}
@Override
public String toString() {
return s;
}
}

JComboBox cb = new JComboBox(new StringWrapper[]{
new StringWrapper("one"),
new StringWrapper("two"),
new StringWrapper("three")});
cb.insertItemAt(new StringWrapper(null), 0);

关于java - JComboBox 中的空值停止箭头键使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4757929/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com