Встроить JPanel в JApplet (всегда сверху)

У меня есть гибридное приложение Swing, которое можно запускать как апплет или Java-приложение со следующей структурой:

public class Gui extends JApplet {

    public void init() {...}

    public void paint(Graphics g) {
       ...
       g.drawImage(image, 0, 0, this);
    }

    public static void main(String args[]) {

       JFrame frame = new JFrame();
       JDialog dialog = new JDialog(frame);

       Gui gui = new Gui();
       gui.init();
       gui.start();

       dialog.add("Center", gui);

       ...
    }

}

Весь графический интерфейс состоит из одной области рисования, которая постоянно обновляется. Я хотел бы встроить панель, которая всегда находится сверху и не зависит от основного процесса рисования.

Я попытался использовать JLayeredPane и добавить его между JDialog и JApplet, но Japplet нельзя добавить в панель, потому что это контейнер верхнего уровня.

Я также пытался реализовать это со стеклянным стеклом, но безуспешно.

Есть ли решение без рефакторинга, так как структура должна быть сохранена, насколько это возможно.


person user1703554    schedule 12.06.2013    source источник


Ответы (1)


Не переопределяйте paint() контейнера верхнего уровня, такого как JApplet или JFrame. Пользовательское рисование выполняется путем переопределения метода paintComponent() панели JPanel (или JComponent). Затем вы добавляете панель в рамку.

dialog.add("Center", gui);

Это не способ добавить компонент на панель. Прочтите Container API, чтобы найти правильный метод add(...) для использования. Также не следует жестко задавать строковые значения. Каждый менеджер компоновки содержит переменные, которые можно использовать в качестве значений ограничений.

Я хотел бы встроить панель, которая всегда находится сверху и не зависит от основного процесса рисования.

Не уверен, что это имеет смысл. Если панель всегда сверху, то она закроет картину.

Я пытался использовать JLayeredPane

Звучит как правильный подход. Вы добавляете многоуровневую панель во фрейм или апплет. Затем у вас может быть панель для рисования фона и еще одна прозрачная панель сверху. Прочтите учебное пособие Swing по Использование многоуровневых панелей в качестве рабочего примера.

person camickr    schedule 12.06.2013
comment
Итак, наконец, мне нужно перенести код paint() на новую панель и переопределить paintComponent()? Я знаю, как это делается плохо, но есть так много зависимостей, что я хотел бы избежать этого :( - person user1703554; 12.06.2013
comment
@AndrewThompson заметил еще несколько опечаток и попытался прояснить этот момент. - person camickr; 12.06.2013