Java JFrame:как рекурсивно выполнять синтаксический анализ через компоненты (т.е.при использовании JScrollPane)
-
21-08-2019 - |
Вопрос
Я использую Табличное описание для моего графического интерфейса swing.Изначально только некоторые базовые метки, кнопки и текстовые поля, где это необходимо, к которым я мог бы позже получить доступ с помощью:
public Component getComponent(String componentName) {
return getComponent(componentName, this.frame.getContentPane());
}
private Component getComponent(String componentName, Component component) {
Component found = null;
if (component.getName() != null && component.getName().equals(componentName)) {
found = component;
} else {
for (Component child : ((Container) component).getComponents()) {
found = getComponent(componentName, child);
if (found != null)
break;
}
}
return found;
}
К сожалению, я столкнулся с проблемами после использования using JScrollPane
для поддержки прокрутки в JTextArea
и JTable, которые я сделал с помощью:
JTextArea ta = new JTextArea();
ta.setName("fooburg");
JScrollPane scr = new JScrollPane(ta);
frame.getContentPane().add(scr, "1, 1"); // EDIT: changed, tkx bruno
После предложений я смог получить доступ через getComponent("fooburg")
желаемый компонент (приведенная выше версия является окончательной).Большое спасибо Дэну и Бруно!
Решение
@бруно прав - вам нужно добавить текстовую панель в панель содержимого фрейма.
Слегка ОТ:Если вы обычно хотите получить доступ к каждому компоненту в иерархии, вам нужно что-то рекурсивное - ваш текущий метод будет печатать только непосредственные дочерние имена:
void printNames(Component component) {
System.out.println(component.getName());
for (Component child : component.getComponents()) {
printNames(child);
}
}
void printFrameNamesComponents(JFrame frame) {
printNames(frame.getContentPane());
}
(не проверял, но что-то вроде этого.)
Другие советы
Вместо этого вам нужно добавить дочерний элемент в панель содержимого JFrame:
frame.getContentPane().add(comp);
Если вы добавите свой новый компонент непосредственно в JFrame, ваш приведенный выше код никогда не попадет к нему, потому что вы перечисляете только компоненты в разделе frame.getContentPane()
.