0

私の仮想キーボードはほぼ完成しています。パフォーマンスを向上させようとしています。

お聞きしたいです。これが、ボタンの文字を置き換えるためのより優れた/より高速なソリューションです。

getButtons() => List< JButton >

テキストを置き換える必要があるボタンは 52 個あり、16 個のボタンは他の文字に置き換えられ、36 個は大文字になっています。1.6GHz デュアルコアでは、約 0.5 ~ 0.7 秒かかります。私は約0.2-0.3または瞬時にそれをしたい:D

   public void toLowerCase()
    {

        String[] from =
        {
            "§", "'", "\"", "+", "!", "%", "/", "=", "(", ")", ":", "_", "*", "#", ";", "?"
        };
        String[] to =
        {
            "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ".", "-", "\\", "$", ",", "ß"
        };

        char curChar;
        for (int i = 0; i < getButtons().size(); i++)
        {
            curChar = toChar(((JButton) getButtons().get(i)).getText());
            for (int x = 0; x < from.length; x++)
            {
                if (compareChar(curChar, toChar(from[x])))
                {
                    ((JButton) getButtons().get(i)).setText(to[x]);
                }
            }
            ((JButton) getButtons().get(i)).setText(((JButton) getButtons().get(i)).getText().toString().toLowerCase());
        }
        repaint();
    }

みんな本当にありがとう:-)

4

3 に答える 3

3

はい、地図を使用します :

Map<String, String> map = new HashMap<>();
map.put("§", "0");
...

String toChar = map.get(curChar);
if (toChar!=null) ((JButton) getButtons().get(i)).setText(toChar);

ただし、メソッドの外側でマップを初期化し、再利用する必要があります。

于 2013-05-24T13:35:49.867 に答える
0

私はこれを、データ構造/アルゴリズムの問​​題ではなく、オブジェクト指向設計の問題としてアプローチします。次のようなことを試してください:

public class ToggleCaseJButton extends JButton {

    private final String upperCaseText;

    private final String lowerCaseText;

    public ToggleCaseJButton(String upperCaseText, String lowerCaseText) {
        this.upperCaseText = upperCaseText;
        this.lowerCaseText = lowerCaseText;
    }

    public void setUpperCase() {
        setText(upperCaseText);
    }

    public void setLowerCase() {
        setText(lowerCaseText);
    }
} 

次に、キーボードは次のようになります。

private final List<ToggleCaseJButton> keys = new ArrayList<ToggleCaseJButton>();

private void setupKeys() {
    keys.add(new ToggleCaseJButton("!", "1");
    keys.add(new ToggleCaseJButton("@", "2");
    // etc...
}


public void setUpperCase() {
    for (ToggleCaseJButton key : keys) {
        key.setUpperCase();
    }
    repaint();
}    

public void setLowerCase() {
    for (ToggleCaseJButton key : keys) {
        key.setLowerCase();
    }
    repaint();
}
于 2013-05-24T13:43:22.057 に答える
0

置換を行う代わりに、さまざまなタイプのキーボードを静的に初期化することができます。

static Map<String,String> defaultKeyBoard = ...;  
static Map<String,String> otherKeyBoard = ...;  

static  
{    
    //populate keyboard maps
}  

ブール条件に基づいて、さまざまなキーボードを切り替えることができるようになりました。

一度だけ計算すると、その時間をすべて節約でき、マップを再構築したり、高価な計算を行うことなく、毎回完全に置き換えることができます。

于 2013-05-24T13:37:12.873 に答える