2013-02-21 66 views
-1

對不起,也許這是一個微不足道的問題。 我想做一個音頻信號的圖形表示。 我有一個輸入數據數組到方法paint(Graphics g)的問題。 在方法setData(int intValue)中輸入的數據正常工作。 但是,如果我想在方法paint()中打印數據數組,我有零值。 爲什麼?方法中的數組中的零值paint

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

public class MyPlotter extends JPanel{ 
    int width = 320; 
    int height = 130; 
    int frameSize; 
    int[] data; 

public MyPlotter(int fSize){ 
    setSize(width,height);  
    setPreferredSize(this.getSize()); 
    this.frameSize = fSize; 
    data = new int[fSize+1]; 
} 


public void setData(int[] intValue){ 
    data = intValue; 

// this works fine: 
     for (int i=0; i<440; i++) 
      System.out.println("setData "+data[i]); 

    repaint(); 
} 

public void paint (Graphics g){ 

    // some code: 
    // g.drawLine(...) 
    // g.setColor(...) 
    // etc...  

for (int i = 0; i< frameSize-1;i++) 
    { 
    //ZERO values: 
    System.out.println("paint() "+(data[i])); 

    // g.drawline(...); 
    } 
} 
} 

編輯:

陣列的數據從MyPanel.class

import javax.swing.JPanel; 

public class MyPanel extends JPanel { 

    private MyPlotter plotter; 

    public MyPanel(){ 
    setSize(320,210); 
    plotter = new MyPlotter(440); 
    add(this.plotter,0); 
} 

public void setData(int[] data){ 
    plotter.setData(data); 
} 

}

+0

你什麼時候調用'setData()'? – flash 2013-02-21 11:30:24

+0

