Java обновляет вторую форму - PullRequest
2 голосов
/ 14 марта 2012

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

Итак, как я могу обновить вторую форму, когда jslider, который находится в первой форме, изменяется?Пожалуйста, помогите .....

Изменить: Я использую Jframe по умолчанию NetBeans ....

/ * * Чтобы изменить этот шаблон, выберите Сервис |Шаблоны * и откройте шаблон в редакторе.* /

public class NewJFrame7 extends javax.swing.JFrame {


    /**
     * Creates new form NewJFrame7
     */
    public NewJFrame7() {
        initComponents();
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jSlider1 = new javax.swing.JSlider();
        jButton2 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jSlider1.setMajorTickSpacing(2);
        jSlider1.setMaximum(20);
        jSlider1.setMinimum(1);
        jSlider1.setPaintLabels(true);
        jSlider1.setPaintTicks(true);
        jSlider1.setToolTipText("");
        jSlider1.addChangeListener(new javax.swing.event.ChangeListener() {
            public void stateChanged(javax.swing.event.ChangeEvent evt) {
                jSlider1StateChanged(evt);
            }
        });

        jButton2.setText("jButton2");
        jButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton2ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(29, 29, 29)
                .addComponent(jSlider1, javax.swing.GroupLayout.PREFERRED_SIZE, 295, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(273, Short.MAX_VALUE))
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addGap(262, 262, 262)
                    .addComponent(jButton2)
                    .addContainerGap(262, Short.MAX_VALUE)))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(87, 87, 87)
                .addComponent(jSlider1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(168, Short.MAX_VALUE))
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addGap(138, 138, 138)
                    .addComponent(jButton2)
                    .addContainerGap(139, Short.MAX_VALUE)))
        );

        pack();
    }// </editor-fold>                        

    private void jSlider1StateChanged(javax.swing.event.ChangeEvent evt) {                                      
        // TODO add your handling code here:



    }                                     

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // TODO add your handling code here:
        form2 = true;
        new NewJFrame8().setVisible(true);
    }                                        

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /*
         * Set the Nimbus look and feel
         */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /*
         * If Nimbus (introduced in Java SE 6) is not available, stay with the
         * default look and feel. For details see
         * http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(NewJFrame7.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(NewJFrame7.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(NewJFrame7.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(NewJFrame7.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /*
         * Create and display the form
         */
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new NewJFrame7().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify                     
    private javax.swing.JButton jButton2;
    private javax.swing.JSlider jSlider1;
    // End of variables declaration                   
}

2.form

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;


public class NewJFrame8 extends javax.swing.JFrame {



    /**
     * Creates new form NewJFrame8
     */
    public NewJFrame8() {
        initComponents();

    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jPanel1 = new javax.swing.JPanel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(371, Short.MAX_VALUE)
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(19, 19, 19))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(48, 48, 48)
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(242, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>                        

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /*
         * Set the Nimbus look and feel
         */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /*
         * If Nimbus (introduced in Java SE 6) is not available, stay with the
         * default look and feel. For details see
         * http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(NewJFrame8.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(NewJFrame8.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(NewJFrame8.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(NewJFrame8.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /*
         * Create and display the form
         */
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new NewJFrame8().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify                     
    private javax.swing.JPanel jPanel1;
    // End of variables declaration                   
}

Ответы [ 3 ]

3 голосов
/ 14 марта 2012

Одно ограничение макета (BorderLayout.CENTER) для их размещения и один компонент для отображения в нем. (С извинениями перед Толкином.)

2 голосов
/ 14 марта 2012

Проверьте этот образец программы, это то, что вам нужно. revalidate() и repaint() - вот что работает для этого.

import java.awt.*;
import javax.swing.event.*;
import javax.swing.*;

public class SliderExample
{
    private JSlider slider;

    private static final int MIN_BUTTONS = 2;
    private static final int SOME_BUTTONS = 4;  
    private static final int MAX_BUTTONS = 6;

