добавление компонентов на панель в Java

#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).