I have created user login window in java and i am getting some issues regarding retrieving saved data from ms access database.
Here is my code:
package databaseretrievedata;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.*;
import javax.swing.*;
public class Databaseretrievedata {
Databaseretrievedata(){
JFrame edit=new JFrame();
edit.setBounds(300,200,550,120);
edit.setUndecorated(false);
edit.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel p=new JPanel();
p.setBounds(0,0,600,400);
edit.add(p);
JTextField field=new JTextField(20);
field.setBounds(100,200,120,20);
p.add(field);
JTextField field1=new JTextField(20);
field1.setBounds(100,300,120,20);
p.add(field1);
JButton b=new JButton("Click Me");
b.setBounds(0,100,100,20);
p.add(b);
JRootPane pane=b.getRootPane();
pane.setDefaultButton(b);
b.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e)
{
try {
Connection conn=DriverManager.getConnection("jdbc:ucanaccess://C:\\Users\\MUHAMMAD SHAHAB\\real estate.accdb");
Statement st=conn.createStatement();
String sql="select Username,Password from table where Username='"+field+"'and Password='"+field1+"'";
ResultSet rs=st.executeQuery(sql);
if(rs.next())
{
JFrame editframe=new JFrame();
editframe.setBounds(300,200,400,200);
editframe.setUndecorated(false);
editframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
editframe.setVisible(true);
}
else
{
JOptionPane.showMessageDialog(null,"No record Found");
}
}
catch (Exception ex)
{
JOptionPane.showMessageDialog(null, ex);
}
}
});
edit.setVisible(true);
}
public static void main(String[] args) {
Databaseretrievedata v=new Databaseretrievedata();
}
}
Here is the file in the database where i saved my data.[![enter image description here][1]][1]
I have created one text field for username and password field for getting password from the user inside JFrame and when i entered the same username and password which i saved in ms access database i got 'No record Found'although i have saved that data in the database and i want this,that when user enter username and password in the provided fields then a new JFrame opens up.
I am not pretty sure where i am doing mistake.
#Swager you are missing getText() method from your query
you should write your sql like this String sql = "select Username,Password from simba where Username='"+field.getText()+"'and Password='"+field1.getText()+"'";
Your sql is missing something, your statement:
String sql="select Username,Password from simba where Username='"+field+"'and Password='"+field1+"'";
This won't be what you're actually expecting here. Since the JTextField does not provide a special toString() method for its text, so that's why you can't find any matching entry in your database.
You need to retrieve the entered username, respectively the password by calling the getText() method on the JTextField:
String sql = "select Username,Password from simba where Username='"+field.getText()+"'and Password='"+field1.getText()+"'";
In such cases it is helpful to also print your query to the console to spot mistakes instantly
Java Code:
private void AddUserActionPerformed(java.awt.event.ActionEvent evt) {
try{
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost/MyPOS","root","");
Statement stmt = (Statement)conn.createStatement();
String fname = fld_fname.getText();
String lname = fld_lname.getText();
String role = cmb_role.getSelectedItem().toString();
String uname = fld_username.getText();
String pass = fld_password.getText();
String add = "INSERT INTO admin (firstname, lastname, role, username, password) VALUES('"+fname+"', '"+lname+"', '"+role+"', '"+uname+"', '"+pass+"');";
stmt.executeUpdate(add);
conn.close();
JOptionPane.showMessageDialog(this,"Personnel Added","Add Personnel",JOptionPane.OK_OPTION);
}catch(Exception e){
JOptionPane.showMessageDialog(null, e.getMessage(), "ERROR",JOptionPane.ERROR_MESSAGE);
System.out.println(e.getMessage());
}
I have this Java code for my POS System, Im wondering why is there a this in the JOptionPane.showMessageDialog(this,...,...)
Also, how do I display it on a table with the corresponding columns?
As described by the JavaDocs
Parameters:
parentComponent - determines the Frame in which the dialog is displayed; if null, or if the parentComponent has no Frame, a default Frame is used
This allows the JOptionPane to find the parent frame of the component showing the dialog, this helps with, among other things, to allow the dialog to be positioned relative to the component. In some cases, you don't have a component reference, in which case, it's fine to use null
import java.sql.*;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
class ComboExample {
Connection con;
Statement st;
ResultSet rs;
ComboExample() {
JFrame f = new JFrame();
f.getContentPane().setLayout(null);
final JComboBox combo = new JComboBox();
try {
String driver = "sun.jdbc.odbc.JdbcOdbcDriver";
Class.forName(driver);
String db = "jdbc:odbc:TTracking";
con = DriverManager.getConnection(db);
// Getting database info
DatabaseMetaData meta = con.getMetaData();
System.out.println("Server name: " +
meta.getDatabaseProductName());
System.out.println("Server version: " +
meta.getDatabaseProductVersion());
System.out.println("");
System.out.println("Creating statement...");
st = con.createStatement();
String sql = "SELECT Trailer FROM TrailerLocationMaster";
ResultSet rs = st.executeQuery(sql);
while (rs.next()) {
String trailer = rs.getString("Trailer");
combo.addItem(trailer);
System.out.println(rs.getString("Trailer"));
combo.setVisible(true);
}
}
catch (Exception ex) {
}
combo.setBounds(20, 50, 150, 20);
f.add(combo);
f.setSize(400, 200);
f.setVisible(true);
}
public static void main(String[] args) {
ComboExample c = new ComboExample();
}
}
The combo-box displays correctly, but only one item from the database table appears why is that? and how do I allow multiple items to be in jcombobox from database? Also why does it always complain with and advises suppress warnings?
Don't use a null layout and setBounds(...). Swing was designed to be used with layout managers.
There is no need for comboBox.setVisible(true) since Swing components (except for top level containers) are visible by default.
Also why does it always complain with and advises suppress warnings?
You haven't specified the type of data that will adding the to the model of the combo box. You are adding String data so you should be using:
JComboBox<String> combo = new JComboBox<String>();
Read up on Generics for more information.
how do I allow multiple items to be in jcombobox from database?
You don't do anything special. Your code looks reasonable since you have a while loop and you invoked the addItem(...) method.
If you only have one item, then I would guess your query only returns a single item. Your output should verify this. Add more data to your table.
I want to develop a piece of software that helps the user to open and close a Neo4j embedded server within my java application. Practically, I click the button and the web admin tool should be opened in the default web browser. However, I am stuck because I have a problem with the line code
InternalAbstractGraphDatabase graphdb = getGraphDb();
I don't understand how to open my implemented db which is in the variable:
private static GraphDatabaseService BORO_DB;
and has path:
public static String DB_PATH;
Below the code:
final Variable var = new Variable(true);
InternalAbstractGraphDatabase graphdb = getGraphDb();
final WrappingNeoServerBootstrapper srv;
srv = new WrappingNeoServerBootstrapper( graphdb );
final JButton btnNewButton = new JButton("Show Graph - Start Server");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
if (var.getVar()){
var.setVar(false);
btnNewButton.setText("Graph - Stop Server");
srv.start();
try {
String url = "http://localhost:7474";
java.awt.Desktop.getDesktop().browse(java.net.URI.create(url));
}
catch (java.io.IOException e) {
System.out.println(e.getMessage());
}
}else{
var.setVar(true);
btnNewButton.setText("Show Graph - Start Server");
srv.stop();
}
}
});
May you teach me how to link my DB (BORO_DB) to getGraphDb()?
Thank you
Using DB_PATH, you can instantiate BORO_DB like this:
BORO_DB = new GraphDatabaseFactory().newEmbeddedDatabase(DB_PATH);
srv=new WrappingNeoServerBootstrapper((GraphDatabaseAPI) BORO_DB);
The concept of my code is that, it will initially retrieve distinct names from a column 'tname' of my access database table 'try'. It will add those items in a combobox. Once we select an item in the combo box, the data of the row containing tname as the selected item is retrieved and showed in textfields. Then I will make some changes to the text field content. After that, if I click 'Save' button, then all the data of the row containing tname as the selected combobox item must be updated with the new content in the textfields.
Everything goes fine, except the last one. When I click 'save' it considers only the previous text(the one intially retrieved from the database when we select combobox) and not the changes made to it. Kindly help me to diagnose the problem.
Thanks in advance.
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
import java.util.Date;
import java.sql.*;
import java.text.*;
public class gut implements ActionListener
{
JComboBox ctn;
JTextField cm,exd,stk,cst,sup,snum,r;
String stn,scm,sexd,sst,scst,ssup,ssnum,sr,icm,iexd,istk,icst,isup,isnum,ir;
JLabel lt,lc,le,ls,lcs,lsp,lspn,lr;
JButton s;
JFrame gp=new JFrame();
public gut()
{
gp.setSize(500,500);
gp.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
gp.setLayout(null);
lt=new JLabel("Tablet Name",JLabel.RIGHT);
lc=new JLabel("Composition",JLabel.RIGHT);
le=new JLabel("Expiry Date (dd/mm/yyyy)",JLabel.RIGHT);
ls=new JLabel("Stock",JLabel.RIGHT);
lcs=new JLabel("Cost",JLabel.RIGHT);
lsp=new JLabel("Supplier",JLabel.RIGHT);
lspn=new JLabel("Supplier Number",JLabel.RIGHT);
lr=new JLabel("Rack",JLabel.RIGHT);
lt.setBounds(100,120,120,20);
lc.setBounds(100,140,120,20);
le.setBounds(60,160,160,20);
ls.setBounds(100,180,120,20);
lcs.setBounds(100,200,120,20);
lsp.setBounds(100,220,120,20);
lspn.setBounds(100,240,120,20);
lr.setBounds(100,260,120,20);
ctn=new JComboBox();
cm=new JTextField();
exd=new JTextField();
stk=new JTextField();
cst=new JTextField();
sup=new JTextField();
snum=new JTextField();
r=new JTextField();
ctn.setBounds(240,120,120,20);
cm.setBounds(240,140,120,20);
exd.setBounds(240,160,120,20);
stk.setBounds(240,180,120,20);
cst.setBounds(240,200,120,20);
sup.setBounds(240,220,120,20);
snum.setBounds(240,240,120,20);
r.setBounds(240,260,120,20);
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection conn=DriverManager.getConnection("jdbc:odbc:vasantham","","");
Statement st=conn.createStatement();
ResultSet rs=st.executeQuery("select DISTINCT tname from try");
while(rs.next())
{
ctn.addItem(rs.getString("tname"));
}
conn.close();
}
catch(Exception e)
{
}
gp.add(lt);gp.add(ctn);
gp.add(lc);gp.add(cm);
gp.add(le);gp.add(exd);
gp.add(ls);gp.add(stk);
gp.add(lcs);gp.add(cst);
gp.add(lsp);gp.add(sup);
gp.add(lspn);gp.add(snum);
gp.add(lr);gp.add(r);
ctn.addActionListener(this);
s=new JButton("Save");
s.setBounds(200,300,100,20);
gp.add(s);
s.addActionListener(this);
gp.setVisible(true);
}
public void actionPerformed(ActionEvent evt)
{
String act=evt.getActionCommand();
String scb=(String)ctn.getSelectedItem();
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection conn=DriverManager.getConnection("jdbc:odbc:vasantham","","");
Statement st=conn.createStatement();
ResultSet rs=st.executeQuery("select * from try where tname='"+scb+"'");
SimpleDateFormat formatter=new SimpleDateFormat("dd/MM/yyyy");
while(rs.next())
{
icm=rs.getString("composition");
iexd=formatter.format(rs.getDate("exdate"));
istk=Integer.toString(rs.getInt("stock"));
icst=rs.getString("cost");
isup=rs.getString("sup");
isnum=rs.getString("supnum");
ir=rs.getString("rack");
}
cm.setText(icm);
exd.setText(iexd);
stk.setText(istk);
cst.setText(icst);
sup.setText(isup);
snum.setText(isnum);
r.setText(ir);
conn.close();
}
catch(Exception e)
{
System.out.println(e);
}
if(act.equals("Save"))
{
scm=cm.getText();
sexd=exd.getText();
sst=stk.getText();
scst=cst.getText();
ssup=sup.getText();
ssnum=snum.getText();
sr=r.getText();
System.out.println(scm+","+sexd+","+sst+","+scst+","+ssup+","+ssnum+","+sr);
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection conn=DriverManager.getConnection("jdbc:odbc:vasantham","","");
PreparedStatement ps=conn.prepareStatement("UPDATE try set composition=?,exdate=?,stock=?,cost=?,sup=?,supnum=?,rack=? where
tname=?");
ps.setString(1,scm);
ps.setString(2,sexd);
ps.setString(3,sst);
ps.setString(4,scst);
ps.setString(5,ssup);
ps.setString(6,ssnum);
ps.setString(7,sr);
ps.setString(8,scb);
ps.executeUpdate();
JOptionPane.showMessageDialog(null,"Your entry has been stored successfully!!!");
}
catch(Exception e)
{
JOptionPane.showMessageDialog(null,"Error!Try again!");
System.out.println(e);
}
}
}
public static void main(String[] args)
{
new gut();
}
}
On top of what everybody else has already said, if you REALLY want to use a single action listener, you are going to need to work out which action has actually occurred.
You could check the source of the ActionEvent (evt.getSource()) or, more appropriately, you could assign a action command to each component using the action listener.
Check out JComboBox.setActionCommand(...) and JButton.setActionCommand(...)
After that, it's a simple case of checking the ActionEvent.getActionCommand() property to determine the correct action to take.
The problem is that every time you hit the "Save" button you are retrieving the information from the database over again, so, you overwrite the TextFields and then you read from the TexFields content. Try to take out this part:
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection conn = DriverManager.getConnection
("jdbc:odbc:vasantham", "", "");
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("select * from try where tname='"
+ scb + "'");
SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
while (rs.next()) {
icm = rs.getString("composition");
iexd = formatter.format(rs.getDate("exdate"));
istk = Integer.toString(rs.getInt("stock"));
icst = rs.getString("cost");
isup = rs.getString("sup");
isnum = rs.getString("supnum");
ir = rs.getString("rack");
}
cm.setText(icm);
exd.setText(iexd);
stk.setText(istk);
cst.setText(icst);
sup.setText(isup);
snum.setText(isnum);
r.setText(ir);
conn.close();
} catch (Exception e) {
System.out.println(e);
}
from the action performed method.
Every time your action event is fired, you read data from DB and write it into the textfields.
You can change that text and it will be displayed correctly in your textfields. But when you click save, all your changes are overwritten with the DB values again.
So you have to separate the functionalities "read from DB" and "write changes".
edit:
oops, too slow..
Your actionPerformed() function retrieves the information from the database every time. If you press the Save button it will first retrieve the information and then save the information if the action command is "Save". This is why you always get the information that's currently in the database from getText() when pressing the Save button.
Make a different function / actionListener to execute when the Save button is pressed or take the part of the code that updates the text fields else where.
Try something like this instead:
JButton saveButton = new JButton( new AbstractAction("save") {
#Override
public void actionPerformed( ActionEvent e ) {
// Save the info here or just call a function that will.
}
});