Reputation: 1
I am stuck with trying to implement my little JFrame. Basically I am trying to build an array from a resultSet that connects to a database and when the JFrame is called the little frame populates the array with data from the database.
Here is the complete code I have constructed as I have asked around and no one has a solution for me :( and surely in java this must be a routine request as it is in PHP ect?
Anyway if anyone could please help as it is for my university project which has to be soon, I would be eternally grateful.
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.sql.Statement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
public class mainStat extends JPanel {
BufferedImage img;
Double[] eleArray;
private Image bg;
private Image pic;
int alt_1 = normalise(eleArray[0]);
int alt_2 = normalise(eleArray[1]);
int alt_3 = normalise(eleArray[2]);
int alt_4 = normalise(eleArray[3]);
int alt_5 = normalise(eleArray[4]);
int alt_6 = normalise(eleArray[5]);
int alt_7 = normalise(eleArray[6]);
int alt_8 = normalise(eleArray[7]);
int alt_9 = normalise(eleArray[8]);
int alt_0 = normalise(eleArray[9]);
private double shop;
private double bike_shop;
private double accomadation;
int alt = 70;
JLabel label1;
private String display_distance;
static String[] eleResults;
Connection con;
Statement stmt;
ResultSet rs;
static double eleOne;
static double eleTwo;
static double eleThree;
static double eleFour;
static double eleFive;
static double eleSix;
static double eleSeven;
static double eleEight;
static double eleNine;
static double eleZero;
//add in constructor method calling paint(Graphics g)
public mainStat(String distance){
display_distance = distance;
label1 = new JLabel();
setBorder(
BorderFactory.createCompoundBorder(
BorderFactory.createCompoundBorder(
BorderFactory.createTitledBorder("Geo-strip"),
BorderFactory.createEmptyBorder(5,5,5,5)),
getBorder()));
add(label1);
}
public void paintComponent(Graphics g){
super.paintComponent(g);
//main GPS strip
try {
img = ImageIO.read(new File("C:\\test\\geo_strip_box_ex.png"));
bg = ImageIO.read(new File("C:\\test\\geo_strip_main_ex.png"));
} catch (IOException e) {
}
// Primary indicator box
g.setColor(Color.WHITE);
g.fillRect(20, 45, 75, 60);
g.drawImage(img, 10, 25, null);
Font font = new Font("Serif", Font.PLAIN, 25);
g.setColor(Color.BLACK);
g.setFont(font);
g.drawString(display_distance, 16, 80);
// Main Geo-data
g.drawImage(bg, 10, 25, null);
// Altitude data
// Point 1
g.setColor(Color.RED);
g.fillOval(105, alt_1, 10, 10);
// Point 2
g.setColor(Color.RED);
g.fillOval(153, alt_2, 10, 10);
// Point 3
g.setColor(Color.RED);
g.fillOval(201, alt_3, 10, 10);
// Point 4
g.setColor(Color.RED);
g.fillOval(249, alt_4, 10, 10);
// Point 5
g.setColor(Color.RED);
g.fillOval(297, alt_5, 10, 10);
// Point 6
g.setColor(Color.RED);
g.fillOval(345, alt_6, 10, 10);
// Point 7
g.setColor(Color.RED);
g.fillOval(394, alt_7, 10, 10);
// Point 8
g.setColor(Color.RED);
g.fillOval(442, alt_8, 10, 10);
// Point 9
g.setColor(Color.RED);
g.fillOval(490, alt_9, 10, 10);
// Point 10
g.setColor(Color.RED);
g.fillOval(540, alt_0, 10, 10);
// Performance blocks that are build out of an array
//first block
g.setColor(Color.BLUE);
g.fillRect(108, 144, 108, 12);
//second block
g.setColor(Color.GREEN);
g.fillRect(218, 144, 108, 12);
//third block
g.setColor(Color.ORANGE);
g.fillRect(329, 144, 108, 12);
//forth block
g.setColor(Color.RED);
g.fillRect(439, 144, 108, 12);
}
private int normalise(double altitude){
//Build the array once correct this part will be changed to allow data base connectivity
;
//Next stage is to find the max values within the array
double max = eleArray[0];
for (int i = 0; i < 10; i++)
if (eleArray[i]> max) max = eleArray[i];
//Replicate the double loop control for the min values
double min = eleArray[0];
for (int i = 0; i < 10; i++)
if (eleArray[i]< min) min = eleArray[i];
//Now set the normalised scale; first with the minimum and then the maximum
double minNalt = 50;
double maxNalt = 120;
double result = maxNalt+(altitude-min)*(minNalt-maxNalt)/(max-min);
int aInt = (int)result;
return aInt;
}
public void Result() {
String query = "SELECT trkpt_ele FROM routes where trkseg_name = '2011-06-14'";
try
{
// Connect to the database
// Similar to php first I need to create a variable to connect to the MySQL database.
String url = "jdbc:mysql://localhost:3306/bicycleinformationschema";
// Now we need to include username and pass and test mysql database connection
Connection con = DriverManager.getConnection(url,"root", "kop98mnbvcxz");
Statement st = con.createStatement();
ResultSet rs = st.executeQuery(query);
ArrayList <Double> eleResults = new ArrayList<Double>();
while (rs.next())
eleResults.add(rs.getDouble(1));
Double[] eleArray = eleResults.toArray(new Double[0]);
}
catch (SQLException ex)
{
System.err.println(ex.getMessage());
}
}
}
I really hope someone can help,
thanks
Upvotes: 0
Views: 528
Reputation: 103817
EDIT: I think your problem is one of ordering. You're populating the alt_*
variables when the class is initialised based on the eleArray
- yet that array only gets populated when the Result()
method is called.
By definition that method has to happen after the class is initialised (you can't get a reference to an unconstructed instance of a class) so there's no way those variables can reflect the database lookup.
I'd say that your code could do with some refactoring to reduce the amount of fields it uses; instead replace them with local variables in methods when you want to use them. This will be less prone to ordering issues, and moreover will make your code much easier to understand. You probably only need to keep a reference to the array of points, and maybe some GUI stuff (there's definitely no reason why the Connection
, Statement
and ResultSet
for example should be class-level fields).
In fact I've just looked through your code and you only need two fields as it stands:
displayDistance
, which is (correctly) a constructor argumentEverything else is either unused or is only used within a single method.
Your database code looks correct to me (well, you're rebuilding the eleArray
array each time round the loop, which seems superfluous but harmless).
Typical use of a JDBC result set would indeed take the form:
ResultSet rs = stmt.executeQuery("...");
List<MyDomainClass> results = new ArrayList<MyDomainClass>();
while (rs.next()) {
MyDomainClass obj;
// create obj by querying rs for this row
results.add(obj);
}
and that's what you're doing here, by pulling out the double
from each row and adding it to eleResults
.
Upvotes: 1
Reputation: 953
First of all, you should respect indentation and Java naming conventions, if you expect some seasoned programmer to read it (we are human, not compilers ;))
The problem: as far as I can understand, you are keeping the results in a local variable, but you are doing nothing with it, it's going nowhere.
Upvotes: 2