Согласно моему предыдущему вопросу здесь: Удалить кнопку с таким же текстом при нажатии
Мне нужно, чтобы единственные кнопки, которые появляются более одной, исчезали при нажатии на них Проблема в том, что при нажатии на «Уникальные» (см. рисунок) они также исчезают. Мой код:
private String namesArr[] = {"Yakir","Yarden","Igor","Maoz","Moshe","Israel","Tal","Haim","Nati","Mor","Daniel","Idan"};
private Button buttonArr[] = new Button[namesArr.length];
private Font font;
public StudentsGUI(String caption) {
super(caption);
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
dispose();
System.exit(0);
}
});
this.setLayout(new GridLayout(3,3));
font = new Font("Ariel",Font.BOLD,35);
for(int i=0;i<namesArr.length;i++) {
buttonArr[i] = new Button(" "+namesArr[(int)(Math.random()*namesArr.length)]);
buttonArr[i].setFont(font);
buttonArr[i].addActionListener(this);
this.add(buttonArr[i]);
}
setLocation(800,500);
setVisible(true);
pack();
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() instanceof Button) {
String btnText = ((Button)e.getSource()).getLabel();
for(int i=0; i<buttonArr.length; i++) {
if (buttonArr[i].getLabel().equals(btnText)) {
this.remove(buttonArr[i]);
pack();
}
}
}
}
Таким образом, если щелкнуть «Идан», ведьма — это уникальное имя, ничего не произойдет, поскольку оно имеет только один экземпляр, но если щелкнуть «Маоз», все кнопки с заголовком «Маоз» исчезнут (это уже происходит)
Как сделать так, чтобы исчезали только те, кто повторяется? Уникальные должны остаться, на картинке те, кому нужно остаться, независимо от того, нажимаете ли вы «Израиль», «Даниил» и «Идан».




Вы имеете в виду что-то вроде этого (в коде могут быть синтаксические ошибки)?
public void actionPerformed(ActionEvent e) {
if (e.getSource() instanceof Button) {
String btnText = ((Button)e.getSource()).getLabel();
List<Button> btnList = new ArrayList<Button>();
for(int i=0; i<buttonArr.length; i++) {
if (buttonArr[i].getLabel().equals(btnText)) {
btnList.add(buttonArr[i]);
//this.remove(buttonArr[i]);
//pack();
}
}
if (btnList.size() > 1) {
for (Iterator<Button> it = btnList.iterator(); it.hasNext()) {
this.remove(it.next());
}
pack();
}
}
}
Ценю ваш ответ, но @funkyjelly опубликовал то, что нужно :) Спасибо!
использование коллекций в соответствии с ответом @Freddy должно быть лучше. Однако, если вы хотите придерживаться массивов, это должно сделать что-то вроде ниже (хотя это не проверялось)
public void actionPerformed(ActionEvent e) {
if (e.getSource() instanceof Button) {
String btnText = ((Button)e.getSource()).getLabel();
int counter = 0;
for(int i=0; i<buttonArr.length; i++) {
if (buttonArr[i].getLabel().equals(btnText)) counter++;
if (count > 1) {
for(int j=0; j<buttonArr.length; j++) {
if (buttonArr[j].getLabel().equals(btnText))
this.remove(buttonArr[j]);
}
}
}
pack();
}
}
Спасибо! Протестировал его прямо сейчас, и он работает отлично! просто быстрый вопрос, что вы подразумеваете под коллекциями?
например ArrayList, поскольку они предоставляют более простые методы добавления/удаления и т. д.: tutorialspoint.com/java/java_collections.htm
Спасибо @funkyjelly
так в чем именно заключается ваш вопрос и ваша проблема или ошибка?