mySQL adding duplicate data to TableView in JavaFX - java

I want to add data from mySql database to a table view using observable list as well, using a "Refresh button" that adds new rows to the tableview everytime it is clicked. Here is the code:
public void refreshPage(){
Order curOrder = ordersList.getSelectionModel().getSelectedItem();
ordersList.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
String query = "SELECT orderID, orderStatus, orderTotalCost FROM ORDERS";
try {
DatabaseConnection DBconn = new DatabaseConnection();
connection = DBconn.getDatabaseLink();
// connection = DatabaseConnection.getConnection();
statement = connection.createStatement();
resultSet = statement.executeQuery(query);
while (resultSet.next()){
Order newOrder = new Order(resultSet.getString("orderID"), resultSet.getString("orderStatus"), resultSet.getDouble("orderTotalCost"));
orders.add(newOrder);
}
ordersList.setItems(orders);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
refreshPage() is linked to a button on the javaFX stage.
ordersList is the tableView and orders is the observable list.
However, the issue is that when clicking the refresh page button multiple times, it adds the same rows from the data base over and over, I only want it to add unique values to the tableview from the database.

You can use ObservableSet to avoid adding duplicated items.
Create set:
ObservableSet<Order> observableSet = FXCollections.observableSet();
Add new items to set (duplicates will be skipped):
observableSet.add(newOrder);

Related

JTable not showing added entries in database

Im creating an inventory system for our project in school but I stumbled across a problem, I have two forms, when I click the add button in my firstform called mainform, a new form will show the addjframe form, I then put entries, but when I click the add button in the addjframe form the data is in my ms-access database, but my jtable is blank
I tried making my table public static so that it can be called on my second form
heres the code for for my table on the mainform
public static void AddRowToJTable(Object[] dataRow)
{
DefaultTableModel dtm ;
dtm= (DefaultTableModel)jTable1.getModel();
dtm.addRow(dataRow);
dtm.setRowCount(0);
}
heres the code for my add button on the Addjframe form/second form
private void btnaddActionPerformed(java.awt.event.ActionEvent evt) {
String title = txttitle.getText();
String author = txtauthor.getText();
String date = txtdate.getText();
String genre = txtgenre.getText();
try {
Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
Connection con = DriverManager.getConnection("jdbc:ucanaccess://D:/elibrary1.accdb");
Statement st = con.createStatement();
st.execute("INSERT INTO libtable(Title,Author,Dateadded,Genre) VALUES ('"+title+"','"+author+"','"+date+"','"+genre+"')");
String sql = "Select * from libtable";
ResultSet rs = st.executeQuery(sql);
while (rs.next()) {
mainform.AddRowToJTable(new Object[]{rs.getString(1),rs.getString(2),rs.getString(3),rs.getString(4)});
}
}
catch (Exception e) {
System.out.print(e.getMessage());
}
}
It should show the entries on my jtable i dont know whats wrong with my code, ive been stuck on this for days, I dont receive any error messages, because the entries are being put in my ms-access database its just that it doesnt show on my jtable
Any help would be appreciated!
here's my first form the table is not showing anything when i click add on my second form
this is my second form to add data in the database
here is my ms-access database showing my recently entered data at the bottom

stop ResultSet from firing pop-ups when database table has no records

I have the intention of creating pop-ups when a particular table has records and when there are no records in that table, the pop-ups will stop showing.
the pop-ups serves as a notification to the user on tasks that has been done(record entries) and when the user confirms he has seen those records, the records will be deleted and the pop-ups wont show until there are records entered into the table again for another confirmation.
I used ScheduledExecutorService to create a runtime for the method where this code must check the ResultSet every 10 seconds for records and if there are no records, the method won't be fired.
try{
String sql="select * from confirm_purchase";
pst=con.prepareStatement(sql);
rs=pst.executeQuery();
if(rs.first()){
Runnable runnable = new Runnable() {
#Override
public void run() {
int d2 = JOptionPane.showConfirmDialog(null,"new purchased item(s) have been recorded.\ndo you wish to view them?","view current items purchased",JOptionPane.YES_NO_OPTION);
if(d2==0){
confirmItemPurchase cip = new confirmItemPurchase();
cip.setVisible(true);
}
}
};
ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
service.scheduleAtFixedRate(runnable, 0, 10, TimeUnit.SECONDS);
}else{
System.out.println("no data yet");
}
}catch(Exception e){
JOptionPane.showMessageDialog(null,e);
}finally{
try{
rs.close();
pst.close();
}
catch(Exception e){
}
}
This code works fine and the pop-ups appear. but when the records are cleared in the table, the pop-up still shows up.
How do I stop the pop-up from showing when there are no records in the table.

Deleting data from table view and from sql

I want to delete the data from table view and from SQL,after i tried almost everything i don't know where the problem is?
public void DeleteButton(ActionEvent event) throws SQLException,
ClassNotFoundException{
String sql = "Delete from Add_NewOrder where No=?";
try{
pst = con.prepareStatement(sql);
pst.setString(1, comboBoxTable.getValue());
int i = pst.executeUpdate();
if(i==1){
Alert alert = new Alert(AlertType.ERROR);
alert.setTitle("Information Dialog");
alert.setHeaderText(null);
alert.setContentText("Te dhenat nuk jane shlyer!");
alert.showAndWait();
loadDataFromDataBase();
clearTextField();
}
}catch(SQLException ex){
Logger.getLogger(AddNewOrderController.class.getName()).log(Level.SEVERE,null,ex);
}
}
Which part isn't working?
I see lots of problems with your code:
Connection and PreparedStatement appear to be class variables. I'd keep PreparedStatement in method scope and close it in a finally block.
Method is doing two things: database and Swing UI change. Separate them into individual classes and methods. Test them separately and combine them when both are working.
Mixing UI and processing code in the same class is something I try to avoid. I'd partition them into separate classes.

How to bind JTable with database using Hibernate

Hi,
I have database in MySql and want to get my table to be bind with Swing JTable.
Now my DAO class retrieves data from my table and stores it into java.util.List.
What approaches I could use to bind db table with JTable?
As you have data fetched from Database wrapped by DAO, using DAO put those information in relevant row/column of your JTable.
Here are SO Question and answer for your requirement. Hope they will help you.
Populate JTable Using List
Java GUI aplication, load data to Jtable from a list<objects>
How to add data to JTable created in design mode?
Other Resources.
http://docs.oracle.com/javase/tutorial/uiswing/components/table.html
Session sesion = HibernateUtil.getSessionFactory().openSession();
Transaction tx = null;
try {
tx = sesion.beginTransaction();
List today = sesion.createQuery("FROM class WHERE something").list();
for (Iterator iterator = today.iterator(); iterator.hasNext();){
Salidas Sal = (Salidas) iterator.next();
tablemodel.addRow(new Object[]{
//`enter code here`columns
Sal.getId(),
Sal.getUsuarios().getNombre().toString(),
Sal.getCantidadPrestada(),
Sal.getCantidadPedida(),
Sal.getFechaSalida()});
}
tx.commit();
} catch (HibernateException e) {
if (tx != null) {
tx.rollback();
}
e.printStackTrace();
} finally {
sesion.close();
}

Retrieving text from JTextField

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.
}
});

Categories