• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Actionlistener В Actionlistener

  • Автор темы denis90
  • Дата начала
Статус
Закрыто для дальнейших ответов.
D

denis90

Итак опыт работы с Явой 2 дня.
Делаю человеку курсовую работу. Нужно смоделировать работу аэропорта.
GUI на Swinge

Немного контекста: есть панелька на которой расположены кнопки разных действий (Зарегистрировать рейс, разрешить посадку, разрешить взлёт и т.д). При нажатии на кнопку для примера "Зарегистрировать рейс" ниже должна появиться формочка для ввода данных и кнопка "Добавить".

Нижу привожу код обработчика события нажатия на кнопку "Зарегистрировать рейс"

C++:
btnRegister.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
GridBagLayout gbLayout = (GridBagLayout) inputDataPanel.getLayout();
inputDataPanel.removeAll();
GridBagConstraints c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 0;

JLabel label1 = new JLabel("Flight ID: ");
gbLayout.setConstraints(label1, c);
inputDataPanel.add(label1);

c.gridx = 1;
final JTextField txtFlightId = new JTextField(10);
gbLayout.setConstraints(txtFlightId, c);
inputDataPanel.add(txtFlightId);

c.gridx = 0;
c.gridy = 1;

JLabel label2 = new JLabel("Plain Model: ");
gbLayout.setConstraints(label2, c);
inputDataPanel.add(label2);

c.gridx = 1;

final JTextField txtPlaneModel = new JTextField(10);
gbLayout.setConstraints(txtPlaneModel, c);
inputDataPanel.add(txtPlaneModel);

c.gridx = 0;
c.gridy = 2;

JLabel label3 = new JLabel("Destination: ");
gbLayout.setConstraints(label3, c);
inputDataPanel.add(label3);

c.gridx = 1;

final JTextField txtOrigin = new JTextField(10);
gbLayout.setConstraints(txtOrigin, c);
inputDataPanel.add(txtOrigin);

c.gridx = 0;
c.gridy = 3;
c.gridwidth = 2;
c.gridheight = 1;
c.anchor = GridBagConstraints.CENTER;
c.insets = new Insets(15,0,0,0);

JButton btnAddPlane = new JButton("Add Plane");
gbLayout.setConstraints(btnAddPlane, c);
btnAddPlane.setFocusable(false);


c.gridx = 0;
c.gridy = 4;

final JLabel lblError = new JLabel(" ");
gbLayout.setConstraints(lblError, c);
inputDataPanel.add(lblError);


btnAddPlane.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){

String flightID = txtFlightId.getText();
if (flightID.isEmpty()){
lblError.setText("<html><span style=\"color:red\">Error: Flight ID field is empty!</span></html>");
return;
}
String planeModel = txtPlaneModel.getText();
if(planeModel.isEmpty()){
lblError.setText("<html><span style=\"color:red\">Error: Plane Model field is empty!</span></html>");
return;
}
String originCity = txtOrigin.getText();
if (originCity.isEmpty()){
lblError.setText("<html><span style=\"color:red\">Error: Destination field is empty!</span></html>");
return;
}

if(!atc.isRegistered(flightID)){
atc.addFlight(new Plane(flightID,planeModel,originCity));
lblError.setText(flightID + " added!");
}
else{
lblError.setText("<html><span style=\"color:red\">Error: " + flightID + " is registered!</span></html>");
}

}
});


inputDataPanel.add(btnAddPlane);

inputDataPanel.revalidate();
}
});


Внутри обработчика создается формочка, кнопка "Добавить" и опять таки обработчик для кнопки "Добавить".

Вопрос: Насколько мои действия адекватны?
Как можно по другому? Как нужно?
 
L

LuMee

Форма регистрации рейса - это, как понимаю, inputDataPanel?
В общем, не вижу смысла каждый раз пересоздавать все ее содержимое при нажатии кнопки "Зарегистрировать". По идее, эту панель нужно создать один раз (например, в конструкторе родительской формы), а потом просто делать видимой при необходимости (когда жмется кнопка "Зарегистрировать" или что-то еще) и снова невидимой, когда она больше не нужна.
 
D

denis90

Форма регистрации рейса - это, как понимаю, inputDataPanel?
В общем, не вижу смысла каждый раз пересоздавать все ее содержимое при нажатии кнопки "Зарегистрировать". По идее, эту панель нужно создать один раз (например, в конструкторе родительской формы), а потом просто делать видимой при необходимости (когда жмется кнопка "Зарегистрировать" или что-то еще) и снова невидимой, когда она больше не нужна.


При нажатии на другие кнопки контроля, такие как "Запрос посадки", "Взлет" и так далее на этой же панели должны создаваться
новые формочки. Посему динамически генерю их.


Или Вы просто предлагаете создать сразу все панели с формочками и по мере нажатия на кнопки управления отрисовывать соответствующую?
 
L

LuMee

Или Вы просто предлагаете создать сразу все панели с формочками и по мере нажатия на кнопки управления отрисовывать соответствующую?
Именно. Можно эти всевозможные формочки создать на отдельных панелях, которые потом просто класть в inputDataPanel и показывать таким образом пользователю. В любом случае, это:
а) резко упрощает код обработчика btnRegister и прочих
б) избавляет приложение от необходимости по многу раз выполнять один и тот же код.
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!