爲了儘快提供更好的幫助,請發佈[SSCCE](http://sscce.org/)。 – 2013-02-21 11:58:40

+1

順便說一句''public void paint(Graphics g){'應該是'public void paintComponent(Graphics g){'用於'JPanel'中的自定義繪畫。 – 2013-02-21 12:02:26

回答

0

我認爲這可能是 「重繪()」 你叫方法修改原始數組 「的intValue」

分配您已使data = intValue;僅使「data []」成爲原始數組的引用,因此重繪被調用似乎是數據被重置或引用丟失。如果要複製Ë數組,你可以做任何下列如果& b是兩個數組:

b = Arrays.copyOf(a, a.length); 

0R

b = new int[a.length]; 
System.arraycopy(a, 0, b, 0, b.length); 

b = (int[]) a.clone(); 

int b[] = new int[a.length]; 

     for (int i = 0; i < a.length; i++) { 
      b[i] = a[i]; 
     } 
+0

感謝您的回覆。不幸的是,這些解決方案不能解決問題。 – auroris 2013-02-21 12:17:40

+0

嘿你是否需要數據是類變量的每個實例的共同類變量,那麼你必須使變量靜態int []數據;以便同一類的不同實例不具有數據變量的新副本。 – Lakshmi 2013-02-22 06:18:49

+0

我也試過了。並沒有幫助。在發佈的代碼下面。 – auroris 2013-02-22 13:09:49

1
data = intValue; 

這裏你psssing的intValue的參照數據輸入。如果你改變數據,intValue數組也會被改變。

試試這個:

data = System.arraycopy(intValue, 0, data, 0, intValue.length); 

相反的:

data = intValue; 
+0

我從外面介紹陣列數據。我想在paint方法中使用相同的數據。 – auroris 2013-02-21 11:37:26

+0

我試過這些,但我得到一個錯誤:「不可轉換的類型所需:int找到:void」 – auroris 2013-02-21 11:58:39

+0

@auroris嘗試data = Arrays.copyOf(intValue,intValue.length); – 2013-02-21 12:01:50

0

您的代碼沒問題。問題在於主要方法。確保您只添加了一臺繪圖儀。

public static void main(String[]args){ 
    int[] mass = new int[]{1,2,3,4,5,6,7,8,9,10}; 
    JFrame frame = new JFrame(); 
    MyPanel mp = new MyPanel(); 
    frame.add(mp); 
    frame.setSize(300, 300);   
    mp.setData(mass);   
    frame.setVisible(true); 

} 

工作的很好。

0

我很抱歉回答我自己的帖子,但我完全改變了程序。 我不知道我是否可以從第一篇文章中刪除代碼。所以我寫了一個新帖子。

我改變了一個應用程序,但仍然有問題將數組輸入到另一個方法。 通過「Arrays.copyOf b =(a,a.length)」複製數組並將數組更改爲靜態並不能解決問題。 我無法在OscilloscopeController類中將setSignal()中的數組輸入到getSignal()中。

OscilloscopeController。的java

import java.util.Arrays; 
import java.util.Random; 

public class OscilloscopeController { 

private static int frameSize = (int) (44100/100F); 
private int idx, numFramesToSkip = 10; 
private static int[] toDraw = new int[frameSize]; 
private static int[] data = new int[frameSize]; 

public OscilloscopeController() { 

    for (int i = 0; i < frameSize; i++) { 
     toDraw[i] = 0; 
     data[i] = 0; 
    } 
} 

public void setSignal(int in) { 
    // Because the Model layer is off, I generate a test signal 
    Random randomGenerator = new Random(); 
    int j = 0; 
    for (int i = 0; i < 44100; i++) { 
     int randomInt = randomGenerator.nextInt(32675 * 2) - (32675); 
     if (i % 4 == 0) { 
      j = randomInt; 
     } 
    in = j; 
    } 


    if (idx++ > frameSize * numFramesToSkip) 
    { 
     idx = 0; 
    } 
    else 
    { 
     if (idx < frameSize) { 
      data[idx] = in; 
     } 

     if (idx == frameSize) 
     { 
      // HERE IS PROBLEM. I'D LIKE THIS toDraw in getSignal() 
      toDraw = Arrays.copyOf(data, data.length); 
     } 
    } 
} 

public int[] getSignal() { 


    // IF UNCOMMENT BELOW WORKS FINE, OTHERWISE ZERO VALUES 
    /* 
     Random randomGenerator = new Random(); 
     int j=0; 
     for (int i = 0; i < 440; i++) { 
     int randomInt = randomGenerator.nextInt(32675*2)-(32675); 
     if (i%4==0) j = randomInt; 
     toDraw[i]=j; 
    } 
    */ 

for (int i = 0; i < frameSize; i++) 
     System.out.println("Controller.getSignal() = "+ toDraw[i]); 

     return toDraw; 
    } 
} 

mainPanel中包含main方法:

import java.awt.*; 
import javax.swing.*; 

public class MainPanel extends JPanel { 

public static void main(String args[]) throws Exception { 
    SwingUtilities.invokeLater(new Runnable() { 
    public void run() { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new MainPanel()); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
    }); 
    } 

private final OscilloscopeView oscView = new OscilloscopeView(); 
private final OscilloscopeController oscController = new OscilloscopeController(); 

public MainPanel() { 

    setPreferredSize(new Dimension(400, 200)); 

    // a lot of other components here 

    oscView.setData(oscController.getSignal()); 
    add(oscView); 
    } 
} 

OscilloscopeView.java

import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class OscilloscopeView extends JPanel { 

    private OscPlotter plotter = new OscPlotter(441);; 

    public OscilloscopeView() 
    { 
     setSize(320,210); 
     add(this.plotter); 
    } 

    public void setData(int[] data){ 
    plotter.setData(data); 
    } 
} 

OscPlotter.java

import java.awt.Color; 
import java.awt.Graphics; 
import java.util.Arrays; 
import javax.swing.JPanel; 


public class OscPlotter extends JPanel{ 


    private int width = 320; 
    private int height = 130; 
    private float widthC; 
    private float heightC; 
    private int sampleSize; 
    private int frameSize; 
    private int[] toDraw; 
    private float x,prevX; 

    public OscPlotter(int fSize){ 
     setSize(width,height);  
     setPreferredSize(this.getSize()); 
     this.frameSize = fSize; 
     this.toDraw = new int[441]; 
     sampleSize = 1; 

    } 


    public void setData(int[] data){ 
     toDraw = Arrays.copyOf(data, data.length); 
     repaint(); 
    } 


    @Override 
    public void paintComponent(Graphics g){ 

     widthC = ((float)width/frameSize);   
     sampleSize = (16 == 16 ? 65536 : 256);   
     heightC = (((float)height-15)/sampleSize);   

     g.setColor(Color.black);    
     g.fillRect(0,0,width,height); 

     g.setColor(Color.gray);  
     for (int i = 1; i<height;i+=height/8) 
      g.drawLine(0,i,width,i);    
     for (int i = 1; i<width;i+=width/8) 
      g.drawLine(i,0,i,height);  

     g.setColor(Color.lightGray); 
     g.drawLine(0,(int)(height/2),width,(int)((height/2))); 


     g.setColor(Color.green);   
     x = 0;  

     for (int i = 0; i< frameSize-1;i++) 
     { 
      prevX = x; 
      x +=widthC; 
      // draw the read waveform data 
      g.drawLine ((int)prevX,(int)((height/2+toDraw[i]*heightC)),(int)x,(int)((height/2+toDraw[i+1]*heightC))); 
     } 
    } 
} 
+0

你的意思是「我無法從setSignal()向OscilloscopeController類中的getSignal()輸入數組」。 ?你真的在哪裏調用setSignal()? – Lakshmi 2013-02-25 05:06:30

+0

問題是缺少通信OscilloscopeView到示波器控制器。我使用靜態工廠方法解決了問題。感謝您的提示。 – auroris 2013-03-03 11:03:10

+0

@aurois我很高興你解決了:)你的歡迎:) – Lakshmi 2013-03-03 12:38:55