2012-03-13 6 views
1

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

+0

Дубликат http://stackoverflow.com/questions/9695833/java-refreshing-second-form –

ответ

1

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

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

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

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(); 
     } 
    } 
} 

Надежда это может помочь вам.

Смежные вопросы