    private void createAndDisplayGUI()
    {
        ButtonPanel bp = new ButtonPanel();
        JFrame frame = new JFrame("JSlider Example : ");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationByPlatform(true);

        JPanel contentPane = new JPanel();
        slider = new JSlider(JSlider.HORIZONTAL, MIN_BUTTONS, MAX_BUTTONS
                                                            , SOME_BUTTONS);
        slider.addChangeListener(new ChangeListener()
        {
            public void stateChanged(ChangeEvent ce)
            {
                int value = (int) slider.getValue();
                ButtonPanel.panel.removeAll();
                for (int i = 0; i < value; i++)
                {
                    ButtonPanel.panel.add(new JButton("JButton " + i));
                }
                ButtonPanel.panel.revalidate();
                ButtonPanel.panel.repaint();
            }
        });

        contentPane.add(slider);
        frame.getContentPane().add(contentPane);
        frame.pack();
        frame.setVisible(true);

        frame.requestFocusInWindow();
    }

    public static void main(String... args)
    {
        Runnable runnable = new Runnable()
        {
            public void run()
            {
                new SliderExample().createAndDisplayGUI();
            }
        };
        SwingUtilities.invokeLater(runnable);
    }
}

class ButtonPanel extends JFrame
{
    public static JPanel panel;

    public ButtonPanel()
    {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationByPlatform(true);

        panel = new JPanel();
        panel.setLayout(new GridLayout(0, 2));
        getContentPane().add(panel);
        setSize(300, 300);
        setVisible(true);       
    }
}
1 голос
/ 14 марта 2012
import java.awt.*;
import java.awt.event.*;
import javax.swing.event.*;
import javax.swing.*;

public class SliderExample
{
    private JSlider slider;

    private static final int MIN_BUTTONS = 2;
    private static final int SOME_BUTTONS = 4;  
    private static final int MAX_BUTTONS = 6;

    private JButton[] buttonArray;
    private ActionListener actionButton = new ActionListener()
    {
        public void actionPerformed(ActionEvent ae)
        {
            JButton button = (JButton) ae.getSource();
            System.out.println(button.getText());
        }
    };

    private void createAndDisplayGUI()
    {
        ButtonPanel bp = new ButtonPanel();
        JFrame frame = new JFrame("JSlider Example : ");
        frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
        frame.setLocationByPlatform(true);

        JPanel contentPane = new JPanel();
        slider = new JSlider(JSlider.HORIZONTAL, MIN_BUTTONS, MAX_BUTTONS
                                                            , SOME_BUTTONS);
        slider.addChangeListener(new ChangeListener()
        {
            public void stateChanged(ChangeEvent ce)
            {
                int value = (int) slider.getValue();
                ButtonPanel.panel.removeAll();
                buttonArray = new JButton[value];
                for (int i = 0; i < value; i++)
                {
                    buttonArray[i] = new JButton(String.valueOf(i));
                    buttonArray[i].addActionListener(actionButton);
                    ButtonPanel.panel.add(buttonArray[i]);
                }
                ButtonPanel.panel.revalidate();
                ButtonPanel.panel.repaint();
            }
        });

        contentPane.add(slider);
        frame.getContentPane().add(contentPane);
        frame.pack();
        frame.setVisible(true);

        frame.requestFocusInWindow();
    }

    public static void main(String... args)
    {
        Runnable runnable = new Runnable()
        {
            public void run()
            {
                new SliderExample().createAndDisplayGUI();
            }
        };
        SwingUtilities.invokeLater(runnable);
    }
}

class ButtonPanel extends JFrame
{
    public static JPanel panel;

    public ButtonPanel()
    {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationByPlatform(true);

        panel = new JPanel();
        panel.setLayout(new GridLayout(0, 2));
        getContentPane().add(panel);
        setSize(300, 300);
        setVisible(true);       
    }
}

Для вашего утверждения this.buttonArray[i].addActionListener(this); причина того, что это не работает, заключается в том, что вы находитесь внутри объекта anonymous class new ChangeListener(), который не имеет ничего с именем buttonArray[i] внутрисама по себе это переменная экземпляра класса SliderExample, поэтому либо поместите объект класса SliderExample, либо, если вы ссылаетесь на свой код, затем используйте Object класса, который инициализирует массив, как внутри NewFrame8Вы написали JButton[] buttonArray = new JButton[120];, поэтому используйте объект NewFrame8 вместо this для ссылки на buttonArray[i] вещь.

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