2013-11-13 6 views
-1

Я хочу удалить JButton из gridLayout, используя actionListener. Я хочу оставить в пустом пространстве JButton, который был удален, а затем заполнить это пространство с помощью JLabel или что-то в этом роде.Как добавить или удалить JButtons в определенном месте в gridlayout?

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
public class bottons extends JFrame implements ActionListener{ 

private JPanel test; 
    private JButton[][] buttons; 
private JuegoBuca(){ 

     setVisible(true); 
     setSize(500,500); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setTitle("Test"); 
     setResizable(false); 


     buttons = new JButton[5][5]; 

     test = new JPanel(); 
     test.setLayout(new GridLayout(5,5)); 


     for(int i = 0 ; i<5 ; i++){ 
      for(int j = 0; j<5 ; j++){ 
       test.add(buttons[i][j] = new JButton(Integer.toString(index++))); 

       buttons[i][j].addActionListener(this); 
      } 
     } 

     add(test, BorderLayout.CENTER); 


    } 

public void actionPerformed(ActionEvent e) { 
     Object o = e.getSource(); 
     for(int i = 0; i<5 ; i++){ 
      for(int j = 0 ; j<5; j++){ 
       if(buttons[i][j] == o){ 
        test.remove(buttons[i][j]); 
       } 
      } 
     } 
} 

В методе ActionListener, он вынимает JButton, но он перемещает кнопку других и заполняет пространство. Индекс просто должен иметь что-то в кнопке, чтобы сделать видимым изменение. Спасибо!

+0

я бы просто использовать 'JButton' экземпляры для всех и не' JLabel'. Когда кнопка должна выглядеть как-то, установите для нее значок. Когда он должен выглядеть как «ничего», просто установите пустым (прозрачным) изображение на кнопку в качестве значка вместо первого значка. –

+2

Итак, если вы нашли время, чтобы прочитать ответ, который я оставил на вашем [предыдущие вопросы] (http://stackoverflow.com/questions/19919807/how-to-remove-a-jbutton-in-a-jbutton- матрица) вы увидите ответ – MadProgrammer

+0

-1, Да, это третий или четвертый вопрос по теме (похоже, что другие были удалены). Выйдите из форума с дублирующимися вопросами и обратите внимание на уже полученные ответы. Сказав это, вместо того, чтобы создавать ArrayList для поиска вашей кнопки, я бы просто использовал метод 'Container.getComponents()', поэтому вам не нужно отслеживать кнопки в двух местах. – camickr

ответ

0

Вместо того, чтобы добавить кнопку непосредственно в GridLayout, вы можете вместо этого добавить JPanel, в котором есть ячейка CardLayout. Это позволит вам добавить в ячейку несколько «карточек» и переключиться между ними. Одна «карта» может быть даже пустой, если вы хотите, чтобы внешний вид ячейки был пустым.

0
@Override 
public void actionPerformed(ActionEvent e) { 
    Object o = e.getSource(); 
    Component[] components = test.getComponents(); 

    for (int i = 0; i < components.length; i++) { 
     if (components[i] == o) { 
      // Remove the button that was clicked. 
      test.remove(i); 

      // Add a blank label in place of the button. 
      test.add(new JLabel(), i); 
     } 
    } 

    // Force Swing to repaint the panel. 
    test.repaint(); 
} 
+1

Индекс может не отображаться в позиции кнопок в контейнере – MadProgrammer

+0

Да, вы правильно указали @MadProgrammer об индексе. Я переписал свой ответ, который, я считаю, исправляет проблему. – Barzee

2

Таким образом, на основе концепции, представленной в вашем previous question, вы должны знать, где компонент вы удаляете находится внутри контейнера.

К счастью для вас, GridLayout излагает каждый компонент на основе порядка, в котором он был добавлен. Это означает, что вам просто нужно определить позицию текущего компонента в контейнере перед его удалением и добавить новый компонент там, где он был.

public void actionPerformed(ActionEvent e) { 
    Object o = e.getSource(); 
    for(int i = 0; i<5 ; i++){ 
     for(int j = 0 ; j<5; j++){ 
      if(buttons[i][j] == o){ 
       // Find the position of the component within the container 
       int index = getComponentZOrder(buttons[i][j]); 
       // Remove the old component 
       test.remove(buttons[i][j]); 
       // Replace it with a new component at the same position 
       add(new JLabel("I was here"), index); 
      } 
     } 
    } 
} 

Для примера смотрите ваши previous question

Смежные вопросы