#java #components #add #japplet
#java #Компоненты #Добавить #japplet
Вопрос:
Я создаю апплет, который состоит из класса, расширяющего JApplet, с панелью меню и классом, расширяющим JPanel.(Таким образом, в апплете отображаются панель меню и JPanel).
В этом классе я добавляю и удаляю некоторые текстовые поля в JPanel. Все это отлично работает. Вот тут-то и возникает сложность: это работает только в первый раз. Когда я добавляю несколько новых текстовых полей в JPanel, они добавляются и отображаются в JPanel, но строка меню в JFrame перестает работать.
Поскольку код слишком обширный, я опубликую только его части.
Вот код, в котором я добавляю JPanel в JApplet:
public class Simulator extends JApplet implements ItemListener, ActionListener {
Container pane = getContentPane();
canvas = new DrawCanvas();
pane.add(canvas, BorderLayout.LINE_END);
}
Вот код JPanel:
class DrawCanvas extends JPanel {
public void paintComponent(Graphics g) {
if(textfield != null)
remove(textfield);
textfield = new JTextField();
this.add(textfield);
}
}
Это работает в первый раз (когда ничего не удаляется), но во второй раз панель меню перестает работать.
Когда я опускаю строку this.add(текстовое поле);, панель меню продолжает работать.
Комментарии:
1. Что вы подразумеваете под «строка меню перестает работать»? Вы все еще можете щелкнуть некоторые элементы? Возможно, что подменю отображаются за вашим недавно добавленным текстовым полем…
2. Вы не должны добавлять и удалять текстовые поля в
paintComponent()
.paintComponent
предназначен только для покраски компонента!3. @Jeroen Вы все еще можете открыть меню, но подменю не отображаются. Присмотревшись повнимательнее, я заметил маленькую синюю линию, которая появляется только при открытии меню, так что я предполагаю, что они действительно отображаются за чем-то другим. Но текстовые поля не мешают работе меню. Вот картинка: ссылка
Ответ №1:
Однажды у меня были похожие проблемы с всплывающими меню, нарисованными за другими компонентами. Попробуйте вызвать static JPopupMenu.setDefaultLightWeightPopupEnabled(false);
или setLightWeightPopupEnabled
в вашем конкретном подменю. Это приведет к появлению (всех) всплывающих меню (т. Е. подменю) для компонентов большого веса, у которых есть собственный одноранговый узел.
Комментарии:
1. Я вызвал
(menu.getPopupMenu()).setLightWeightPopupEnabled(false);
, который все исправил. Спасибо!
Ответ №2:
Я полагаю, что вы столкнулись с проблемами с потоковой обработкой. Добавление и удаление J-компонентов во время рисования может привести к сбоям в EDT (который в первую очередь вызывает метод paint).