我坚持尝试实现我的小JFrame。基本上我试图从连接到数据库的resultSet构建一个数组,当调用JFrame时,小框架用数据库中的数据填充数组。
这是我构建的完整代码,因为我已经问过并且没有人为我提供解决方案:(当然在java中这必须是常规请求,因为它在PHP等中?
无论如何,如果有人能为我的大学项目提供帮助,我将永远感激不尽。
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());
}
}
}
我真的希望有人可以提供帮助,
感谢
答案 0 :(得分:2)
首先,你应该尊重缩进和Java命名约定,如果你期望一些经验丰富的程序员阅读它(我们是人类,而不是编译器;)
问题:据我所知,你将结果保存在一个局部变量中,但是你没有做任何事情,它就没有了。
答案 1 :(得分:1)
编辑:我认为您的问题是订购问题。在基于alt_*
初始化类时,您正在填充eleArray
变量 - 但只有在调用Result()
方法时才会填充该数组。
根据定义,该方法必须在初始化类之后发生(您无法获得对未构造的类实例的引用),因此这些变量无法反映数据库查找。
我会说你的代码可以通过一些重构来减少它使用的字段的数量;而是在想要使用方法时用方法中的局部变量替换它们。这将不太容易出现订购问题,而且还会使您的代码更多更容易理解。您可能只需要保留对点数组的引用,也可能需要一些GUI内容(例如,Connection
,Statement
和ResultSet
绝对没有理由为类级别字段)。
事实上,我刚看了你的代码,你只需要两个字段:
displayDistance
,它是(正确地)构造函数参数其他所有内容都未使用或只在一种方法中使用。
你的数据库代码对我来说是正确的(好吧,你每次循环都重建eleArray
数组,这似乎是多余但无害的。)
JDBC结果集的典型用法确实采用以下形式:
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);
}
这就是你在这里所做的事情,从每行拉出double
并将其添加到eleResults
。