日安。因此,我想问您如何在从JEditorPane获得的字符串中更改子字符串。
我为和弦的变化做了一个程序,C到C#,C# to D,D# to E,E to F,F to F#,F# to G,G to G#,.
我编写了代码,但是如果我用end.For编写JEditorPane的话,它总是从乞讨到JEditorPane示例。
“C D# E”- F#。我如何才能只做一个步骤的更改(只有C到C#,D#到E,E到F)?
if (event.getSource()== ok)
{
Object contents = akordib.getSelectedItem();
if (contents == "+1 step")
{
finalStr = textPanel.getText();
if (finalStr.contains(" C ") == true)
{
finalStr = finalStr.replaceAll(" C" , " C#");
textPanel.setText(finalStr);
}
if (finalStr.contains(" C# ") == true)
{
finalStr = finalStr.replaceAll(" C# ", " D ");
textPanel.setText(finalStr);
}
}
}下面是一个例子:原文:
C D# E
在守则之后应该是:
C# E、F
发布于 2014-10-31 14:20:04
用另一种方式写。正在发生这种情况,因为在测试C#时,您已经将C设置为C#。
发布于 2014-10-31 14:37:07
您当前的问题是您要替换条目的顺序。当你一开始
C D# E并将每个C替换为C#,您的变量将包含
C# D# E如果然后将所有C#替换为D,则变量将包含
D D# E等。
在另一个方向上替换它们将解决问题,例如,首先将C#替换为D,然后才将C替换为C#。
唯一棘手的部分是,您需要能够绕过并替换H到C。解决方案是从用X替换H开始(或任何其他没有出现的字符),按照正确的顺序执行所有其他替换,最后一步用C替换X。
发布于 2014-10-31 15:13:32
首先,您可能不应该使用final作为变量的名称,因为final是Java中的关键字。
其次,您可能应该在一个空格上拆分字符串,然后循环这个数组,每个音符跳半步。
String notes = textPanel.getText();
String[] notesArr = notes.split(" ");
StringBuilder newNotes = new StringBuilder();
for(int i=0; i < notesArr.length; i++) {
String newNote = moveHalfStep(notesArr[i]);
newNotes.append(newNote);
newNotes.append(" ");
}
textPanel.setText(newNotes.toString());
private String moveHalfStep(String note) {
String newNote = "";
if(note.contains("#")) {
char[] noteChars = note.toCharArray();
char noteChar = noteChars[0];
noteChar++;
if(noteChar == 'H') {
noteChar = 'A';
}
newNote = String.valueOf(noteChar);
} else {
newNote = note + "#";
}
return String.valueOf(newNote);
}https://stackoverflow.com/questions/26676816
复制相似问题