简体   繁体   English

为什么repaint()在我的JPanel上不起作用?

[英]Why doesn't repaint() work on my JPanel?

I've made my own subclass of JPanel, called SubPatternPanel . 我制作了自己的JPanel子类,称为SubPatternPanel I want to use it in a frame to draw a grid, but when I call repaint() for the SubPatternPanel from the frame, it doesn't work. 我想在框架中使用它来绘制网格,但是当我从框架中为SubPatternPanel调用repaint() ,它不起作用。

When run, the frame is displayed with a "New" button. 运行时,框架带有“新建”按钮显示。 When New is pressed, a grid should be painted by my panel, but it isn't and I can't find the cause. 当按下“新建”按钮时,面板上应绘制一个网格,但不是,并且我也找不到原因。

Below is the code for the SubPatternPanel: 以下是SubPatternPanel的代码:

package View;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JPanel;


public class SubPatternPanel extends JPanel
{

    public SubPatternPanel()
    {
    setLayout(null);
        setBackground(Color.white);
        setPreferredSize(new Dimension(240, 240));
    }

    @Override
    public void paintComponent(Graphics g)
    {   
    super.paintComponent(g);

    g.setColor(Color.black);

    for (int i = 0; i < 3; i++) 
    {
            for (int j = 0; j < 3; j++) 
        {
                g.drawLine(i * 80, j * 80, 240, j * 80);
                g.drawLine(i * 80, j * 80, i * 80, 240);
            }
        }
    }
}

Most of the frame code has been autogenerated, so I'm not sure what to leave out for a clearer picture. 大多数的框架代码都是自动生成的,因此我不确定为获得更清晰的图片而遗漏的内容。

package View;

import java.awt.BorderLayout;

public class PatternsMainFrame extends javax.swing.JFrame
{

    private SubPatternPanel subPatternPanel;

    public PatternsMainFrame()
    {
    initComponents();
    subPatternPanel = new SubPatternPanel();
    patternStartPanel.add(subPatternPanel, BorderLayout.CENTER);
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents()
    {

        patternStartPanel = new javax.swing.JPanel();
        newButton = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        javax.swing.GroupLayout patternStartPanelLayout = new javax.swing.GroupLayout(patternStartPanel);
        patternStartPanel.setLayout(patternStartPanelLayout);
        patternStartPanelLayout.setHorizontalGroup(
            patternStartPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 277, Short.MAX_VALUE)
        );
        patternStartPanelLayout.setVerticalGroup(
            patternStartPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 278, Short.MAX_VALUE)
        );

        newButton.setText("New");
        newButton.addActionListener(new java.awt.event.ActionListener()
        {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
                newButtonActionPerformed(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()
                .addContainerGap()
                .addComponent(patternStartPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 248, Short.MAX_VALUE)
                .addComponent(newButton)
                .addGap(112, 112, 112))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(patternStartPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addContainerGap())
            .addGroup(layout.createSequentialGroup()
                .addGap(24, 24, 24)
                .addComponent(newButton)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        pack();
    }                      

    private void newButtonActionPerformed(java.awt.event.ActionEvent evt)                                          
    {
    subPatternPanel.repaint();
    }                                         

    public static void main(String args[])
    {
    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(PatternsMainFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (InstantiationException ex)
    {
        java.util.logging.Logger.getLogger(PatternsMainFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex)
    {
        java.util.logging.Logger.getLogger(PatternsMainFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (javax.swing.UnsupportedLookAndFeelException ex)
    {
        java.util.logging.Logger.getLogger(PatternsMainFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    }

    java.awt.EventQueue.invokeLater(new Runnable()
    {
        public void run()
        {
        new PatternsMainFrame().setVisible(true);
        }
    });
    }                    
    private javax.swing.JButton newButton;
    private javax.swing.JPanel patternStartPanel;                 
}

You should use setVisible(true) instead of repaint() . 您应该使用setVisible(true)而不是repaint()

repaint checks first whether visibility was set to true . repaint首先检查可见性是否设置为true repaint() is typically invoked when you want to repaint something that has already been painted once. 当您想重新绘制已经绘制过的东西时,通常会调用repaint()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM