2013-08-05 2 views
0

Я сделал свой собственный подкласс JPanel, который называется SubPatternPanel. Я хочу использовать его в кадре для рисования сетки, но когда я вызываю repaint() для SubPatternPanel из фрейма, он не работает.Почему не перерисовывает() работу на моем 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). Предположительно, рамка * * видна, так как он может нажать кнопку. –

Смежные вопросы