-1

オーディオ信号をグラフィカルに表現したいと思います。メソッド paint (Graphics g) へのデータ配列の入力に問題があります。メソッド setData(int intValue) に入力されたデータは正常に機能します。しかし、メソッド 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);  
    }   
}
4

4 に答える 4

1
data = intValue;

ここでは、intValueのデータへの参照をpsssingしています。データを変更すると、intValue配列も変更されます。

これを試して :

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

それ以外の :

data = intValue;
于 2013-02-21T11:29:37.800 に答える
0

おそらく、あなたが呼び出した「repaint()」メソッドが元の配列「intValue」を変更していると思います

あなたが行った割り当てはdata = intValue;、「データ[]」を元の配列の参照にするだけなので、再描画が呼び出されると、データがリセットされたか、参照が失われたように見えます。配列をコピーしたい場合は、次のいずれかを行うことができますa & b は 2 つの配列です。

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];
        }
于 2013-02-21T11:59:59.157 に答える
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))); 
        }
    }
}
于 2013-02-22T13:00:27.347 に答える
0

あなたのコードはOKです。問題はメインメソッドにあります。パネルにプロッタを 1 つだけ追加したことを確認してください。

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);  

 }

うまくいきます。

于 2013-02-21T13:57:30.263 に答える