Android moving GraphView and play MediaPlayer at the same time - java
I'm working on a project, where I need to show the pitches of the words (from the song) in a GraphView. I wrote a program that would get the pitches from a song and create a .txt file from it.
Then I wrote a class, that reads the file and creates a list from it. So in the end I would have a list that consists of words and word contains pitches. In the MakePitchesList you can see what the pitches output from a song looks like. I have 0,14:23281,61 on every line. The first part of the line is timeOccurance meaning, when this pitch was heard and the second part is the pitch itself. So in this example the timeOccurance would be 0,14 and pitch at that given time 23281,61.
Here are the three classes that make a wordsList out of a pitch .txt file.
public class Pitch{
float occuranceTime;
float pitch;
public void setOccuranceTime(float occuranceTime) {
this.occuranceTime = occuranceTime;
}
public float getOccuranceTime() {
return occuranceTime;
}
public void setPitch(float pitch) {
this.pitch = pitch;
}
public float getPitch() {
return pitch;
}
}
public class MakePitchesList {
String[] pitches;
List<Pitch> listOfPitches = new ArrayList<Pitch>();
public List<Pitch> getListOfPitches(){
getPitches();
for (String pitchString: pitches) {
Pitch pitch = new Pitch();
makeListOfPitches(pitch, pitchString);
}
return listOfPitches;
}
public void makeListOfPitches(Pitch pitch, String pitchString){
pitch.setPitch(getPitchesInfo(pitchString, 1));
pitch.setOccuranceTime(getPitchesInfo(pitchString, 0));
listOfPitches.add(pitch);
}
public String[] getPitches() {
pitches = pitchesRaw.split("\\r?\\n");
return pitches;
}
private float getPitchesInfo(String pitch, int position){
String[] frequencyAndTime = pitch.split("\\:");
if(position == 0){
return Float.parseFloat(frequencyAndTime[0].replace(',', '.'));
}
if(position == 1){
return Float.parseFloat(frequencyAndTime[1].replace(',', '.'));
}
else return 0;
}
String pitchesRaw =
"0,14:23281,61\n" +
"0,23:53,65\n" +
"0,37:72,53\n" +
"0,56:86,09\n" +
"0,60:88,58\n" +
"0,65:87,45\n" +
"0,70:87,11\n" +
"0,74:89,56\n" +
"0,79:96,22\n" +
"0,84:23288,24\n" +
"0,88:103,92\n" +
"0,93:107,46\n" +
"0,98:108,02\n" +
"1,02:107,51\n" +
"1,07:104,92\n" +
"1,11:105,94\n" +
"1,16:106,40\n" +
"1,21:104,43\n" +
"1,25:104,93\n" +
"1,30:108,01\n" +
"1,35:316,81\n" +
"1,39:103,98\n" +
"1,44:23297,42\n" +
"1,49:23357,42\n" +
"1,53:23359,74\n" +
"1,58:23393,04\n" +
"1,63:23244,18\n" +
"1,67:23220,51\n" +
"1,72:23250,06\n" +
"1,76:23288,84\n" +
"1,81:23241,81\n" +
"1,86:23295,22\n" +
"1,90:23268,04\n" +
"1,95:23252,78\n" +
"2,00:23224,22\n" +
"2,04:23429,71\n" +
"2,09:23214,58\n" +
"2,14:23240,70\n" +
"2,18:23237,71\n" +
"2,23:23231,22\n" +
"2,28:23222,77\n" +
"2,32:23239,73\n" +
"2,37:23235,98\n" +
"2,41:23222,16\n" +
"2,46:23224,01\n" +
"2,51:23214,26\n" +
"2,55:23223,20\n" +
"2,60:23234,11\n" +
"2,65:23221,65\n" +
"2,69:23213,45\n" +
"2,74:23217,44\n" +
"2,79:23235,93\n" +
"2,83:11122,79\n" +
"2,88:23234,58\n" +
"2,93:23229,52\n" +
"2,97:23255,48\n" +
"3,02:23254,44\n" +
"3,07:23355,41\n" +
"3,44:105,48\n" +
"3,48:115,45\n" +
"3,53:117,78\n" +
"3,58:127,36\n" +
"3,62:131,24\n" +
"3,67:130,33\n" +
"3,72:131,93\n" +
"3,76:127,32\n" +
"3,81:117,18\n" +
"3,85:117,80\n" +
"3,90:117,15\n" +
"3,95:121,04\n" +
"3,99:131,22\n" +
"4,04:130,38\n" +
"4,09:130,34\n" +
"4,13:129,57\n" +
"4,18:120,38\n" +
"4,23:121,06\n" +
"4,32:100,12\n" +
"4,37:23483,16\n" +
"4,41:112,95\n" +
"4,46:23448,04\n" +
"4,50:23396,09\n" +
"4,55:23292,90\n" +
"4,60:117,21\n" +
"4,64:116,58\n" +
"4,69:116,62\n" +
"4,74:119,18\n" +
"4,78:131,19\n" +
"4,83:130,34\n" +
"4,88:129,59\n" +
"4,92:132,64\n" +
"4,97:129,68\n" +
"5,02:132,71\n" +
"5,06:133,57\n" +
"5,11:128,94\n" +
"5,15:131,09\n" +
"5,20:132,75\n" +
"5,25:129,68\n" +
"5,29:131,26\n" +
"5,34:131,22\n" +
"5,39:130,38\n" +
"5,43:146,01\n" +
"5,48:140,43\n" +
"5,57:23450,16\n" +
"5,62:130,46\n" +
"5,67:132,02\n" +
"5,71:23243,22\n" +
"5,76:23456,28\n" +
"5,85:23246,64\n" +
"5,90:23274,97\n" +
"5,94:23310,30\n" +
"5,99:23229,71\n" +
"6,08:23214,33\n" +
"6,13:23221,53\n" +
"6,18:23263,48\n" +
"6,22:23213,17\n" +
"6,27:23235,04\n" +
"6,32:23222,02\n" +
"6,36:23214,90\n" +
"6,41:23230,05\n" +
"6,46:23212,55\n" +
"6,50:23221,33\n" +
"6,55:23226,70\n" +
"6,59:23217,07\n" +
"6,64:23272,07\n" +
"6,69:11102,74\n" +
"6,73:23263,38\n" +
"6,78:23217,53\n" +
"6,97:23243,63\n" +
"7,11:23214,11\n" +
"7,15:23229,58\n" +
"7,20:23225,70\n" +
"7,24:23244,82\n" +
"7,29:23243,09\n" +
"7,34:23249,66\n" +
"7,38:23226,67\n" +
"7,43:23246,31\n" +
"7,48:23258,55\n" +
"7,52:23230,34\n" +
"7,57:23225,60\n" +
"7,62:23280,25\n" +
"7,66:23238,08\n" +
"7,71:23221,47\n" +
"7,85:117,87\n" +
"7,89:117,19\n" +
"7,94:117,21\n" +
"7,99:117,21\n" +
"8,03:116,57\n" +
"8,08:119,10\n" +
"8,13:44,01\n" +
"8,17:129,52\n" +
"8,22:132,72\n" +
"8,27:143,19\n" +
"8,31:141,13\n" +
"8,36:139,35\n" +
"8,45:132,82\n" +
"8,50:129,76\n" +
"8,54:130,43\n" +
"8,68:94,20\n" +
"8,78:132,70\n" +
"8,82:130,43\n" +
"8,87:129,60\n" +
"8,92:130,56\n" +
"8,96:128,92\n" +
"9,01:119,19\n" +
"9,06:118,45\n" +
"9,10:103,41\n" +
"9,15:103,41\n" +
"9,20:103,89\n" +
"9,24:106,46\n" +
"9,29:214,93\n" +
"9,33:23427,95\n" +
"9,38:23356,01\n" +
"9,43:106,41\n" +
"9,47:100,57\n" +
"9,52:106,39\n" +
"9,57:104,40\n" +
"9,61:99,70\n" +
"9,66:106,42\n" +
"9,71:103,50\n" +
"9,75:104,47\n" +
"9,80:106,97\n" +
"9,85:99,68\n" +
"9,89:23454,22\n" +
"9,94:23299,56\n" +
"9,98:23275,30\n" +
"10,03:23222,72\n" +
"10,08:23246,09\n" +
"10,12:23221,14\n" +
"10,17:23240,54\n" +
"10,22:23246,81\n" +
"10,26:23224,74\n" +
"10,31:23249,41\n" +
"10,36:23214,79\n" +
"10,40:23213,46\n" +
"10,45:23259,51\n" +
"10,50:23217,39\n" +
"10,54:23215,36\n" +
"10,59:23224,87\n" +
"10,63:23242,27\n" +
"10,68:23270,82\n" +
"10,73:23243,19\n" +
"10,77:23222,75\n" +
"10,82:23268,78\n" +
"10,87:23321,62\n" +
"10,91:23259,65\n" +
"11,05:23226,24\n" +
"11,10:23222,92\n" +
"11,15:23218,83\n" +
"11,19:23211,71\n" +
"11,24:11112,28\n" +
"11,28:23261,03\n" +
"11,33:23265,31\n" +
"11,38:23245,92\n" +
"11,42:57,09\n" +
"11,61:103,45\n" +
"11,66:103,91\n" +
"11,70:102,02\n" +
"11,75:107,96\n" +
"11,80:105,43\n" +
"11,84:104,46\n" +
"11,89:116,64\n" +
"11,94:115,99\n" +
"11,98:114,77\n" +
"12,03:121,72\n" +
"12,07:123,16\n" +
"12,12:125,12\n" +
"12,17:128,85\n" +
"12,21:120,37\n" +
"12,26:116,52\n" +
"12,31:130,55\n" +
"12,35:131,06\n" +
"12,40:131,89\n" +
"12,45:128,88\n" +
"12,49:23397,75\n" +
"12,59:118,45\n" +
"12,63:116,54\n" +
"12,68:119,70\n" +
"12,72:115,45\n" +
"12,77:115,30\n" +
"12,82:119,86\n" +
"12,86:116,59\n" +
"12,91:114,13\n" +
"12,96:119,04\n" +
"13,00:118,47\n" +
"13,05:115,38\n" +
"13,10:128,92\n";
}
public class MakeWordsList {
List<Pitch> pitches;
public List<List<Pitch>> getWordsList(List<Pitch> pitchList) {
return makeWordsList(pitchList);
}
List<Pitch> oneWord = new ArrayList<>();
List<List<Pitch>> wordList = new ArrayList<>();
public List<List<Pitch>> makeWordsList(List<Pitch> pitchList){
pitches = pitchList;
int pauseCounter = 0;
for (int i = 0; i < pitchList.size(); i++) {
if(pitchList.get(i).getPitch() > 10000){
pauseCounter++;
} else {
if(pauseCounter > 0){
if(pauseCounter >= 5){
wordList.add(oneWord);
oneWord = new ArrayList<>();
}
pauseCounter = 0;
}
oneWord.add(pitchList.get(i));
}
}
if(oneWord.size() > 0){
wordList.add(oneWord);
}
return wordList;
}
}
Now from that wordsList I create a scrollable GraphView that on paper would look something like this.
Now I have set the boundaries for the GraphView: MinX = -0.8; MaxX = 0.4. This way I'm showing 1 sec at a time on screen. Then I start a thread so it would change the coordinates of the GraphView by 0.1 every 100ms, which should add up as 1 every sec.
Here it is in code:
public class SongPlayer extends AppCompatActivity {
private Viewport graphViewPort;
private Handler handler;
private Runnable runnable;
private GraphView graph;
private DataPoint[] points;
private LineGraphSeries<DataPoint> series;
private int seriesNr;
final static double GRAPH_STARTING_X = -0.8;
final static double GRAPH_ENDING_X = 0.4;
private double orderNr = GRAPH_STARTING_X;
private List<Pitch> pitchesList;
List<List<Pitch>> wordsList;
#SuppressLint("ClickableViewAccessibility")
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.song_player);
Intent intent = getIntent();
//Get Textview and Button
playRecordButton = (ImageButton) findViewById(R.id.playRecord);
//Initialize pitches and words
MakePitchesList listOfPithes = new MakePitchesList();
MakeWordsList listOfWords = new MakeWordsList();
pitchesList = listOfPithes.getListOfPitches();
wordsList = listOfWords.getWordsList(pitchesList);
//Initialize graph
graph = (GraphView) findViewById(R.id.graph);
initGraph();
//ViewPort
graphViewPort = graph.getViewport();
//Handler
handler = new Handler();
playRecordButton.setOnTouchListener(new View.OnTouchListener() {
#Override
public boolean onTouch(View view, MotionEvent motionevent) {
final int action = motionevent.getAction();
if (action == MotionEvent.ACTION_DOWN) {
//Start playing audio
playMedia();
//Start moving graph
drawAndMoveGraph();
} else if (action == MotionEvent.ACTION_UP) {
//Stop moving graph and set them to the beginning
resetGraph();
//Stop Playing audio
stopAudio();
}//end else
return false;
} //end onTouch
}); //end b my button
}
private void drawAndMoveGraph(){
runnable = new Runnable() {
public void run() {
System.out.println(orderNr);
graphViewPort.setMinX(orderNr);
graphViewPort.setMaxX(orderNr + 1);
graph.invalidate();
if(pitchesList.size() != orderNr){
orderNr = orderNr + 0.1;
// System.out.println(orderNr);
}
handler.postDelayed(this, 100);
}
};
runnable.run();
}
private void initGraph(){
for (int i = 0; i < wordsList.size(); i++) {
seriesNr = 0;
points = new DataPoint[wordsList.get(i).size()];
for (Pitch pitch: wordsList.get(i)) {
points[seriesNr] = new DataPoint(pitch.getOccuranceTime(), pitch.getPitch());
seriesNr++;
}
series = new LineGraphSeries<>(points);
series.setThickness(15);
graph.addSeries(series);
}
//VocalTestPoints
PointsGraphSeries<DataPoint> series = new PointsGraphSeries<>(new DataPoint[] {
new DataPoint(0, 50),
new DataPoint(0, 75),
new DataPoint(0, 100),
new DataPoint(0, 125),
new DataPoint(0, 150),
new DataPoint(0, 175),
new DataPoint(0, 200),
new DataPoint(0, 225),
new DataPoint(0, 250),
new DataPoint(0, 275),
});
series.setSize(5);
series.setColor(Color.YELLOW);
graph.addSeries(series);
// set manual X bounds
graph.getViewport().setYAxisBoundsManual(true);
graph.getViewport().setMinY(-50);
graph.getViewport().setMaxY(400);
graph.getViewport().setXAxisBoundsManual(true);
graph.getViewport().setMinX(GRAPH_STARTING_X);
graph.getViewport().setMaxX(GRAPH_ENDING_X); //mitu korraga näeb
graph.getViewport().setScrollable(true);
}
private void playMedia(int songIndex){
StorageUtil storage = new StorageUtil(getApplicationContext());
storage.storeAudio(audioList);
storage.storeAudioIndex(songIndex);
mediaPlayer = new MediaPlayer();
//Reset so that the MediaPlayer is not pointing to another data source
mediaPlayer.reset();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
try {
mediaPlayer.setDataSource(storage.loadAudio().get(storage.loadAudioIndex()).getData());
} catch (IOException e) {
e.printStackTrace();
}
mediaPlayer.prepareAsync();
// mediaPlayer.prepare(); // might take long! (for buffering, etc)
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
#Override
public void onPrepared(MediaPlayer mp) {
mediaPlayer.start();
}
});
}
private void stopAudio(){
mediaPlayer.stop();
mediaPlayer.release();
}
private void resetGraph(){
handler.removeCallbacks(runnable);
graphViewPort.setMinX(GRAPH_STARTING_X);
graphViewPort.setMaxX(GRAPH_ENDING_X);
graph.invalidate();
orderNr = GRAPH_STARTING_X;
}
}
To sum up what the code does: it gets the wordsList from the pitches, initializes the graph, starts listening button click. When button is clicked, it starts moving graph as described above and plays audio.
The problem is that the audio and moving graphView go out of sync. For the first 10sec or so it works like it should but then the lines start falling behind. I would really appreciate if someone took their time to understand all of this mess.
Maybe picture of the actual final graphView will also help. . Blue line is the first incoming word.
Related
How to fix "double printing when I clicked twice on the pretty dialog button"
I debugging my application then I tried clicking twice and fast on the pretty dialog button and it print twice I expect that even I clicked twice it will not print twice. I tried error handler codes but it was not working. prettyDialog.addButton("YES", R.color.navy_blue, R.color.gold_yellow, new PrettyDialogCallback() { #Override public void onClick() { getActivity().runOnUiThread(new Runnable() { #Override public void run() { raw_serial = String.valueOf(Build.SERIAL); serial_final = raw_serial.substring(raw_serial.length() - 7); nf = new DecimalFormat("000000"); DateFormat dateFormat = new SimpleDateFormat("MMddyyyy"); Date date = new Date(); ticket_date = dateFormat.format(date).toString(); DateFormat datetimeformat = new SimpleDateFormat("HHmmss"); Date time = new Date(); ticket_time = datetimeformat.format(time).toString(); transaction_no = serial_final + ticket_date + ticket_time + nf.format(setting_last_transaction_no); trace_no = merchant_code + serial_final + ticket_date + ticket_time + nf.format(ref_trace_no); print_card_no = Cardno.substring(Cardno.length() - 4); String print_balance; print_balance = "P" + String.valueOf(Balance); int balancespace = 0; int balancelength = 0; balancelength = print_balance.length(); balancespace = 13 - balancelength; for (int j = 0; j < balancespace; j++) { print_balance = " " + print_balance; } int print = PrinterInterface.open(); Log.e("print", String.valueOf(print)); int querystatus = PrinterInterface.queryStatus(); Log.e("querystatus", String.valueOf(querystatus)); DateFormat dateformatforprint = new SimpleDateFormat("MMM.dd,yyyy"); Date dateformatprint = new Date(); String datetoprint = dateformatforprint.format(dateformatprint).toString(); DateFormat timeformattoprint = new SimpleDateFormat("HH:mm"); Date timeformat = new Date(); String timetoprint = timeformattoprint.format(timeformat).toString(); String finalStation = ""; Log.e("asdasd", "asdasd"); if (print >= 0) { byte[] arryTitle = null; byte[] arryTrx = null; byte[] arrySubtitle = null; byte[] arryBody1 = null; byte[] arryspace1 = null; byte[] arryFooter = null; //test try { arryTitle = ("\n" + "TRIPKO" + "\n" + "\n").getBytes("UTF-8"); arryTrx = ("TRX: " + transaction_no + "\n" + trace_no + "\n").getBytes("UTF-8"); arrySubtitle = ("Date & Time : " + datetoprint + " " + timetoprint + "\n" + "Merchant Name: " + subcompany_name.toUpperCase() + "\n" + "Branch : " + terminal_name.toUpperCase() + "\n" + "-------------------------------" + "\n" + "\n").getBytes("UTF-8"); arryBody1 = ("Card No. : " + " **** **** **** " + print_card_no + "\n" + "Trans Type : " + " " + type_name.toUpperCase() + "\n" + "Current Balance : " + print_balance + "\n" + "-------------------------------" + "\n" + "\n").getBytes("UTF-8"); arryFooter = ("Customer Service" + "\n" + "Hotline#: TRIPKO(678-1234)" + "\n" + "\n").getBytes("UTF-8"); arryspace1 = "\n".getBytes("UTF-8"); } catch (Throwable e) { e.printStackTrace(); } begin(); if (querystatus == 1) { writeLineBreak(20); write(arryspace1); alignment(1); Fontsize(16); boldFont(2); doublewidth(); write(arryTitle); backtonormal(); nextline(); Fontsize(0); write(arryTrx); alignment(0); write(arrySubtitle); write(arryBody1); alignment(1); write(arryFooter); write(arryspace1); write(arryspace1); write(arryspace1); write(arryspace1); insertData(company_id, subcompany_id, terminal_id, setting_control_no, Cardno, Balance, transaction_no, trace_no, device_serial); setting_last_transaction_no += 1; ref_trace_no += 1; updateTicket(String.valueOf(setting_last_transaction_no), String.valueOf(ref_trace_no)); DBBackup(); end(); btnCheckBalance.setEnabled(true); btnCheckBalance.setClickable(true); Intent intent2 = new Intent(getContext(), UpdateSendingServices.class); getActivity().startService(intent2); } else { //OpenNoPaper(); } } PrinterInterface.close(); } }); getActivity().runOnUiThread(new Runnable() { #Override public void run() { totalBalance.setText("P 0.00"); btnCheckBalance.setEnabled(true); btnCheckBalance.setClickable(true); } }); prettyDialog.dismiss(); } }) .show(); I expect that it will not print twice even I clicked the "YES" pretty dialog button.
i think you can just do a trick like this create a count variable count=0;. In button click, validate condition such that if(count==0) show dialog and make count = 1. (with this dialog will not open second time) while dismissing dialog make count = 0 again. I think this will work Hope it helps. if(count == 0){ count = 1 ; //showdialog process } and right before dismiss() ...... count = 0; prettyDialog.dismiss();
Calling String in Bean Class Returns Null
I have a bean class that successfully retrieves a string value from another class.= (It prints it just fine within the bean class) When I try and call that class/string it returns as null. Here is the relevant code: public class cityModel implements Serializable { private String fajr; public void setFajr(String fajr) { this.fajr= fajr; } public String getFajr() { return fajr; } } public void mutePrayerTime(View view) { cityModel cityObj= new cityModel(); String fajr=cityObj.getFajr(); Log.d("LOGCAT", "" + cityObj.getFajr()); //StringBuilder newFajr = new StringBuilder(fajr); //newFajr.delete(2,5); //Log.d("newFajr", String.valueOf(newFajr)); // Intent alarm = new Intent(AlarmClock.ACTION_SET_ALARM); //alarm.putExtra(AlarmClock.EXTRA_HOUR, fajr ); } the Log.d tag LOGCAT returns as null edit: Code that the bean class retrieves the string from: protected void outputTimings(JSONArray jsonArray) { String[] prayers = {"fajr", "shurooq", "dhuhr", "asr", "maghrib", "isha"}; cityModel cityObj; try { cityObj= new cityModel(); for (int i = 0; i < jsonArray.length(); i++) { JSONObject cityObject = jsonArray.getJSONObject(i); result = result + "fajr" + " : " + cityObject.getString("fajr") + "\n" + result + "shurooq" + " : " + cityObject.getString("shurooq") + "\n" + result + "dhuhr" + " : " + cityObject.getString("dhuhr") + "\n" + result + "asr" + " : " + cityObject.getString("asr") + "\n" + result + "maghrib" + " : " + cityObject.getString("maghrib") + "\n" + result + "isha" + " : " + cityObject.getString("isha") + "\n"; cityObj.setFajr(""+cityObject.getString("fajr")); }
Have a look in this method: public void mutePrayerTime(View view) { cityModel cityObj= new cityModel(); String fajr=cityObj.getFajr(); Log.d("LOGCAT", "" + cityObj.getFajr()); //StringBuilder newFajr = new StringBuilder(fajr); //newFajr.delete(2,5); //Log.d("newFajr", String.valueOf(newFajr)); // Intent alarm = new Intent(AlarmClock.ACTION_SET_ALARM); //alarm.putExtra(AlarmClock.EXTRA_HOUR, fajr ); } You're just creating cityObj like this cityModel cityObj= new cityModel(); at that point all its properties are null that's why you're seeing null in your log. You should pass the cityObj from your outputTimings method to the mutePrayerTime method: public void mutePrayerTime(View view,cityModel cityObj) { Log.d("LOGCAT", "" + cityObj.getFajr()); //StringBuilder newFajr = new StringBuilder(fajr); //newFajr.delete(2,5); //Log.d("newFajr", String.valueOf(newFajr)); // Intent alarm = new Intent(AlarmClock.ACTION_SET_ALARM); //alarm.putExtra(AlarmClock.EXTRA_HOUR, fajr ); } and then in outputTimings: cityObj.setFajr(""+cityObject.getString("fajr")); someObj.mutePrayerTime(view, cityObj);
Replace characters with substring using a loop Java
I am trying to replace each instance of what is between two brackets using a loop and an array. array1a and array1b are the indices of where the brackets open and close. I want to get the number between the two brackets and increment it by one and replace the value currently there, but as the string text is currently a list (such as "list item (0) list item (10) list item (1023)" I want to use a loop to increment the value of each rather than to set all the values within brackets to the same value. I hope this makes sense! String text = myString.getText(); for (int x = 0; x < 10; x++) { array2[x] = text.substring(array1a[x], array1b[x]); array2[x] = array2[x] + 1; array3[x] = "(" + array2[x] + ")"; String text2 = text.replaceAll("\\(.*\\)", array3[x]); myString.setText(text2); } Full Code: public class CreateVideoList extends JFrame implements ActionListener { JButton play = new JButton("Play Playlist"); JButton addVideo = new JButton("Add Video"); TextArea playlist = new TextArea(6, 50); JTextField videoNo = new JTextField(2); private int x = 0; #Override public void actionPerformed(ActionEvent e) { String key = videoNo.getText(); String name = VideoData.getName(key); String director = VideoData.getDirector(key); Integer playCount = VideoData.getPlayCount(key); String text = playlist.getText(); String rating = CheckVideos.stars(VideoData.getRating(key)); String output = name + " - " + director + "\nRating: " + rating + "\nPlay Count: " + playCount; String newItem = key + " " + name + " - " + director + " (" + playCount + ") " + "\n"; String addToList = ""; String[] array3 = new String[100]; if ("Add Video".equals(e.getActionCommand())) { if (Character.isDigit(text.charAt(0)) == false) { playlist.setText(""); } if (addToList.indexOf(key) == -1) { addToList += addToList + newItem; playlist.append(addToList); array3[x] = key; x++; } else if (addToList.indexOf(key) != -1) { JOptionPane.showMessageDialog(CreateVideoList.this, "This video is already in the playlist. Please select a" + " different video.", "Add to playlist error", JOptionPane.INFORMATION_MESSAGE); } } if ("Play Playlist".equals(e.getActionCommand())) { Integer length = (text.length()); int counta = 0; Integer[] array1a = new Integer[100]; Integer[] array1b = new Integer[100]; String strPlayCount = ""; for (x = 0; x < length; x++) { if (text.charAt(x) == '(') { counta++; array1a[counta - 1] = x; array1a[counta - 1] = array1a[counta - 1] + 1; } if (text.charAt(x) == ')') { array1b[counta - 1] = x; array1b[counta - 1] = array1b[counta - 1]; } } String[] array2 = new String[counta]; String[] array4 = new String[100]; for (int y = 0; y < counta; y++) { array2[y] = text.substring(array1a[y], array1b[y]); array2[y] = array2[y] + 1; playCount = Integer.parseInt(array2[y]); array4[y] = "(" + array2[y] + ")"; String text2 = text.replaceAll("\\(.*\\)", array4[y]); playlist.setText(text2); } } }
Replace array2[x] = array2[x] + 1; array3[x] = "(" + array2[x] + ")"; with Integer n = Integer.parseInt(array2[x]) + 1; array3[x] = "(" + n.toString() + ")";
Java - Parameters are not being passed into function when expected to be
I am attempting to run a method rgbScore() which passes in parameters from previous methods to calculate the difference between two pixels of a image. I would expect the result to be the difference between the two pixels but all I get is (0,0,0) ... public void TypeButtonPressed() { filteredImage(GetType()); int type = GetType(); filteredrgbValue(); originalrgbValue(); rgbScore(originalred, filteredred, originalgreen, filteredgreen, originalblue, filteredblue); //THIS METHOD JOptionPane.showMessageDialog(null, "Original RGB Value:" + oRGBValue + "\nFiltered RGB Value:" + fRGBValue + "\nScore:" + rgbDiff, Options[type], JOptionPane.INFORMATION_MESSAGE); } ... public String rgbScore(int originalred, int filteredred, int originalgreen, int filteredgreen, int originalblue, int filteredblue){ int redDiff = originalred - filteredred; int greenDiff = originalgreen - filteredgreen; int blueDiff = originalblue - filteredblue; return rgbDiff = "(" + redDiff + "," + greenDiff + "," + blueDiff + ")"; } I have declared the variables at the top of the class as follows: public int filteredred; public int filteredgreen; public int filteredblue; public int originalred; public int originalgreen; public int originalblue; < Additional Information > filteredrgbValue(); public String filteredrgbValue(){ BufferedImage filtered = filteredImage; Color filteredRGBValue = new Color(filtered.getRGB(125, 125)); int filteredred = filteredRGBValue.getRed(); int filteredgreen = filteredRGBValue.getGreen(); int filteredblue = filteredRGBValue.getBlue(); return fRGBValue = "(" + filteredred + "," + filteredgreen + "," + filteredblue + ")"; } originalrgbValue(); public String originalrgbValue(){ BufferedImage original = unfilteredImage; Color originalRGBValue = new Color(original.getRGB(125, 125)); int originalred = originalRGBValue.getRed(); int originalgreen = originalRGBValue.getGreen(); int originalblue = originalRGBValue.getBlue(); return oRGBValue = "(" + originalred + "," + originalgreen + "," + originalblue + ")"; }
You are creating new variables in your methods which are hiding your member variables. Remove the type declarations, for example: public String filteredrgbValue(){ BufferedImage filtered = filteredImage; Color filteredRGBValue = new Color(filtered.getRGB(125, 125)); // you are declaring new variables here, hiding your member variables... //int filteredred = filteredRGBValue.getRed(); //int filteredgreen = filteredRGBValue.getGreen(); //int filteredblue = filteredRGBValue.getBlue(); filteredred = filteredRGBValue.getRed(); filteredgreen = filteredRGBValue.getGreen(); filteredblue = filteredRGBValue.getBlue(); return fRGBValue = "(" + filteredred + "," + filteredgreen + "," + filteredblue + ")"; }
Looks like you have never initialized variables, you have just declared the vars. defualt valu for int is 0 and until you dont initialize your vars it will have default vals.
Inputting data to a HashMap
I am making a Minecraft Server Plugin using the Bukkit Api. Basically when my server stops, I use the onDisable() to store two hashmap contents to a config, then when the server starts, I use the onEnable() to take that info from the config and put it back in the HashMaps. That doesn't work. Here are my methods: the saveBans is in the onDisable() and the loadBans is in the onEnable(): public class utilReloadSave { static settingsmanager settings = settingsmanager.getInstance(); public static void saveBans() { ArrayList<String> bans = new ArrayList<String>(); for (UUID play : Cooldown.cooldownPlayers.keySet()) { settings.getConfig().set("bans." + play, Cooldown.getTime(play, "TempBan")); bans.add(play.toString()); } settings.getConfig().set("banlist", bans); settings.saveConfig(); } public static void loadBans() { FileConfiguration config = settings.getConfig(); ArrayList<String> bans = (ArrayList<String>) config.getStringList("banlist"); for (String uuid : bans) { Cooldown.cooldownPlayers.put(UUID.fromString(uuid), new utilCooldown(UUID.fromString(uuid), config.getInt("bans." + uuid), System.currentTimeMillis())); } config.set("bans", null); config.set("banlist", null); settings.saveConfig(); } } That seems to work. The problem is I use a onPlayerJoin Event: #EventHandler public void onLogin(PlayerLoginEvent e) { Player play = e.getPlayer(); if (play.isBanned()) { if (Cooldown.isCooling(play.getUniqueId(), "TempBan")) { File player = new File(basic.plugin.getDataFolder() + "/players/" + play.getUniqueId() + ".yml"); FileConfiguration config = YamlConfiguration.loadConfiguration(player); List<String> list = config.getStringList("banned.temp.reason"); String reason = list.get(list.size()-1); if (Cooldown.getTime(play.getUniqueId(), "TempBan") < 60000L) { e.disallow(PlayerLoginEvent.Result.KICK_BANNED, ChatColor.YELLOW + "" + ChatColor.BOLD + "You are still banned for " + Cooldown.getRemaining(play.getUniqueId(), "TempBan") + " seconds." + ChatColor.RED + " Reason: " + reason); return;} if (Cooldown.getTime(play.getUniqueId(), "TempBan") < 3600000L) { e.disallow(PlayerLoginEvent.Result.KICK_BANNED, ChatColor.YELLOW + "" + ChatColor.BOLD + "You are still banned for " + Cooldown.getRemaining(play.getUniqueId(), "TempBan") + " minutes." + ChatColor.RED + " Reason: " + reason); return;} if (Cooldown.getTime(play.getUniqueId(), "TempBan") < 86400000L) { e.disallow(PlayerLoginEvent.Result.KICK_BANNED, ChatColor.YELLOW + "" + ChatColor.BOLD + "You are still banned for " + Cooldown.getRemaining(play.getUniqueId(), "TempBan") + " hours." + ChatColor.RED + " Reason: " + reason); return;} e.disallow(PlayerLoginEvent.Result.KICK_BANNED, ChatColor.YELLOW + "" + ChatColor.BOLD + "You are still banned for " + Cooldown.getRemaining(play.getUniqueId(), "TempBan") + " days." + ChatColor.RED + " Reason: " + reason); return; } else { File player = new File(basic.plugin.getDataFolder() + "/players/" + play.getUniqueId() + ".yml"); FileConfiguration config = YamlConfiguration.loadConfiguration(player); List<String> list = config.getStringList("banned.perm.reason"); String reason = list.get(list.size()-1); e.disallow(PlayerLoginEvent.Result.KICK_BANNED, ChatColor.YELLOW + "" + ChatColor.BOLD + "You are permanentely banned! " + ChatColor.RED + "" + ChatColor.BOLD + "Reason: " + reason); return; } } } which will check if there is something in the Hashmap but there isn't since it returns the else statement. public static HashMap<UUID, utilCooldown> cooldownPlayers = new HashMap<UUID, utilCooldown>(); public static void add(UUID player, String ability, long seconds, long systime) { if(!cooldownPlayers.containsKey(player)) cooldownPlayers.put(player, new utilCooldown(player)); if(isCooling(player, ability)) return; cooldownPlayers.get(player); utilCooldown.cooldownMap.put(ability, new utilCooldown(player, seconds * 1000, System.currentTimeMillis())); } public static boolean isCooling(UUID player, String ability) { if(!cooldownPlayers.containsKey(player)) return false; if(!utilCooldown.cooldownMap.containsKey(ability)) return false; return true; } public static double getRemaining(UUID player, String ability) { if(!cooldownPlayers.containsKey(player)) return 0.0; if(!utilCooldown.cooldownMap.containsKey(ability)) return 0.0; return utilTime.convert((utilCooldown.cooldownMap.get(ability).seconds + utilCooldown.cooldownMap.get(ability).systime) - System.currentTimeMillis(), TimeUnit.BEST, 1); } public static void removeCooldown(UUID key, String ability) { if(!cooldownPlayers.containsKey(key)) { return; } if(!utilCooldown.cooldownMap.containsKey(ability)) { return; } utilCooldown.cooldownMap.remove(ability); } #SuppressWarnings("deprecation") public static void handleCooldowns() { if(cooldownPlayers.isEmpty()) { return; } for(Iterator<UUID> it = cooldownPlayers.keySet().iterator(); it.hasNext();) { UUID key = it.next(); cooldownPlayers.get(key); for(Iterator<String> iter = utilCooldown.cooldownMap.keySet().iterator(); iter.hasNext();) { String name = iter.next(); if(getRemaining(key, name) <= 0.0) { OfflinePlayer p = Bukkit.getOfflinePlayer(key); p.setBanned(false); removeCooldown(key, name); } } } } public static long getTime(UUID player, String ability) { return (utilCooldown.cooldownMap.get(ability).seconds + utilCooldown.cooldownMap.get(ability).systime) - System.currentTimeMillis(); }
I assume: You have tested that the ArrayList in loadBans is not empty - before blaming the HashMap. You have also checked whether or not these methods loadBans and saveBans are being called. You have manually opened the config files to see what's in there. You can use Debug-mode or extensively use System.out.println(...) for debugging. Whenever something is null or empty, while it shouldn't be - try to go back and see where it wasn't null or empty.