在 comboBox java swing 中隐藏选项
hide options in comboBox java swing
我想为游戏中的用户创建一个选项,让他们可以 select 从我制作的棋子列表中选择他们自己的棋子来玩。为此,我有两个组合框,其中包含相同的项目,但我不希望用户能够 select 同一块。
如果 selected 在 comboBox2 中,我考虑过从 comboBox 1 中删除该项目(并稍后将其添加回来),但我稍后在分配时使用 selected 项目的索引'player' class 的图像,所以这会在那里变得混乱,而且每个列表的索引也会不同,因为它们不包含另一个 selected 的项目(希望有道理)。
如果在组合框 1 中 select 编辑了组合框 2 中的项目,我如何才能使它隐藏或select不可用?
非常感谢
创建表示 Piece
...
基本属性的 POJO
public class Piece {
private Image image;
private String name;
public Piece(String name, Image image) {
this.image = image;
this.name = name;
}
public Image getImage() {
return image;
}
public String getName() {
return name;
}
}
将这些添加到您的 JComboBox
Piece[] pieces = new Piece[]{
// Create what ever pieces you need...
}
DefaultComboBoxModel modelPlayer1 = new DefaultComboBoxModel(pieces);
DefaultComboBoxModel modelPlayer2 = new DefaultComboBoxModel(pieces);
JComboBox cbPlayer1 = new JComboBox(modelPlayer1);
JComboBox cbPlayer2 = new JComboBox(modelPlayer2);
您会发现您可能需要某种 ListCellRenderer
才能在 JComboBox
中显示 Piece
的名称,例如...
public class PieceListCellRenderer extends DefaultListCellRenderer {
@Override
public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
if (value instanceof Piece) {
value = ((Piece)value).getName();
}
return super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
}
}
然后将渲染器应用于组合框
cbPlayer1.setRenderer(new PieceListCellRenderer());
cbPlayer2.setRenderer(new PieceListCellRenderer());
现在,您不需要关心索引,因为您已经从同一个 Pieces
数组构建了两个模型,您只需通过引用删除它们应该没有问题...
Piece p = (Piece)cbPlayer1.getSelectedItem();
((DefaultComboBoxModel)cbPlayer2.getModel()).removeElement(p);
有关详细信息,请参阅 How to Use Combo Boxes
我想为游戏中的用户创建一个选项,让他们可以 select 从我制作的棋子列表中选择他们自己的棋子来玩。为此,我有两个组合框,其中包含相同的项目,但我不希望用户能够 select 同一块。
如果 selected 在 comboBox2 中,我考虑过从 comboBox 1 中删除该项目(并稍后将其添加回来),但我稍后在分配时使用 selected 项目的索引'player' class 的图像,所以这会在那里变得混乱,而且每个列表的索引也会不同,因为它们不包含另一个 selected 的项目(希望有道理)。
如果在组合框 1 中 select 编辑了组合框 2 中的项目,我如何才能使它隐藏或select不可用?
非常感谢
创建表示 Piece
...
public class Piece {
private Image image;
private String name;
public Piece(String name, Image image) {
this.image = image;
this.name = name;
}
public Image getImage() {
return image;
}
public String getName() {
return name;
}
}
将这些添加到您的 JComboBox
Piece[] pieces = new Piece[]{
// Create what ever pieces you need...
}
DefaultComboBoxModel modelPlayer1 = new DefaultComboBoxModel(pieces);
DefaultComboBoxModel modelPlayer2 = new DefaultComboBoxModel(pieces);
JComboBox cbPlayer1 = new JComboBox(modelPlayer1);
JComboBox cbPlayer2 = new JComboBox(modelPlayer2);
您会发现您可能需要某种 ListCellRenderer
才能在 JComboBox
中显示 Piece
的名称,例如...
public class PieceListCellRenderer extends DefaultListCellRenderer {
@Override
public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
if (value instanceof Piece) {
value = ((Piece)value).getName();
}
return super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
}
}
然后将渲染器应用于组合框
cbPlayer1.setRenderer(new PieceListCellRenderer());
cbPlayer2.setRenderer(new PieceListCellRenderer());
现在,您不需要关心索引,因为您已经从同一个 Pieces
数组构建了两个模型,您只需通过引用删除它们应该没有问题...
Piece p = (Piece)cbPlayer1.getSelectedItem();
((DefaultComboBoxModel)cbPlayer2.getModel()).removeElement(p);
有关详细信息,请参阅 How to Use Combo Boxes