0

1から360までの値を持つJSliderがあります。値ごとに、データベースから画像を取得してJLabelに配置します。したがって、データベースから対応する画像を取得するために使用される変数スイッチが唯一の違いである360のケースがあります(以下のコードを参照)。私の「ソリューション」ではコードが非常に重いため、コードを更新する必要があることはわかっています。

何をアーカイブしたいのか明確になったことを願っています。以下はコードです。

degreesSlider = new JSlider(); //my JSlider

degreesSlider.setMajorTickSpacing(10);
degreesSlider.setMaximum(360);
degreesSlider.setMinorTickSpacing(1);
degreesSlider.setOrientation(javax.swing.JSlider.VERTICAL);
degreesSlider.setPaintLabels(true);
degreesSlider.setPaintTicks(true);
degreesSlider.setSnapToTicks(true);
degreesSlider.setValue(0);

degreesSlider.addChangeListener(new ChangeListener() {
            public void stateChanged(ChangeEvent evt) {

                int x = degreesSlider.getValue(); //get JSlider value

                int row = myJTable.getSelectedRow();
                int realIndex = myJTable.convertRowIndexToModel(row);
                String clickJTable = (myJTable.getModel().getValueAt(realIndex, 0).toString()); //detect my JTable row click

                switch (x) {

                    case 1:
                        try {
                            PreparedStatement pst = conn.prepareStatement("select pol, cros from test where degrees = ? AND id_min=?");
                            pst.setInt(1, x); //x is the only variable of the all 360 cases
                            pst.setString(2, clickJTable);
                            ResultSet rs = pst.executeQuery();

                            if (rs.next()) {
                                byte[] imageP = rs.getBytes("pol");
                                byte[] imageC = rs.getBytes("cros");

                                pol = new ImageIcon(imagepolars);
                                cros = new ImageIcon(imagecrossed);

                                mineralsPolars.setIcon(pol); //put image into JLabel
                                mineralsCrossed.setIcon(cros); //put image into JLabel
                            }
                            rs.close();
                            pst.close();
                        } catch (Exception e) {
                        }
                        break;

                    //case 2, 3, 4 ... 360 with the same code and the difference between them is the variable x


                }

            }
        });
4

5 に答える 5

3

各スイッチ句のコードが同じであることを考慮して、スイッチを次のように置き換えてみませんか

 if (x >= 1 && x <= 360) {
     // do the db lookup
 }

編集:

ifステートメントが必要な唯一の理由は、スライダーの値(x)がクエリで指定された範囲内にあることを確認する場合であり、@ NominSimが指摘しているように、スライダーの値はコントロール内にあるため、必要な場合はそれが必要です。

于 2013-02-26T11:54:39.197 に答える
2

ステートメントは必要ないと私は理解していますが、switch必要なのは、スライダーの値に基づいて、アイコンを取得して適切なアイコンで更新する関数だけです。アイコンを取得して更新するコードは値のみに基づいているxため、新しい関数に渡されます。このような関数のパフォーマンスを向上させるために、プリペアドステートメントオブジェクトの作成をこの関数の外に移動できます。呼び出しごとにプリペアドステートメントオブジェクトを作成すると、プリペアドステートメントのほとんどすべての利点がキャンセルされ、呼び出し/スライダーの値の変更ごとにそのような重いオブジェクトを作成するのは非常にコストがかかります。

DAOオブジェクトを使用してdbロジックを1つの場所にカプセル化し、SQLおよびdbロジックでUIコードを汚染しないようにすることをお勧めします。このように、作成済みのステートメントを再利用してコードを再利用することで、パフォーマンスを向上させることができます。

于 2013-02-26T11:53:48.753 に答える
1

各ケース値は、変数ではなく、コンパイル時定数/式である必要があります。switchステートメントに関連付けられた2つのcase定数式が同じ値を持つことはできません。

あなたが持つことができるのは、選択された値でサブルーチンを呼び出すことです

何かのようなものchangeLabelImgTo(int count);

于 2013-02-26T11:58:25.353 に答える
0

コードをメソッドに抽出し、変数を渡しますx

public void stateChanged(ChangeEvent evt) {
    ...
    fetchImage(x);
    ...
}


private void fetchImage(int x) {

    try {
        PreparedStatement pst = conn.prepareStatement("select pol, cros from test where degrees = ? AND id_min=?");
        pst.setInt(1, x); //x is the only variable of the all 360 cases
        pst.setString(2, clickJTable);
        ResultSet rs = pst.executeQuery();

        if (rs.next()) {
            byte[] imageP = rs.getBytes("pol");
            byte[] imageC = rs.getBytes("cros");

            pol = new ImageIcon(imagepolars);
            cros = new ImageIcon(imagecrossed);

            mineralsPolars.setIcon(pol); //put image into JLabel
            mineralsCrossed.setIcon(cros); //put image into JLabel
        }
        rs.close();
        pst.close();
    } catch (Exception e) {
    }

}
于 2013-02-26T11:54:34.597 に答える
0

ここで何かが足りないかもしれませんが、case内のコードブロックがすべて同じである場合、結局、なぜswitchcaseを使用しているのでしょうか。

于 2013-02-26T11:57:55.913 に答える