2013-08-05 64 views
0

我已经创建了我自己的JPanel的子类,名为SubPatternPanel。我想在框架中使用它来绘制网格,但是当我从框架中调用SubPatternPanelrepaint()时,它不起作用。为什么不重绘()在我的JPanel上工作?

运行时,框架会显示一个“新建”按钮。当按下New时,我的面板应该绘制一个网格,但不是,我找不到原因。

下面是对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); 
      } 
     } 
    } 
} 

大部分的框架代码已经自动生成的,所以我不知道该怎么离开了更清晰的画面。

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;     
} 
+0

什么是'subPatternPanel.newPat()'? – resueman

+1

对于这样的问题,请发布[SSCCE](http://sscce.org/) –

+0

其中是该按钮的代码?你可以显示initComponents()方法吗? – scottyseus

回答

1

您应该使用setVisible(true)而不是repaint()

repaint首先检查能见度是否设置为true。当您想要重绘已经绘制过一次的东西时,通常会调用repaint()

+1

您不需要设置组件的可见性(其中包含'JPanel')。据推测框架*是可见的,因为他能够点击按钮。 –

相关问题