Трудность доступа с ArrayList панелей с кнопками - PullRequest
0 голосов
/ 13 октября 2019

мой вопрос: как мне получить объект моей CustomPanel, чтобы я мог получить доступ к ее полям (потому что в моей настоящей программе у меня есть еще несколько полей), а также я могу удалить его из моего ArrayList?

Я не знаю, как мне реализовать ActionListener в Окне Класса, чтобы каким-то образом получить Объект в моем Arraylist, который содержит нажатую кнопку.

Также яинтересно, могу ли я как-то реализовать ActionListener в классе CustomPanel, который может влиять на поведение объекта, который является экземпляром моего окна класса.

У меня есть вид следующего кода:

public class Window extends JFrame{
 ArrayList<CustomPanel> aLCustomPanel = new ArrayList();
 JPanel jp = new JPanel();

 public Window() {
  for(int i=0;i<5;i++){
   aLCustomPanel.add(new CustomPanel());
   //here I could put the code from the 1 edit - see below
   jp.add(aLCustomPanel.get(i));
  }
  this.add(jp);
 }
 public static void main(String args[]){
  java.awt.EventQueue.invokeLater(new Runnable() {
   public void run() {
    new Window().setVisible(true);
   }
  });
 }
}


class CustomPanel extends JPanel {
 private JButton button;

 public CustomPanel(){
  button = new JButton("button");
  this.add(button);
 }

 public JButton getButton(){
  return this.button;
 }
} 

мой Код гораздо длиннее и страннее, поэтому я попытался извлечь (для этого вопроса) импортируемые вещи.

Заранее благодарен за любую помощь!


edit:

например: я хотел бы удалить объект из ArrayList, кнопка которого была нажата.

//imagine this comment in above code
aLCustomPanel.get(aLCustomPanel.size()-1).getButton().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                button_IwantToDeleteYou(e); //here I want to remove the panel, containing the button that got pressed from the above ArrayList, which is located in Class Window
            }
        });

edit2: добавлен отсутствующий квадрат и fiИсправлены некоторые ошибки, код должен быть в порядке.

1 Ответ

1 голос
/ 14 октября 2019

Ваш код содержал несколько «пробелов», то есть отсутствующий код, который я заполнил, следующим образом:

  1. Добавлены вызовы для [JFrame] методов setDefaultCloseOperation() и pack() иsetLocationByPlatform(). Я предлагаю вам обратиться к javadoc для этих методов, чтобы понять, что они делают.
  2. Я установил менеджер компоновки для jp переменной члена класса в вашем Window классе.

Да, вам нужно зарегистрировать ActionListener с JButton в классе CustomPanel, и этот слушатель должен находиться в вашем классе Window - тот, который расширяет JFrame.

Вот мое переписывание вашего кода. Обратите внимание, что я изменил имя класса Window на CusPanel, чтобы различать ваш класс и java.awt.Window класс. Не то чтобы это имело значение, я просто предпочитаю не использовать имена классов из JDK.

import java.awt.Container;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;

public class CusPanel extends JFrame implements ActionListener {
    private static final int COUNT = 5;

    private ArrayList<CustomPanel> aLCustomPanel = new ArrayList<>();
    private JPanel jp = new JPanel(new GridLayout(0, COUNT));

    public CusPanel() {
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        for (int i = 0; i < COUNT; i++) {
            aLCustomPanel.add(new CustomPanel(this));
            // here I could put the code from the 1 edit - see below
            jp.add(aLCustomPanel.get(i));
        }
        this.add(jp);
        pack();
        setLocationByPlatform(true);
    }

    public void actionPerformed(ActionEvent actionEvent) {
        Object source = actionEvent.getSource();
        if (source instanceof JButton) {
            JButton button = (JButton) source;
            Container parent = button.getParent();
            jp.remove(parent);
            jp.invalidate();
            jp.repaint();
            pack();
//            aLCustomPanel.remove(parent); <- optional
        }
    }

    public static void main(String args[]) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                new CusPanel().setVisible(true);
            }
        });
    }
}

class CustomPanel extends JPanel {
    private JButton button;

    public CustomPanel(ActionListener parent) {
        button = new JButton("button");
        button.addActionListener(parent);
        this.add(button);
    }

    public JButton getButton() {
        return this.button;
    }
} 

Обратите внимание, что после удаления CustomPanel компоненты GUI должны быть размечены снова, а JFrame также должен быть соответственно изменен. Следовательно, в методе actionPerformed() я вызываю invalidate(), затем repaint() и затем pack(). Я также думаю, что если вы удалите CustomPanel из GUI, вы также должны удалить его из ArrayList, но, эй, я все еще не понимаю, почему вы хотите это сделать, хотя я, очевидно, не знаю весьИстория того, что вы хотели сделать это в первую очередь.

Конечно, поскольку каждая кнопка (и каждая CustomPanel) выглядит одинаково, вы не можете точно знать, какая кнопка была удалена. Опять же, я полагаю, вы видите общую картину, а я нет.

...