2013-03-20 3 views
-1

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

Я использую логическое значение для идентификации нажатия кнопки.

PDFButton.addSelectionListener(new SelectionAdapter() { 
    public void widgetSelected(SelectionEvent e) { 
     buildArray(true); 
    } 
}); 

PlotButton.addSelectionListener(new SelectionAdapter() { 
    public void widgetSelected(SelectionEvent e) { 
     buildArray(false); 
    } 
}); 

public void buildArray(boolean buttonId) { 
    get indexs etc... 
    if(true) { 
     PDF.getInstance.buildArray(index); 
    } 
    else { 
     Plot.getInstance.buildArray(index); 
    } 
} 

Возможно, это лучший способ сделать это?

EDIT Typo in button snippet ined. Есть две кнопки, а не одна. То, что я пытаюсь сделать, это установить условие в логике IF, поэтому я знаю, какая кнопка была нажата для активации метода buildArray.

public void buildArray() { 
    get indexs, mode code..... 
    if**(button press equals PDFButton)** { 
     PDF.getInstance.buildArray(index); 
    } 
    else { 
     Plot.getInstance.buildArray(index); 
    } 
} 

Я знаю, что одним из способов было бы создать отдельный метод, похожий на buildArray. Затем каждая кнопка будет выполнять свой собственный метод.

PDFButton.addSelectionListener(new SelectionAdapter() { 
    public void widgetSelected(SelectionEvent e) { 
     PDFbuildArray(true); 
    } 
}); 

PlotButton.addSelectionListener(new SelectionAdapter() { 
    public void widgetSelected(SelectionEvent e) { 
     PlotbuildArray(false); 
    } 
}); 

Но я хочу консолидировать как код мусора, насколько это возможно.

+2

'if (true)' всегда 'истина', вы имели в виду это? – Maroun

+1

Что значит «какая кнопка пользователь нажимает»? Вы подключили слушателей выбора к кнопке * same * ... Есть ли где-то вторая кнопка? –

+2

Это не худший способ сделать это возможным; то есть, если ваш код сделал логический смысл, а это не –

ответ

0

Я закончил с использованием Action Event getSource(). GetText(). Таким образом, метод оказался таким.

ublic void getSelectedTableData(SelectionEvent e) { 
    int[] row = viewer.getTable().getSelectionIndices(); 
    Arrays.sort(row); 
    if (row.length > 0) { 
    for(int i = row.length-1; i >= 0; i--){ 
     if(((Button) e.getSource()).getText() == "Plotting") 
      AplotPlotDataModel.getInstance().buildPlotArray(row[i]); 
     else { 
      AplotPDFDataModel.getInstance().buildArray(row[i]); 
     } 
    } 
    } 
} 
+0

Я думаю, что ваше предыдущее решение было превосходным. Вы сравниваете строки с '==', что вы не хотите делать. Вы также не хотите сравнивать строки, поскольку это будет медленным. Ваш метод 'boolean' из предыдущего был прекрасным решением, или вы могли посмотреть на кнопку' ID'. –

+0

Это нехороший способ обработки событий. Добавление отдельных слушателей к каждой кнопке сделает ваше приложение быстрее. Вам не нужно сравнивать кнопки с кнопками или текст кнопки. –

-1

Вы читали учебник Swing? В нем есть примеры того, как это сделать, обычно с помощью setActionCommand() и getActionCommand() IIRC.

Кроме того, в вашем коде есть как минимум две ошибки.

  • Во-первых, ваш текущий код никогда не устанавливает значение массива в значение false, поэтому при каждом нажатии кнопки будут выполняться все ранее нажатые кнопки. Если это не то, что вы хотите ...
  • Во-вторых, точно так же, как и первый, если кнопки нажимаются слишком быстро, нажатие второй кнопки может выполняться до того, как первая кнопка нажимает код, изменив состояние на false. Если вы не добавите синхронизированный блок, будет состояние синхронизации, которое будет вести себя так, как описано в моей первой палитре.
+1

Я не знаю, как работает Swing, но в SWT нет проблем с синхронизацией, как то, что вы описываете. Ваш код пользовательского интерфейса работает в потоке пользовательского интерфейса. –

+0

@atk не используя Swing. Код написан в SWT. – jkteater

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