Как обновить вторую форму - PullRequest
1 голос
/ 14 марта 2012

У меня есть две формы. Сначала определите номера кнопок с помощью jslider. Вторая форма для отображения кнопок в соответствии со значением jslider. Когда я нажимаю jbutton2, вторая форма показывает и отображает кнопки. Работает отлично. Однако я хочу создать jbutton, не нажимая jbutton2 в первой форме. Вместо этого, когда я меняю jslider, он должен создавать кнопки во второй форме во время выполнения, и как только я меняю jslider, он должен снова создать такое количество кнопок во второй форме и обновить число кнопок второй формы в соответствии со значением jslider. Я попытался revalidate () ;, repaint (); но они не работают, они не обновляют вторую форму. Итак, как я могу обновить вторую форму, когда jslider, который находится в первой форме, изменяется?

1 Ответ

1 голос
/ 31 марта 2012

На самом деле вы должны предоставить кусок кода, чтобы мы могли лучше его понять. Но в целом я думаю, что могу понять, что вы имеете в виду (если я не ошибаюсь).

В основном вам нужен менеджер макетов во второй форме. Вот пример кода, я надеюсь, что он может в целом удовлетворить ваши потребности.

Код для первой формы

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class FirstForm extends JFrame {
    JButton fbtn  = new JButton("Show F2");
    JSlider fslider = new JSlider(1, 10);
    SecondForm fsecond = new SecondForm();
    public FirstForm(){
        setSize(200,200);
        getContentPane().setLayout(new BorderLayout());
        getContentPane().add(fbtn,BorderLayout.NORTH);
        getContentPane().add(fslider,BorderLayout.CENTER);
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        fbtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                fsecond.setVisible(true);
            }
        });
        fslider.addChangeListener(new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent e) {
                fsecond.setBtnCount(fslider.getValue());
            }
        });
    }
    public static void main(String[] args) {
        // TODO code application logic here
        java.awt.EventQueue.invokeLater(new Runnable() {

            @Override
        public void run() {
                new FirstForm().setVisible(true);
            }
        });
    }
}

код для второй формы

import java.awt.Component;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JFrame;

public class SecondForm extends JFrame {
    Vector fbtns = new Vector();
    int fshowbtncount=1;
    GridBagConstraints gbc = new GridBagConstraints();
    public SecondForm(){
        setSize(200, 200);
        setLocation(201, 0);
        getContentPane().setLayout(new GridBagLayout());
        fbtns.add(new JButton("Button ".concat(String.valueOf(fbtns.size()+1))));
        invalidateForm();
    }
    private void invalidateForm(){
       gbc.fill = GridBagConstraints.VERTICAL;
       for (int i=0; i<fbtns.size(); i++) {
           getContentPane().remove((Component)fbtns.get(i));
       }
       int y=0;
       for (int i=0; i<fshowbtncount; i++) {
           gbc.gridx=0;
           gbc.gridy=y++;
           getContentPane().add((Component)fbtns.get(i),gbc);
       }
       pack();
       invalidate();
    }
    public void setBtnCount(int cnt){
      if (cnt>=0 && cnt!=fshowbtncount) {
          fshowbtncount = cnt;
          while (fbtns.size()<cnt) {
            fbtns.add(new JButton("Button ".concat(String.valueOf(fbtns.size()+1))));    
          }
          invalidateForm();
      }  
    }
}

Надеюсь, это поможет вам.

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