добавление компонентов в апплет - PullRequest
0 голосов
/ 12 июля 2011

Я делаю апплет и, как часть своего апплета, я хочу, чтобы это произошло: когда пользователь нажимает «ОК», старые компоненты (некоторые переключатели) удаляются, и добавляется новый JPanel с кучейтекстовых полей.

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

Вот мой код:

// imports omitted

public class Class extends Applet implements ActionListener 
{
  Button okButton;  
  CheckboxGroup radioGroup; 
  Checkbox radio1; 
  Checkbox radio2; 
  Checkbox radio3;
  JLabel j;

  public void init()  
  { 
    setLayout(new FlowLayout()); 
    okButton = new Button("OK"); 
    j = new JLabel("hello");
    radioGroup = new CheckboxGroup(); 
    radio1 = new Checkbox("Red", radioGroup,false); 
    radio2 = new Checkbox("Blue", radioGroup,true); 
    radio3 = new Checkbox("Green", radioGroup,false); 
    add(okButton); 
    add(radio1); 
    add(radio2); 
    add(radio3);
    okButton.addActionListener(this); 
  }

  public void repaint(Graphics g) 
  { 
    if (radio1.getState()) add(j); 
  }

  public void actionPerformed(ActionEvent evt)  
  { 
    if (evt.getSource() == okButton) repaint();
  } 
}

Что я делаю не так?

Ответы [ 5 ]

2 голосов
/ 12 июля 2011

Вы не должны переопределять метод repaint и, конечно, не добавлять компонент в этот метод.Просто удалите переключатели из апплета (используя метод remove) и добавьте метку в апплет в методе actionPerformed, так же, как вы добавляете их в метод init.

Возможно, вам придется позвонить validate после.

0 голосов
/ 13 июля 2011

Когда пользователь нажимает «ОК», старые компоненты (некоторые переключатели) удаляются, и добавляется новый JPanel с кучей текстовых полей.

Используйте CardLayout , как показано здесь . Он идеально подходит для таких ситуаций.

Game view High Scores view

0 голосов
/ 13 июля 2011

Что я делаю не так?

Ваш repaint(Graphics) метод - это не тот метод, который вы вызываете в методе actionPerformed.

Кроме того, repaint - довольно плохое имя для метода, который добавляет новый компонент.

 public void swapComponents() 
 { 
     if (radio1.getState()) {
        remove(radio1);
        remove(radio2);
        remove(radio3);
        add(j);
        validate();
     }
 }

 public void actionPerformed(ActionEvent evt)  
 { 
     if (evt.getSource() == okButton) {
        swapComponents();
     }
 }
0 голосов
/ 13 июля 2011

вы могли бы сделать что-то вроде

JFrame fr= new JFrame();                    // global variables
JPanel panelToBeAdded = new JPanel();
JPanel initialPanel = new JPanel();
JTextField fieldToBeAdded = new JTextField(); 
panelToBeAdded.setPreferredSize( new Dimension(400,400));
initialPanel.setPreferredSize( new Dimension(400,400));
initialPanel.setVisible(true);
fr.add(initialPanel);
fr.setVisible(true);
fr.pack();


public void actionPerformed(ActionEvent ae) {
    initialPanel.setVisible(false);
    //radiobuttons.setVisible(false);---> hide the radio buttons
    panelToBeAddedd.add(fieldToBeAddedd);
    panelToBeAddedd.setVisible(true);
    fr.add(panelToBeAddedd);

}

public void repaint( Graphics g ) {
  // do something
} 
0 голосов
/ 12 июля 2011

Добавьте компоненты и затем вызовите validate() вашего контейнера.В этом случае yourApplet.validate().Это приведет к перерисовке и перестановке всех элементов.

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