2014-04-26 7 views
0

Netbeans에서 "punten"텍스트 필드에 일련의 숫자 (예 : 7 8 5 4 10 13)를 넣을 수있는 그래픽 인터페이스를 만들고 "ververs"버튼을 누르면 모든 숫자의 그래픽 선 차트 내 패널에 나타납니다. JFrame을 TextField, 버튼 및 패널로 확장 한 클래스 "Gui"를 만들었습니다. 또한 JPanel을 확장하는 클래스 "Grafiek"를 만들었고 이는 "Gui"의 패널과 연결됩니다.다시 그리기가 작동하지 않고 내 개인 필드의 값이 변경되지 않습니까?

내가 경험하는 문제는 다음과 같습니다. repaint(); 명령은 paintComponent (Graphics g) 메소드로 가지 않고 내 개인 변수는 바뀌지 않습니다 (punt와 punti의 길이는 0으로 유지됩니다).

누군가 제발 나를 도울 수 있습니까, 저는 며칠 동안이 프로젝트를 진행해 왔습니다.

내 구이 급 :

import java.awt.Graphics; 

public class Gui extends javax.swing.JFrame { 

public Gui() { 
    initComponents(); 
    panel = new javax.swing.JPanel(); 
} 

/** 
* This method is called from within the constructor to initialize the form. 
* WARNING: Do NOT modify this code. The content of this method is always 
* regenerated by the Form Editor. 
*/ 
@SuppressWarnings("unchecked") 
// <editor-fold defaultstate="collapsed" desc="Generated Code"> 

private void initComponents() { 

    punten = new javax.swing.JTextField(); 
    fout = new javax.swing.JLabel(); 
    javax.swing.JButton ververs = new javax.swing.JButton(); 
    panel = new Grafiek(); 

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

    fout.setText("j"); 

    ververs.setText("Ververs"); 
    ververs.addActionListener(new java.awt.event.ActionListener() { 
     public void actionPerformed(java.awt.event.ActionEvent evt) { 
      verversActionPerformed(evt); 
     } 
    }); 

    panel.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0), 2)); 

    javax.swing.GroupLayout panelLayout = new javax.swing.GroupLayout(panel); 
    panel.setLayout(panelLayout); 
    panelLayout.setHorizontalGroup(
     panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGap(0, 0, Short.MAX_VALUE) 
    ); 
    panelLayout.setVerticalGroup(
     panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGap(0, 195, Short.MAX_VALUE) 
    ); 

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
    getContentPane().setLayout(layout); 
    layout.setHorizontalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() 
      .addContainerGap() 
      .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) 
       .addComponent(panel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
       .addComponent(punten, javax.swing.GroupLayout.Alignment.LEADING) 
       .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() 
        .addComponent(ververs) 
        .addGap(6, 6, 6) 
        .addComponent(fout) 
        .addGap(0, 302, Short.MAX_VALUE))) 
      .addContainerGap()) 
    ); 
    layout.setVerticalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(layout.createSequentialGroup() 
      .addContainerGap() 
      .addComponent(punten, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addGap(18, 18, 18) 
      .addComponent(panel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
      .addGap(18, 18, 18) 
      .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 
       .addComponent(fout) 
       .addComponent(ververs)) 
      .addContainerGap()) 
    ); 

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

private void verversActionPerformed(java.awt.event.ActionEvent evt) {           
    Grafiek graf = new Grafiek(); 
    graf.verwerkData(punten.getText()); 
}          

/** 
* @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) "> 
    /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. 
    * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
    */ 
    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(Gui.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } catch (InstantiationException ex) { 
     java.util.logging.Logger.getLogger(Gui.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } catch (IllegalAccessException ex) { 
     java.util.logging.Logger.getLogger(Gui.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
     java.util.logging.Logger.getLogger(Gui.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 Gui().setVisible(true); 
     } 
    }); 
} 

// Variables declaration - do not modify      
private javax.swing.JLabel fout; 
private javax.swing.JPanel panel; 
private javax.swing.JTextField punten; 
// End of variables declaration     
} 

그리고 내 "Grafiek"-class : 잘못된 객체에 포인트를 추가하기 때문에

import java.awt.Graphics; 

public class Grafiek extends javax.swing.JPanel { 

private String[] punt; 
private int[] punti; 
private int afstandX, afstandY, puntX1=0, puntY1=0, puntX2=0, puntY2=0; 
private int max=1; 

/** 
* Creates new form Grafiek 
*/ 
public Grafiek() { 
    initComponents(); 
} 

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

    try{ 
     for(int i=0; i<punti.length; i++) { 
      if(max <= punti[i]) { 
       max = punti[i]; 
      } 
     } 

     afstandX = getWidth()/punt.length; 
     afstandY = getHeight()/max; 

     for(int i=0; i<punti.length; i++) { 
      puntX1 = puntX2; 
      if(i == 0) { 
       puntY1 = getHeight(); 
      } 
      else puntY1 = puntY2; 
      puntX2 += afstandX; 
      puntY2 = getHeight() - punti[i]*afstandY; 

      g.drawLine(puntX1, puntY1, puntX2, puntY2); 
     } 

     puntX2 = 0; 
     puntY2 = 0; 
    }catch(java.lang.NullPointerException npe) { 
     super.paintComponent(g); 
    } 
} 

public void verwerkData(String s) { 
    punt = s.split(" "); 

    punti = new int[punt.length]; 

    for(int i=0; i<punt.length; i++) { 
     punti[i] = Integer.parseInt(punt[i]); 
    } 

    repaint(); 
} 

/** 
* This method is called from within the constructor to initialize the form. 
* WARNING: Do NOT modify this code. The content of this method is always 
* regenerated by the Form Editor. 
*/ 
@SuppressWarnings("unchecked") 
// <editor-fold defaultstate="collapsed" desc="Generated Code">       
private void initComponents() { 

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

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); 
    this.setLayout(layout); 
    layout.setHorizontalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGap(0, 400, Short.MAX_VALUE) 
    ); 
    layout.setVerticalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGap(0, 300, Short.MAX_VALUE) 
    ); 
}// </editor-fold>       

} 

답변

0

이 코드는 작동하지 않습니다.

우선 panel 개체의 형식이 Grafiek이 아니며 두 번째로 먼저 initComponents() 메서드에서 초기화 된 다음 다시 생성자에서 덮어 씁니다.

두 번째 문제는 동작 수신기에서 호출하는 verversActionPerformed 메서드에서 사용자가 이전에 만들거나 추가 한 인스턴스가 아닌 Grafiek이라는 새 인스턴스를 만듭니다. , 그것은 작동 따라서

private void verversActionPerformed(java.awt.event.ActionEvent evt) {           
    Grafiek graf = (Grafiek)panel; 
    graf.verwerkData(punten.getText()); 
} 

:

public Gui() { 
    initComponents(); 
    //panel = new javax.swing.JPanel(); 
} 

이 같은 방법 :

생성자는 다음과 같아야합니다

따라서

, 다음과 같이 코드를 변경하는 작업을 만들려면 당신이 예상했던대로.

그러나 이것은 좋은 코드에서 멀리 떨어져 있습니다. 변수 panel의 유형을 올바른 유형 Grafiek으로 설정해야합니다.