Компоненты Swing-апплета невидимы, пока не - PullRequest
2 голосов
/ 18 февраля 2011

Я пытаюсь создать апплет с простым экраном входа в систему, если я использую обычные компоненты, он работает нормально, но если я использую компоненты Swing, объект не будет отображаться, пока на него не нажмут. Я бы использовал обычные компоненты, но мне нужно поле для маскированного пароля (если есть не свинговая версия, пожалуйста, дайте мне знать).

Я пытаюсь получить вертикальное размещение в верхнем левом углу.

public class RdpApplet extends JApplet {
   JButton Connect;
   JTextField Username;
   JPasswordField Password;
   JLabel UsernameLabel;
   JLabel PasswordLabel;

   //(Snip)

   public void paint(Graphics g){
   }
   public void start(){
   }
   public void stop(){
   }
   public void init(){
       SwingUtilities.invokeLater(new Runnable() {
        public void run() {
           JPanel panel = new JPanel (new GridBagLayout());
           GridBagConstraints gbc = new GridBagConstraints();
           gbc.insets = new Insets(2,5,1,1);
           gbc.weightx = 1.0;
           gbc.anchor = GridBagConstraints.WEST;
           gbc.gridwidth = GridBagConstraints.REMAINDER;

           UsernameLabel = new JLabel("Username:");
           panel.add(UsernameLabel,gbc);

           Username = new JTextField(15);
           panel.add(Username,gbc);

           PasswordLabel = new JLabel("Password:");
           panel.add(PasswordLabel,gbc);

           Password = new JPasswordField(15);
           panel.add(Password,gbc);

           Connect = new JButton("Connect");
           panel.add(Connect,gbc);
           gbc.weighty = 1.0;
           gbc.anchor = gbc.NORTHWEST;

           setLayout(new FlowLayout(FlowLayout.LEFT));
           add(panel);
           validate();
           panel.validate();
       }});
   }

   //(Snip)
}

Если я использую JButton, JTextField и JLabel, элементы не отображаются до тех пор, пока я с ними не взаимодействую (щелкните текстовое поле, наведите курсор мыши на кнопку, я не могу получить метку для отображения) и если я использую обычный версии я получаю уродливые серые фоны вокруг этикеток.

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

EDIT: Переход с апплета на JApplet не решил проблему.

EDIT2: добавлены другие методы.

EDIT3: Курсор теперь запускается в поле имени пользователя, но все остается невидимым, пока с ним не взаимодействуют. Обновлен код со всеми последними предложениями.

Ответы [ 4 ]

2 голосов
/ 19 февраля 2011

Вы перезаписываете метод paint, ничего не делая там. Это приводит к тому, что потомки апплета вообще не рисуются.

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

В вашем апплете, похоже, вам вообще не нужен метод рисования, просто удалите его.

2 голосов
/ 18 февраля 2011
public class RdpApplet extends Applet {
   JButton Connect;

Не смешивайте Swing с AWT.Используйте JApplet.

1 голос
/ 18 февраля 2011

Applet.init() не вызывается на EDT.Таким образом, вам нужно обернуть конструкцию компонентов Swing в SwingUtilities.invokeLater(), чтобы убедиться, что они работают на EDT.

public void init() {
    SwingUtilities.invokeLater(new Runnable() {
            public void run() {
            // Init code goes here
        }});
}
1 голос
/ 18 февраля 2011

Возможно, когда вы все добавите, добавьте туда validate();?

http://download.oracle.com/javase/6/docs/api/java/awt/Container.html#validate%28%29

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...