使用JPanel1按钮重新绘制JPanel1中的JPanel2

时间:2015-04-14 01:27:13

标签: java swing button jpanel

好的,所以我有一个程序,其中jPanel(drawPanel)在另一个jPanl(mainPanel)中。目前,我有它编程,当我点击drawPanel,它将重新绘制。但是,如果单击位于mainPanel中的按钮(addrectButton),我希望它重新绘制。我该怎么办?

我有一个不同的类,它为drawPanel扩展了jPanel。

以下是代码:

mainPanel中:

public class ballForm extends javax.swing.JFrame {
public ballForm() {
    initComponents();
}                        
private void initComponents() {

    mainPanel = new javax.swing.JPanel();
    drawPanel = new MyPanel();
    addrectButton = new javax.swing.JToggleButton();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    drawPanel.setBackground(new java.awt.Color(255, 255, 255));

    javax.swing.GroupLayout drawPanelLayout = new javax.swing.GroupLayout(drawPanel);
    drawPanel.setLayout(drawPanelLayout);
    drawPanelLayout.setHorizontalGroup(
        drawPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 403, Short.MAX_VALUE)
    );
    drawPanelLayout.setVerticalGroup(
        drawPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 403, Short.MAX_VALUE)
    );

    addrectButton.setText("Add Rectangle");
    addrectButton.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            addrectButtonActionPerformed(evt);
        }
    });

    javax.swing.GroupLayout mainPanelLayout = new javax.swing.GroupLayout(mainPanel);
    mainPanel.setLayout(mainPanelLayout);
    mainPanelLayout.setHorizontalGroup(
        mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(mainPanelLayout.createSequentialGroup()
            .addGap(54, 54, 54)
            .addComponent(drawPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addGap(49, 49, 49)
            .addComponent(addrectButton)
            .addContainerGap(187, Short.MAX_VALUE))
    );
    mainPanelLayout.setVerticalGroup(
        mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(mainPanelLayout.createSequentialGroup()
            .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(mainPanelLayout.createSequentialGroup()
                    .addGap(58, 58, 58)
                    .addComponent(drawPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGroup(mainPanelLayout.createSequentialGroup()
                    .addGap(150, 150, 150)
                    .addComponent(addrectButton)))
            .addContainerGap(152, Short.MAX_VALUE))
    );

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addComponent(mainPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addComponent(mainPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
    );

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

private void addrectButtonActionPerformed(java.awt.event.ActionEvent evt) {                                              
    // TODO add your handling code here:
}                                             

/**
 * @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) ">
    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(ballForm.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
        java.util.logging.Logger.getLogger(ballForm.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        java.util.logging.Logger.getLogger(ballForm.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(ballForm.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 ballForm().setVisible(true);
        }
    });
}

// Variables declarations                     
private javax.swing.JToggleButton addrectButton;
private javax.swing.JPanel drawPanel;
private javax.swing.JPanel mainPanel;
// End of variables declaration                   

}

drawPanel:

import java.awt.Color;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JPanel;
import javax.swing.Timer;

public class MyPanel extends JPanel {

private List<MyRectangle> lstShapes;
public Timer populate;

public MyPanel() {

    lstShapes = new ArrayList<MyRectangle>(25);

    populate = new Timer(40, new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {

            int x = (int) (Math.random() * getWidth());
            int y = (int) (Math.random() * getHeight());
            int width = (int) (Math.random() * (getWidth() / 4));
            int height = (int) (Math.random() * (getHeight() / 4));

            if (x + width > getWidth()) {
                x = getWidth() - width;
            }
            if (y + height > getHeight()) {
                y = getHeight() - height;
            }

            Color color = new Color(
                    (int) (Math.random() * 255),
                    (int) (Math.random() * 255),
                    (int) (Math.random() * 255));

            lstShapes.add(new MyRectangle(x, y, width, height, color));
            repaint();
        }
    });
    populate.setInitialDelay(0);
    populate.setRepeats(true);
    populate.setCoalesce(true);

    addMouseListener(new MouseAdapter() {
        @Override
        public void mousePressed(MouseEvent e) {
            populate.restart();
        }

        @Override
        public void mouseReleased(MouseEvent e) {
            populate.stop();
        }
    });

}

@Override
protected void paintComponent(Graphics g) {

    super.paintComponent(g);

    Graphics2D g2d = (Graphics2D) g;
    for (MyRectangle rect : lstShapes) {
        rect.paint(g2d);
    }

    FontMetrics fm = g2d.getFontMetrics();
    String text = Integer.toString(lstShapes.size());

    g2d.setColor(getForeground());
    g2d.drawString(text, getWidth() - fm.stringWidth(text), getHeight() - fm.getHeight() + fm.getAscent());

}

public class MyRectangle extends Rectangle {

    private Color color;

    public MyRectangle(int x, int y, int width, int height, Color color) {
        super(x, y, width, height);
        this.color = color;
    }

    public Color getColor() {
        return color;
    }

    public void paint(Graphics2D g2d) {

        g2d.setColor(getColor());
        g2d.fill(this);

    }
}

}

1 个答案:

答案 0 :(得分:0)

actionPerfomed方法中,使用您MyPanel必须调用ballForm方法

repaint引用
private void addrectButtonActionPerformed(java.awt.event.ActionEvent evt) {                                              
    drawPanel.repaint();
}