2013-08-05 67 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')。據推測框架*是可見的,因爲他能夠點擊按鈕。 –

相關問題