#java #swing
#java #swing
Вопрос:
Мой код выглядит следующим образом:
private void okJButtonActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
srcLang=(srcLangJComboBox.getSelectedItem().toString());
targLang=(targLangJComboBox.getSelectedItem().toString());
infoNew.this.setVisible(false);
}
/**
* @param args the command line arguments
*/
public static String[] newButton() {
/* Set the Nimbus look and feel */
//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
/* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
* For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
*/
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(infoNew.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(infoNew.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(infoNew.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(infoNew.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//</editor-fold>
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new infoNew().setVisible(true);
}
});
System.out.println(srcLang);
return new String[]{srcLang,targLang};
}
Есть две функции, нижняя из которых вызывает верхнюю функцию в виде кнопки jframe верхняя функция получает значение двух переменных, которые являются общедоступными по своей природе, но значения, присвоенные им здесь, недоступны в нижней функции.
Значение, присвоенное переменным srcLang и tarLang в функции okJButtonActionPerformed(java.awt.event.ActionEvent evt)
недоступен в
функция newButton().
PS переменные srcLang и targLang объявлены как общедоступные статические
Комментарии:
1. В чем ваш вопрос?
2. Очень, очень, очень запутанный. Пожалуйста, добавьте больше «мяса» к вашему вопросу.
3. Я все еще не вижу, где «нижний вызывает верхний». Где в статической функции вызывается метод экземпляра okJButtonActionPerformed?
4. Пожалуйста, ознакомьтесь с моим обновленным ответом с другим обходным путем, если метод должен оставаться статическим.
Ответ №1:
Не используйте статические методы.
Вместо этого вам нужно создать класс, содержащий ваш код, чтобы вы могли определять instance
переменные. Затем, как только вы создадите переменную экземпляра, вы сможете получить доступ к переменной из любого метода вашего класса.
Возможно, начните с ButtonDemo
примера кода из учебника Swing о том, как использовать кнопки. Показано, как создать панель с переменными экземпляра для кнопок. Затем к кнопкам можно получить доступ с помощью других методов класса.
Ответ №2:
Ответ на этот пост (хотя формального вопроса нет) заключается в том, что метод newButton()
является статическим, а переменные srcLang
и tarLang
являются переменными экземпляра.
Обновленный ответ: (не лучшая практика)
static
Метод может быть вызван либо из instance
метода, либо static
из метода. instance
Метод требует instance
вызова класса. Что вы можете сделать, так это передать копию используемого вами экземпляра (вы можете использовать this
ключевое слово, если работаете в методе экземпляра) и вызвать метод экземпляра из статического метода, однако я бы посоветовал вам попытаться создать метод static
, как я описываю здесь:
У вас есть еще один вариант, о котором я подумал: вы можете преобразовать переменные экземпляра в okJButtonActionPerformed
функции static
, и это должно быть хорошо.
private static void okJButtonActionPerformed(java.awt.event.ActionEvent evt) {
Более старая часть ответа: (лучшая практика)
Статические методы не требуют запуска экземпляра класса, тогда как переменные экземпляра требуют формального объявления объекта.
Чтобы исправить это, вы могли бы попробовать и удалить static
перед newButton()
методом:
Изменить: public static String[] newButton() {
Для: public String[] newButton() {
На данный момент, не просматривая больше вашего кода (потому что нет основного метода, и я не знаю, откуда вызываются эти методы), это примерно столько информации, сколько я могу предоставить. Если вы хотите получить более подробный ответ, пожалуйста, опубликуйте больше примеров кода.
Комментарии:
1. Я вызываю эту функцию из другой статической функции, поэтому я не могу удалить static.
2. Можете ли вы показать статическую функцию, из которой вы ее вызываете?
3.
I am calling this function from another static function so I cannot remove static.
— это ваша проблема, вы НЕ должны использовать статические методы везде в своем коде. Прочитайте руководство для лучшей структурированной программы. В руководстве есть рабочий пример. Учитесь, используя рабочий код вместо того, чтобы писать свой собственный код!4. Я вызываю его отсюда private void newJButtonActionPerformed(java.awt.event . ActionEvent evt) я удалил ключевое слово static, как было предложено вами, затем в этом методе я получаю сообщение об ошибке: нестатический метод newButton() нельзя ссылаться из статического контекста
5. Смогли ли вы увидеть мой обновленный ответ о том, чтобы сделать переменные статическими, к которым вы не смогли получить доступ? Если вы не хотите делать его статическим, вы можете передать экземпляр объекта, с которым вы работаете, в статический метод и вызвать переменные. Имеет ли это смысл?