2016-05-07 5 views
0

Для некоторых может показаться странным, но я постараюсь поставить свой вопрос наилучшим образом. Я работаю с jdbc и gui. В основном я хочу отображать (в формате кнопок) конкретные данные, полученные из моей базы данных sql. Я мог правильно получить данные и поместить их в свой набор кнопок в качестве их имен. Другими словами, у меня есть ArrayList кнопок с разными именами/текстами, полученными из моей базы данных. Таким образом, мне действительно нужно сделать arraylist кнопок, поскольку данные динамически заполняются. Моя проблема в том, что я настолько смущен тем, как собираюсь создать actionListener для каждой кнопки. Каждый раз, когда нажимается каждая кнопка, она должна показывать значения, связанные с ее именем. Я не знаю, как я должен передавать хотя бы имена кнопок в свой метод actionListener (или обработчик событий Action). Если вы считаете это запутанным, вот код для моих кнопок.Как добавить actionListener к каждой кнопке

todayTaskButton.add(new JButton(taskForToday.get(i))); 
todayTaskButton.get(i).setPreferredSize(new Dimension(300,75)); 
todayTaskButton.get(i).setBackground(Color.GRAY); 
todayTaskButton.get(i).setFont(new Font("Century Gothic",Font.PLAIN,30)); 
todayTaskButton.get(i).setForeground(Color.WHITE); 
todayTaskButton.get(i).setFocusable(false); 

Большое спасибо

ответ

1

Честно Есть так много способов, вы можете достичь этого, проблема выбора правый для вас ...

Вы можете ...

Создать анонимный класс для каждой кнопки, каждый раз, когда ваш создавать их

todayTaskButton.get(i).addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent evt) { 
     //... 
    } 
}); 

В то время как это может работать, он может сделать код действительно грязным, вы по-прежнему нужен способ, чтобы отобразить действия обратно на кнопку в некоторых путь, который может быть сделан с помощью actionCommand собственности или используя source свойство, если вы не возражаете, перебирая список доступных кнопок

вы могли бы ...

Создать класс цели сборки, которая реализует ActionListener для каждая кнопка, которая, возможно, принимает некоторую ссылку на th е данные

todayTaskButton.get(i).addActionListener(new TodayActionListener(taskForToday.get(i))); 

Это немного больше внимания, как вы на самом деле не заботиться о кнопке, так как у вас есть «сегодня» значение для слушателя, так что все нормально повторен код может быть выделен в один класс, и вы бы просто передать в «переменной» элемента

вы могли бы ...

Воспользуйтесь всеми преимуществами Action API и сделать индивидуальные, автономные действия для каждой кнопки ...

public class TaskAction extends AbstractAction { 

    public TodayAction(String task) { 
     putValue(NAME, task); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     // Specific action for task 
    } 

} 

Тогда вы могли бы просто использовать

todayTaskButton.add(new JButton(new TaskAction(taskForToday.get(i)))); 

Хотя это похоже на предыдущий вариант, Action является самодостаточной единицей работы и имеет ряд свойств, которые JButton можно использовать для настройки сам. Action также может быть повторно использована для JMenuItem с и привязки клавиш, что делает его невероятно гибким

поближе посмотреть на How to Use Actions для получения более подробной информации

+0

Отличный ответ сэр! Огромное спасибо. Честно говоря, я все еще изучаю программирование java swing. Мы назначены для создания проекта, и это мой первый раз, чтобы создать его. Так спасибо гиду! –

+0

Сэр. Он полностью работает. Огромное спасибо. Я прочитаю больше о ссылке, которую вы предложили, чтобы понять это. Я просто скопировал ваш код, кстати ... Спасибо! –

+0

Может кто-нибудь хотел бы подчеркнуть причину понижения голосов? Как ответ не отвечает на вопрос о Ops? Каким образом (ыми) это могло бы быть улучшено? – MadProgrammer

2

Вам не нужно передать имя кнопки на ActionListener. Он автоматически обнаруживается. Вам просто нужно реализовать метод actionPerformed(ActionEvent) в вашем классе.

Затем добавьте слушателя к кнопке:

todayTaskButton.get(i).addActionListener(this); 

В вашем методе actionPerformed, вы можете сделать:

JButton b = (JButton) e.getSource(); 
String text = b.getText(); 
+0

сэр. Спасибо за ответ. У меня есть основная идея. Тем не менее, я привык к реализации actionListener таким образом, JButton.addActionListener (this :: methodName) {} –

+0

продолжение: затем реализация методаName в моем классе. Можете ли вы, пожалуйста, помочь мне, как я должен реализовать ваше предложение так, как я привык? Большое вам спасибо, сэр –