Управление компонентом из другой формы
public void updateList() {
System.out.println(jListName.getSelectedValue());
System.out.println("Ok");
}
если запустить из этой же формы:
updateList();
то работает нормально.
если запустить из другого диалога:
FrameWorker.getInstance().updateList();
то для jListName.getSelectedValue()
пушет null, т.е. не находит
как можно решить проблему?
P.S. Что ты понимаешь под "формой"? JFrame?
Полный код FrameWorker в студию.
Под формой да понимаю JFrame.
Полный код в студию не получится там куча всего!
Небольшие куски, пожалуйста:
[highlight=java]
public class FrameWorker extends javax.swing.JInternalFrame {
public static FrameWorker Instance;
private int hist= -2;
private String[][] list;
private SelectionL sel = new SelectionL();
class SelectionL implements ListSelectionListener {
public void valueChanged(ListSelectionEvent lse) {
int selected = ((JList)lse.getSource()).getSelectedIndex();
if (selected != hist) {
inputWorkerData(list[0][jListName.getSelectedIndex()]);
hist = selected;
}
}
}
// конструктор
public FrameWorker() {
initComponents();
jListName.addListSelectionListener(sel); //подключение события изменения выделенного элемета в JList
try {
// возвращает массив с серверной части.
list = Connection.getInstance().connect.setList("0");
}
catch (Exception ex) {
System.out.println("Ошибка создания списка сотрудников");
}
KolWorker();
}
// для обращения к FrameWorker
public static FrameWorker getInstance() {
if ( Instance == null )
Instance = new FrameWorker();
return Instance;
}
// Возвращает из двумерного массива массив имен.
private String[] ListName(String[][] ls, String t) {
try {
int count = Connection.getInstance().connect.Count2("Worker", t);
// формирование одномерного массива ФИО сотрудников
if (count == 0) {
isZero();
isEnabled(false);
jButton19.setEnabled(false);
return new String[0];
}
else {
String[] arr = new String[count];
for (int i=0; i<=count-1; i++) {
arr = ls[1];
}
return arr;
}
} catch(Exception ex) {
System.out.println("Ошибка Возвращает из двумерного массива массив имен");
return new String[0];}
}
// инициализация списка сотрудников
public void InitList() {
jListName.setListData(ListName(list, "0"));
jListName.setSelectedIndex(0);
}
// инициализация списка сотрудников после добавление сотрудника
public void updateList() {
try {
//list = Connection.getInstance().connect.setList();
//jListName.clearSelection();
//jListName.setListData(ListName(list));
//jListName.setSelectedIndex(1);
System.out.println(jListName.getSelectedValue());
System.out.println("Ok");
}
catch (Exception ex) {
System.out.println("Ошибка создания списка сотрудников");
}
//jListName.setSelectedIndex(0);
}
[/highlight]
Поясню по-подробнее проблему:
создаю JInternalFrame, на ней находится JList (список сотрудников). Нажимаю кнопку добавить сотрдника - открывается модальный диалог с вводом информации о сотруднике.
После ввода информации нажимаю на кнопку добавить на диалоге - вот здесь нужно обновить JList на JInternalFrame.
Для тестирования всего этого я создал вот ту функцию updateList(), из которой не могу даже вывести выделенный элемент не говоря уже об обновлении всего листа.
Мало того, что ты их перехватываешь на самом высоком уровне иерархии (что в принципе очень плохо!),
так ты еще и отбрасываешь те данные, на основании которых ты мог бы найти причину ошибки.
1)Выводить, кстати, было бы удобней с помошью спец. средств логирования (вроде Log4j), тогда бы была возможность поменяв строчку в конфиге сделать вывод не на консоль, а в файл, изменять уровень подробности логов и прочее.
2)Перехватывай только checked exceptions, которые объявляют используемые тобой методы, после чего выводи в логи полный стектрейс,
и опционально текущее состояние интересующих тебя объектов.
3) Отладчиком не пробовал пройтись по этому методу? Поставить брекпоинты перед тем, как у тебя выдается неверный результат, и посмотреть значения переменных в этот момент времени.
Там в том числе интересные приемы работы с исключениями рассмотрены.