Апплет работает, а вот свинг-компоненты не появляются!

Итак, я создаю этот апплет, в котором я хочу иметь полноценные компоненты Swing. Я просмотрел все документы, я сделал апплет, и я могу заставить что-то отображаться в нем, если я переопределю метод update(Graphics g), но простое добавление компонентов в contentPane, похоже, не делает этого! Что я делаю неправильно?

import javax.swing.JApplet;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;

import org.steephill.kindlab.LabApp;

import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;

public class ClientApplet extends JApplet {

    ClientTreePanel treePanel;

    public void destroy() {
        // Put your code here
    }

    public String getAppletInfo() {
        return "KindLab Client Applet";
    }

    public void init() {

        try {
            LabApp.initializeHibernate();
            if (!LabApp.authenticate("user", "pass")) {

                JOptionPane.showMessageDialog(this, "authentication failed");
            } else {

                try {
                    javax.swing.SwingUtilities.invokeAndWait(new Runnable() {
                        public void run() {
                            createGUI();
                        }
                    });
                } catch (Exception e) {
                    System.err.println("createGUI didn't successfully complete");
                }

                    }
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(this, "error intitializing applet\r\n" + ex.getMessage());
        }
    }

    protected void createGUI() {

        treePanel = new ClientTreePanel();
        treePanel.setVisible(true);
        getContentPane().add(new JLabel("TESTING!"));
        getContentPane().add(treePanel);

        System.out.println("THIS DOES RUN");
    }

    public void start() {
        // Put your code here
    }

    public void stop() {
        // Put your code here
    }

    /*  if I uncomment this method, it WORKS and I get "Hello World!"
    public void paint(Graphics g) {
        super.paint(g);
        g.drawString("Hello World!",25,25);
    }
     */
}

Пожалуйста помоги! И спасибо! Джошуа


person Joshua    schedule 11.06.2009    source источник


Ответы (3)


Я вижу несколько проблем с вашим кодом здесь:

  1. вы не вызываете pack() в конце настройки графического интерфейса
  2. вы добавляете несколько компонентов на панель содержимого апплета, но без каких-либо ограничений макета. Панель содержимого по умолчанию обычно представляет собой BorderLayout, поэтому добавление двух компонентов без каких-либо ограничений, вероятно, только поместит ClientTreePanel наверх.

Поскольку вы не вызываете pack(), макет не будет рассчитан, что в вашем случае, вероятно, приведет к тому, что ничего не будет отображаться (вы не предоставили код для ClientTreePanel).

person boxofrats    schedule 11.06.2009
comment
Так как нет ни pack(), ни setLocationRelativeTo(null), он будет отображаться как очень маленькое окно в верхнем левом углу экрана. Его очень легко пропустить, если вы не ищете его там. - person Michael Myers; 11.06.2009
comment
На самом деле, я беру свои слова обратно — я думал о настольных приложениях. Я не знаю, что будет делать апплет. - person Michael Myers; 11.06.2009
comment
В JApplet нет метода pack() или setLocationRelativeTo. Он обрабатывается HTML-кодом, в который он встроен. Поэтому я не знаю, почему он вообще не отображается. А вот насчет пункта №2 вы правы. - person Michael Myers; 11.06.2009

Вы не должны обязаны вызывать pack() - макет будет рассчитан, когда компонент впервые реализуется, что происходит, когда вы вызываете пакет, а также когда компонент впервые становится видимым.

«Добавление компонентов без ограничений» находится на правильном пути — вы должны изменить код, добавляющий компоненты на панель содержимого, на:

getContentPane().add(new JLabel("TESTING!"), BorderLayout.NORTH);
getContentPane().add(treePanel, BorderLayout.CENTER);

Другая проблема заключается в том, почему ваш компонент ClientTreePanel не отображается - это может быть проблема с размером, макетом или другими причинами - но без просмотра этого кода это будут просто догадки.

person Nate    schedule 11.06.2009
comment
+1 только что протестировал ваше решение локально, и оно решило проблему для меня. - person Pool; 12.06.2009

Попробуйте удалить свой метод рисования, и вы увидите, что он работает. Проблема может заключаться в том, что, поскольку у вас есть метод рисования, все изменения выполняются через него. Это странно, потому что он отображает JButton.

person carmen    schedule 22.05.2011