Java динамически создавать кнопки и передавать параметр выполняемому действию - PullRequest
0 голосов
/ 29 мая 2020

Я новичок в java, и я пробую небольшой проект самостоятельно, я хочу указать имя и фамилию пользователей из базы данных sql (все работает нормально, но я не просто хочу чтобы перечислить их

Я хочу перечислить всех пользователей в GUI с помощью кнопки удаления, естественно, эта кнопка удаления будет генерироваться динамически, и я хочу передать идентификатор пользователя кнопки выполняемому действию. как это :

 John      Doe      'Delete button'
 Jane      Doe      'Delete button'

В моем коде ниже я просто динамически генерирую 16 кнопок (без таблицы пользователей) вместо того, чтобы передавать идентификатор пользователя, я пытаюсь передать значение i для l oop, но мой код не работает

КОД

    public class UsersView implements ActionListener {

    JFrame frame = new JFrame();
    JPanel panel = new JPanel();


    public UsersView() {

        //Create the 16 buttons.
        for (int i=0; i<16; i++) {
            Button button = new Button("Click "+i);
            button.setId(i);  //this gives me and error 'Symbol not find' on the 'setId'
            panel.add(button);
            button.addActionListener(this);
        }

        panel.setBorder(BorderFactory.createBevelBorder(0, Color.lightGray, Color.yellow));
        //panel.setBorder(BorderFactory.createEmptyBorder(300, 300, 100, 300));
        panel.setLayout(new GridLayout(4,4)); //Rows Cols

        frame.add(panel, BorderLayout.CENTER);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setTitle("App GUI");
        frame.pack();
        frame.setVisible(true);

    }

    public static void main(String[] args) {
        // TODO code application logic here
        new UsersView();
    }


    //On button click.
    @Override
    public void actionPerformed(ActionEvent e) {
        //I know i have nothing here (yet) that is because the 'setId' gives me an error.

    }

}

Ответы [ 2 ]

1 голос
/ 31 мая 2020

Одна из проблем, с которыми вы сталкиваетесь, - это создание монолитного c прослушивателя действий, а затем ожидание делегирования действий от него. Одной из приятных особенностей java являются анонимные классы или, начиная с java 7, лямбда-выражения.

JButton button = new JButton("Click " + i);
panel.add(button);
int id = i;
button.addActionListener( evt->{
    performActionOnId( id );
});

Теперь вместо того, чтобы основной класс был слушателем действий, у основного класса есть методы, которые являются описательными.

public void addUser( User a ){
    //just showing delete button.

    JButton delete = new JButton("X");
    delete.addActionListener( evt ->{
        removeUser( a );
        //clean up gui.
    });
}

Это ставит некоторые этапы делегирования при создании пользователя. В противном случае вам придется делегировать выполненное действие.

public void actionPerformed( ActionEvent evt ){
    //has to be a new class to have id attribute.
    CustomButton b = (CustomButton)evt.getSource();
    int id = b.getId();
    User u = getUserById(id);
    removeUser(u);
}
0 голосов
/ 29 мая 2020

Используйте JButton вместо Button. Смешивание компонентов AWT и Swing редко работает хорошо, если вообще работает. Если вы хотите установить настраиваемое поле для компонента, просто подклассифицируйте его (используйте прямое подклассирование или шаблон декоратора с композицией). Например:

public class IdButton extends JButton {
    private int id;

    public IdButton(String label, int id) {
        super(label);
        this id = id;
    }

    public int getId() {
        return id;
    }
}

Классы J/Button не имеют собственных методов set/getId.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...