I'm passing values for a java file which creates a JTable.
ResultSet res = np.InvestmentByInvestType(IType);
String tablename = "Investment By Invest Type";
int customAmt = np.showCustomizeInvestAmount1(IType);
CommonTable ct = new CommonTable();
ct.CommonSearchTable(res, customAmt,tablename);
I created a button in CommonSearchTable to export the JTable data using the ResultSet. But it showing error "Operation not allowed after ResultSet closed". A method in CommonSearchTable.java is as below:
public void CommonSearchTable( final ResultSet res, int totally, final String tablename) throws SQLException
{
JButton exportTable= new JButton ("Export");
ResultSetMetaData metaData = res.getMetaData();
// names of columns
Vector<String> columnNames = new Vector<String>();
int columnCount = metaData.getColumnCount();
for (int column = 1; column <= columnCount; column++)
{
columnNames.add(metaData.getColumnName(column));
}
// data of the table
Vector<Vector<String>> data = new Vector<Vector<String>>();
while (res.next())
{
Vector<String> vector = new Vector<String>();
for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++)
{
vector.add(res.getString(columnIndex));
}
data.add(vector);
}
model1 = new DefaultTableModel(data, columnNames);
JTable table = new JTable(model1);
int rows = table.getRowCount();
Sorter = new TableRowSorter<DefaultTableModel> (model1);
table.setRowSorter(Sorter);
showSearchPages(30, 1);
table.setModel(model1);
String showTotal = "Total Amount : Rs."+totally+"/-";
JPanel footer = new JPanel();
JLabel show = new JLabel(showTotal);
box1.setBounds(10,30,800,30);
show.setBounds(10, 60, 100, 30);
show.setFont(new Font("Tahoma",Font.BOLD,16));
footer.add(box1);
footer.add(show);
footer.setPreferredSize(new Dimension(800,100));
JPanel holdingPanel = new JPanel(null);
JScrollPane sp = new JScrollPane(table);
JButton print = new JButton ("Print");
print.setBounds(10,10,100,30);
exportTable.setBounds(120,10,100,30);
sp.setBounds(10,50,780,580);
holdingPanel.add(print);
holdingPanel.add(exportTable);
holdingPanel.add(sp);
JFrame f = new JFrame("Search Results");
f.getContentPane().add(holdingPanel,BorderLayout.CENTER);
f.getContentPane().add(sp.getVerticalScrollBar(),BorderLayout.EAST);
f.getContentPane().add(footer,BorderLayout.SOUTH);
f.setPreferredSize(new Dimension(850,680));
f.pack();
f.setLocationRelativeTo(null);
f.dispose();
f.setResizable(false);
f.setIconImage(img.getImage());
f.setVisible(true);
exportTable.addActionListener(new ActionListener()
{
#Override
public void actionPerformed(ActionEvent aev)
{
try
{
ExportFile ef = new ExportFile();
ef.WriteFile(res, tablename);
}
catch (SQLException | IOException ex)
{
Logger.getLogger(CommonTable.class.getName()).log(Level.SEVERE, null, ex);
}
}
});
print.addActionListener(new ActionListener()
{
#Override
public void actionPerformed(ActionEvent e)
{
PrinterJob printJob = PrinterJob.getPrinterJob();
if (printJob.printDialog())
try
{
printJob.print();
}
catch(PrinterException pe)
{
}
}
});
}
Please show me the way.
As you can read in the docs for Resultset:
A ResultSet object is automatically closed when the Statement object
that generated it is closed, re-executed, or used to retrieve the next
result from a sequence of multiple results.
This means you have to copy the result data into another data structure (like a list, map, whatever suits your needs) before closing the database connection.
Look at this example this will help you. In this example we fetch all data from database on jcombobox actionlistener. Change this according to your need.
class Credit extends JFrame implements ActionListener{
private String value4="0";
private String val="0";
private String val1="0";
private String jama="0",baki="0";
private String nettdate="0",nettb="0",nettbal="0";
private int row=0,count=0,aa=0,bb=0,t1=0;
private String tj1="0",tb1="0",gt1="0";
String h[]={"TID","Date","Jama","Baki","Nett"};
private TableModel buildTableModel(ResultSet rs) throws SQLException {
ResultSetMetaData metaData = rs.getMetaData();
// names of columns
Vector<String> columnNames = new Vector<String>();
int columnCount = metaData.getColumnCount();
for (int column = 0; column < columnCount; column++) {
//columnNames.add(metaData.getColumnName(column));
columnNames.add(h[column]);
}
// data of the table
//Vector<Object> vector = new Vector<Object>();
//Vector<Object> vector1 = new Vector<Object>();
Vector<String> vector1 = new Vector<String>();
Vector<String> vector2 = new Vector<String>();
Vector<Vector<String>> data = new Vector<Vector<String>>();
//Vector<Vector<Object>> data = new Vector<Vector<Object>>();
while (rs.next()) {
//for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) {
Vector<String> vector = new Vector<String>();
//vector.add(rs.getString(columnIndex));
vector.add(rs.getString(1));
vector.add(rs.getString(2));
vector.add(rs.getString(3));
vector.add(rs.getString(4));
vector.add(rs.getString(5));
// System.out.println(vector);
//}
count++;
data.add(vector);
//System.out.println(data.get(0).get(0));
}
for(int i=0;i<count;i++){
//aa=aa+Integer.parseInt(data.get(i).get(2));
aa=aa+Integer.parseInt(table.getValueAt(i, 2).toString());
System.out.println(table.getValueAt(i, 2).toString());
System.out.println("A:"+aa);
//bb=bb+Integer.parseInt(data.get(i).get(3));
bb=bb+Integer.parseInt(table.getValueAt(i, 3).toString());
System.out.println(table.getValueAt(i, 3).toString());
System.out.println("B:"+bb);
}
tj1=Integer.toString(aa);
System.out.println("TJ:"+tj1);
//header1 = new Vector<String>();
vector1.add("");
vector1.add("Total");
vector1.add(tj1);
tb1=Integer.toString(bb);
//header1 = new Vector<String>();
//header3.add("Total");
vector1.add(tb1);
vector1.add("");
//data1.setSize(table1.getRowCount()+1);
//data1.set(table1.getRowCount()-1, header3);
//data.setSize(count++);
//data.setSize(table.getRowCount()+1);
//data.set(count, header2);
System.out.println("h2:"+vector1);
data.add(vector1);
System.out.println("data:"+data);
//data.set(table.getRowCount()-1, header2);
t1=Integer.parseInt(tb1)-Integer.parseInt(tj1);
gt1=Integer.toString(t1);
System.out.println("GT:"+gt1);
vector2.add("");
vector2.add("Nett Balance");
//header4.add("");
vector2.add("");
vector2.add(gt1);
vector2.add("");
//data.setSize(table.getRowCount()+1);
//data.setSize(count++);
data.add(vector2);
System.out.println("data1:"+data);
//data.set(count, header3);
//data.set(table.getRowCount()-1, header3);
//header2.add("");
count=0;
aa=0;
bb=0;
t1=0;
tj1="0";
tb1="0";
gt1="0";
return new DefaultTableModel(data, columnNames);
}
private static final int GAP = 5;
private static final Font BTN_FONT = new Font(Font.DIALOG, Font.PLAIN, 15);
private JPanel mainPanel = new JPanel();
JButton add,cancel,show,search,print,update,delete,net;
JTextField jTextField,jTextField1,jTextField2,jTextField3,jTextField4,jTextField5;
JComboBox jComboBox;
String Select[]={"Select"};
Object name,s1;
String an="0",nam="0",mono="0",cit="0";
int token=0,tid=1,a,stid=0;
JFrame f;
AbstractAction action;
private String id;
Connection con=null;
Statement st=null;
ResultSet rs=null;
//private String stid;
JPanel tablePanel;
DefaultTableModel model;
DefaultTableModel model1;
JTable table,table3;
private Vector<Vector<String>> data; //used for data from database
private Vector<Vector<String>> data1; //used for data from database
private Vector<String> header; //used to store data header
private Vector<String> header2; //used to store data header
private Vector<String> header3;
private Vector<String> header4;
private JLabel jlab4,jlab5,jlab6,jlab7;
Credit(JFrame frm){
Toolkit tk=Toolkit.getDefaultToolkit();
Image img=tk.getImage("1.jpg");
setIconImage(img);
JPanel creditPanel = createPanel1("Customer Credit & Debit Amount");
tablePanel = createPanel2("Customer Credit & Debit Table");
creditPanel.setBackground(Color.WHITE);
tablePanel.setBackground(Color.WHITE);
mainPanel.setLayout(new BorderLayout());
mainPanel.setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP));
mainPanel.add(creditPanel, BorderLayout.PAGE_START);
mainPanel.add(tablePanel, BorderLayout.CENTER);
creditPanel.setVisible(true);
mainPanel.setBackground(Color.BLACK);
frm.add(mainPanel);
}
private JPanel createPanel2(String title){
tablePanel=new JPanel();
tablePanel.setLayout(new BoxLayout(tablePanel,BoxLayout.Y_AXIS));
header = new Vector<String>();
header.add("TID");
header.add("Date");
header.add("Jama");
header.add("Baki");
header.add("Nett");
header4 = new Vector<String>();
header4.add("A/C No.");
header4.add("Name");
//header4.add("Date");
header4.add("Mobile");
header4.add("City");
model=new DefaultTableModel(data,header);
model1=new DefaultTableModel(data1,header4);
table = new JTable(model);
table3 = new JTable(model1);
table.setRowSorter(new TableRowSorter(model));
table.setRowHeight(30);
table3.setRowHeight(30);
table.setFont(new Font("Times New Roman",Font.BOLD,15));
table3.setFont(new Font("Times New Roman",Font.BOLD,15));
table.getTableHeader().setFont( new Font( "Times New Roman" , Font.BOLD, 15 ));
table3.getTableHeader().setFont( new Font( "Times New Roman" , Font.BOLD, 15 ));
table.setDefaultRenderer(Object.class, new TableCellRenderer(){
table3.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
table3.getColumnModel().getColumn(0).setPreferredWidth(123);
table3.getColumnModel().getColumn(1).setPreferredWidth(250);
table3.getColumnModel().getColumn(2).setPreferredWidth(123);
table3.getColumnModel().getColumn(3).setPreferredWidth(125);
JScrollPane scroll=new JScrollPane(table);
JScrollPane scroll1=new JScrollPane(table3);
scroll1.setPreferredSize(new Dimension(50,63));
JPanel p=new JPanel();
JButton btn=new JButton("Print");
JButton btn1=new JButton("Export");
p.add(btn);
p.add(btn1);
tablePanel.add(p);
tablePanel.add(scroll1);
tablePanel.add(scroll);
tablePanel.setBorder(BorderFactory.createTitledBorder(title));
return tablePanel;
}
private JPanel createPanel1(String title) {
JPanel addUnitPanel = new JPanel();
addUnitPanel.setLayout(new GridLayout(4,1, GAP, GAP));
JLabel jlab=new JLabel("Name:");
jComboBox=new JComboBox(Select);//Select
jlab.setPreferredSize(new Dimension(100,10));
jComboBox.setPreferredSize(new Dimension(150,30));
jComboBox.addActionListener(new ActionListener(){
private int b=0,a=0;
private String tj="0";
private String tb="0";
private int t=0;
private String gt="0";
public void actionPerformed(ActionEvent ae){
try
{
Connection con=null;
Statement st=null;
ResultSet rs=null;
// ResultSet rs1=null;
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String url=null,userID=null,password=null;
String dbFileName=null;
String sql=null;
dbFileName = "C:/Program Files/Shop/shop.accdb";
//userID = "Admin";
password = "3064101991";
url = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};"+
"DBQ="+dbFileName+";"+
"Pwd="+password+";";
//sql = "SELECT * FROM tblUserProfile";
Object name=jComboBox.getSelectedItem();
con=DriverManager.getConnection(url);//,"system","manager"
st=con.createStatement();
model.setRowCount(0);
model1.setRowCount(0);
b=0;
a=0;
tj="0";
tb="0";
t=0;
gt="0";
an="0";nam="0";mono="0";cit="0";
DBEngine dbengine = new DBEngine();
data = dbengine.getJamaCustomer(name);
data1 = dbengine.getIdName(name);
System.out.println("data:"+data1);
Object[] d3={data1.get(0).get(0),data1.get(0).
get(1),data1.get(0).get(3),data1.get(0).get(4)};
model1.addRow(d3);
JTable table1=new JTable(data,header);
for(int i=0;i<table1.getRowCount();i++){
Object[] d={data.get(i).get(0),data.get(i).get(1),
data.get(i).get(2),data.get(i).get(3),data.get(i).get(4)};
model.addRow(d);
}
for(int i=0;i<table1.getRowCount();i++){
a=a+Integer.parseInt(data.get(i).get(2));
b=b+Integer.parseInt(data.get(i).get(3));
}
tj=Integer.toString(a);
tb=Integer.toString(b);
Object[] d1={"","Total",tj,tb,""};
model.addRow(d1);
t=Integer.parseInt(tb)-Integer.parseInt(tj);
gt=Integer.toString(t);
Object[] d2={"","Nett Balance","",gt,""};
model.addRow(d2);
table = new JTable(model);
table3 = new JTable(model1);
table.setRowHeight(30);
table3.setRowHeight(30);
JScrollPane scroll=new JScrollPane(table);
JScrollPane scroll1=new JScrollPane(table3);
//scroll.setBackground(Color.red);
tablePanel.add(scroll1);
tablePanel.add(scroll);
rs.close();
// rs1.close();
st.close();
con.close();
}
catch(Exception e)
{
System.out.println("GG"+e);
}
}
});
JPanel p1=new JPanel();
p1.add(jlab);
p1.add(jComboBox);
addUnitPanel.add(p1);
loadcombo2();
addUnitPanel.setBorder(BorderFactory.createTitledBorder(title));
return addUnitPanel;
}
void loadcombo2()
{
try
{
Connection con=null;
Statement st=null;
ResultSet rs=null;
// ResultSet rs1=null;
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String url=null,userID=null,password=null;
String dbFileName=null;
String sql=null;
dbFileName = "C:/Program Files/Shop/shop.accdb";
//userID = "Admin";
password = "3064101991";
url = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};"+
"DBQ="+dbFileName+";"+
"Pwd="+password+";";
//sql = "SELECT * FROM tblUserProfile";
con=DriverManager.getConnection(url);//,"system","manager"
st=con.createStatement();
rs= st.executeQuery("select distinct(Name) from ManageCustomer");
//rs1=st.executeQuery("select Unit from AddUnit");
while(rs.next())
{
jComboBox.addItem(rs.getString(1));
//jComboBox1.addItem(rs1.getString(1));
}
rs.close();
// rs1.close();
st.close();
con.close();
}
catch(Exception e)
{
System.out.println("GG"+e);
}
}
#Override
public void actionPerformed(ActionEvent ae){
if(ae.getSource()==print){
//Your print code
}
if(ae.getSource()==Export){
//Add jComboBox.addActionListener code here
}
}
public static void main(String args[]){
JFrame frm=new JFrame("Title");
Credit b=new Credit(frm);
//frm.setSize(650, 236);
frm.setSize(650, 700);
frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frm.setResizable(false);
frm.setLocationRelativeTo(null);
frm.show();
}
}
Related
Hi so i was wondering why my the Jtable didnt have any column title however it does have the data from my postgres db
I want to be able to choose a column title for each data
public class aaaaa extends JFrame {
private JPanel contentPane;
private static JTable table;
/**
* Launch the application.
*/
public static void main(String[] args) {
Connection c = null;
Statement stmt = null;
try{
Class.forName("org.postgresql.Driver");
c = DriverManager
.getConnection("jdbc:postgresql://localhost:5432/MovieDatabase",
"postgres", "password");
c.setAutoCommit(false);
System.out.println("Opened database successfully");
stmt = c.createStatement();
ResultSet rs = stmt.executeQuery( "SELECT * FROM film" );
table = new JTable(buildTableModel(rs));
while ( rs.next() ) {
int filmid = rs.getInt("filmid");
String filmtitle = rs.getString("filmtitle");
int filmyear = rs.getInt("filmyear");
String filmgenre = rs.getString("filmgenre");
System.out.println( "ID = " + filmid );
System.out.println( "TITLE = " + filmtitle );
System.out.println( "YEAR = " + filmyear );
System.out.println( "GENRE = " + filmgenre );
System.out.println();
}
rs.close();
stmt.close();
c.close();
}catch ( Exception e ) {
System.err.println( e.getClass().getName()+": "+ e.getMessage() );
System.exit(0);
}
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
aaaaa frame = new aaaaa();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public aaaaa() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 411);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
table.setBounds(10, 11, 414, 350);
contentPane.add(table);
JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(10, 11, 414, 350);
contentPane.add(scrollPane);
}
public static DefaultTableModel buildTableModel(ResultSet rs)
throws SQLException {
ResultSetMetaData metaData = rs.getMetaData();
// names of columns
Vector<String> columnNames = new Vector<String>();
int columnCount = metaData.getColumnCount();
for (int column = 1; column <= columnCount; column++) {
columnNames.add(metaData.getColumnName(column));
}
// data of the table
Vector<Vector<Object>> data = new Vector<Vector<Object>>();
while (rs.next()) {
Vector<Object> vector = new Vector<Object>();
for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) {
vector.add(rs.getObject(columnIndex));
}
data.add(vector);
}
return new DefaultTableModel(data, columnNames);
}
}
Thanks for ur help.
You are using your table outside of a scrollpane. If you really wish to use the JTable in a standalone view, you can get the headers using getTableHeader():
JTableHeader header = table.getTableHeader();
And then add the header to where you want it to be.
The other, more prefered, way would be to simply add the table to a scrollpane:
contentPane.add(new JScrollPane(table));
See here:
https://docs.oracle.com/javase/7/docs/api/javax/swing/JTable.html
Note that if you wish to use a JTable in a standalone view (outside of a JScrollPane) and want the header displayed, you can get it using getTableHeader() and display it separately.
I wnat to fill my Table with new Datas which i get by my DataBase(MySQL). I get all datas and create a new Model with them, but if i want to refresh the specific panel, then it wont be repainted.
public class PanelWest extends JPanel implements ActionListener {
private JButton but_selectBP;
private JButton but_selectBPAdr;
private JButton but_selectGerichte;
private GroupLayout layoutGroup;
private Connector stmtExecuter = new Connector();
// private PanelCenter tableViewer = new PanelCenter();
public PanelWest() {
layoutGroup = createLayout();
this.setLayout(layoutGroup);
createButtons();
}
private GroupLayout createLayout() {
GroupLayout layout = new GroupLayout(this);
layout.setAutoCreateGaps(true);
layout.setAutoCreateContainerGaps(true);
return layout;
}
void createButtons() {
this.but_selectBP = new JButton("Kunden anzeigen");
this.but_selectBP.addActionListener(this);
this.but_selectBPAdr = new JButton("Gerichte anzeigen");
this.but_selectBPAdr.addActionListener(this);
this.but_selectGerichte = new JButton("Lieferanten anzeigen");
this.but_selectGerichte.addActionListener(this);
this.layoutGroup.setHorizontalGroup(layoutGroup.createParallelGroup().addComponent(but_selectBP).addComponent(but_selectBPAdr).addComponent(but_selectGerichte));
this.layoutGroup.setVerticalGroup(layoutGroup.createSequentialGroup().addComponent(but_selectBP).addComponent(but_selectBPAdr).addComponent(but_selectGerichte));
}
#Override
public void actionPerformed(ActionEvent e) {
Object src = e.getSource();
if (src.equals(this.but_selectBP)) {
String query = "SELECT * FROM Kunde";
ResultSet rst = this.stmtExecuter.getResultDBData(query);
// this.tableViewer.setTableName("Kunde");
new PanelCenter().createTable(fillHeader(rst), fillData(rst));
}
if (src.equals(this.but_selectBPAdr)) {
String query = "SELECT * FROM Gericht";
ResultSet rst = this.stmtExecuter.getResultDBData(query);
// this.tableViewer.createTable(fillHeader(rst), fillData(rst));
}
if (src.equals(this.but_selectGerichte)) {
String query = "SELECT * FROM Lieferant";
ResultSet rst = this.stmtExecuter.getResultDBData(query);
// this.tableViewer.createTable(fillHeader(rst), fillData(rst));
}
}
private String[] fillHeader(ResultSet rst) {
try {
ResultSetMetaData rstMetaData = rst.getMetaData();
String[] header = new String[rstMetaData.getColumnCount()];
ArrayList<String> headerDetails = new ArrayList<>();
for (int i = 1; i <= rstMetaData.getColumnCount(); i++) {
headerDetails.add(rstMetaData.getColumnName(i));
}
int j = 0;
for(String head : headerDetails){
header[j] = head;
j++;
}
return header;
} catch (SQLException se) {
se.printStackTrace();
}
return null;
}
private Object[][] fillData(ResultSet rst) {
try {
ResultSetMetaData rstMetaData = rst.getMetaData();
int rowCount = 0;
rst.last();
rowCount = rst.getRow();
System.out.println(rowCount + " Rows");
rst.beforeFirst();
Object[][] data = new Object[rowCount][rstMetaData.getColumnCount()];
int row = 0;
while (rst.next()) {
for (int i = 0; i < rstMetaData.getColumnCount(); i++) {
data[row][i] = rst.getObject(i + 1);
}
row++;
}
return data;
} catch (SQLException se) {
System.out.println("Hier bei Fill");
}
return null;
}
}
I use remove, add revalidate and repaint on my jpanel.
void createTable(String[] header, Object[][] data) {
this.tableData = new JTable();
this.tableData.setModel(new MyTableModel(header, data));
this.tableData.setFillsViewportHeight(true);
this.tableData.addKeyListener(this);
this.scrollPaneTable = new JScrollPane(tableData);
this.scrollPaneTable.setSize(500, 500);
this.remove(this.scrollPaneTable);
this.add(this.scrollPaneTable);
this.revalidate();
this.repaint();
}
You don't need to reinitialize the table, table model.
Put some global variables on the top
private MyTableModel tableModel; //Your own table model
private JTable table;
Initialize them on init
public PanelWest() {
layoutGroup = createLayout();
this.setLayout(layoutGroup);
createButtons();
tableModel = new MyTableModel(header, data); //Your own tablemodel
table = new JTable(tableModel); //Hook the model to your table
this.add(table)
//...Do other things else to your table
}
Once you want to update the table, simply clear the rows from the table model and fill with new rows.
And ask JTable to update its data by calling
void createTable(String[] header, Object[][] data){
int cols = header.length;
int rows = data.length;
//Remove all rows from model
tableModel.setRowCount(0); //(As said by HovercraftFullOfEels)
Object[] row = new Object[cols];
for (int j = 0; j < data.length; j++){
for (int i = 0; i < cols; i++){
row[i] = data[j][i];
}
tableModel.addRow(row);
}
tableModel.fireTableDataChanged();
}
Hope it will help.
Thanks for your help.
I add a small test to my createTable method. I create a new window to show the new table datas and it works. i think my jpanel doesn't repaint correctly cause my grouplayout.
this.tableData = new JTable();
this.tableData.setModel(new MyTableModel(header, data));
this.tableData.setFillsViewportHeight(true);
this.tableData.addKeyListener(this);
this.scrollPaneTable = new JScrollPane(tableData);
this.scrollPaneTable.setSize(500, 500);
this.layoutGroup.setVerticalGroup(layoutGroup.createSequentialGroup().addComponent(this.scrollPaneTable, 400, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE).addComponent(this.scrollPaneChanges).addComponent(this.but_user).addComponent(this.but_dataChange));
// JFrame fr = new JFrame("Hello");
// fr.setLayout(null);
// fr.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
// fr.setVisible(true);
// fr.add(this.scrollPaneTable);
I am working on adapter classes.
I made JTable in an adapter class TabCl and called that JTable class TabCl in my parent class method guiInt() and adding it to container con.add() and its not letting it to do.
I am new to Java and don't have sound knowledge in Java. Please check the following code and give some help or something that can make it work.
My java version is 1.6.
import javax.swing.*;
import javax.swing.GroupLayout.Alignment;
import java.awt.*;
import java.awt.event.*;
import java.sql.*;
import java.util.*;
public class PersonProject {
JFrame myFrame;
Container cont;
BorderLayout bl;
GroupLayout gl;
FlowLayout fl;
JTable tl;
JScrollPane jsp;
JPanel flPanel, glPanel, jTPane;
JLabel lId;
JTextField tId;
// Db variable Declaration
Connection dbCon;
String url;
String con;
String sql;
ResultSet rs;
ResultSetMetaData rsmd;
PreparedStatement pstmt;
Vector columnName, data, row;
int columnCount;
public PersonProject() {
guiInt();
}
public void guiInt() {
myFrame = new JFrame();
glPanel = new JPanel();
cont = new Container();
bl = new BorderLayout();
fl = new FlowLayout();
flPanel = new JPanel();
flPanel.setLayout(fl);
cont = myFrame.getContentPane();
cont.setLayout(bl);
gl = new GroupLayout(glPanel);
glPanel.setLayout(gl);
gl.setAutoCreateGaps(true);
gl.setAutoCreateContainerGaps(true);
lId = new JLabel("Id");
tId = new JTextField();
// /////////
GroupLayout.SequentialGroup hGroup = gl.createSequentialGroup();
hGroup.addGroup(gl.createParallelGroup().addComponent(lId));
hGroup.addGroup(gl.createParallelGroup().addComponent(tId));
gl.setHorizontalGroup(hGroup);
GroupLayout.SequentialGroup vGroup = gl.createSequentialGroup();
vGroup.addGroup(gl.createParallelGroup(Alignment.BASELINE)
.addComponent(lId).addComponent(tId));
gl.setVerticalGroup(vGroup);
// ///////
TabCl tlb = new TabCl();// / class for making jatable
cont.add(flPanel, bl.NORTH);
cont.add(glPanel, bl.CENTER);
cont.add(tlb, bl.SOUTH);//// error at this point
myFrame.pack();
myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
myFrame.setVisible(true);
myFrame.setSize(600, 300);
}// end of method guiinit
private class TabCl {// start of adapter class for making jtable
public TabCl() {
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
url = "jdbc:odbc:personDSN";
dbCon = DriverManager.getConnection(url);
sql = "select * from emp";
pstmt = dbCon.prepareStatement(sql,
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
rs = pstmt.executeQuery();
rsmd = rs.getMetaData();
columnCount = rsmd.getColumnCount();
columnName = new Vector(columnCount);
for (int i = 1; i <= columnCount; i++) {
columnName.add(rsmd.getColumnName(i));
}// end of for loop
System.out.println(columnName.get(1));
data = new Vector();
row = new Vector();
while (rs.next()) {
row = new Vector(columnCount);
for (int i = 1; i <= columnCount; i++) {
row.add(rs.getString(i));
}
data.add(row);
}// end of while loop
dbCon.close();
} catch (Exception ex) {
System.out.println(ex + ":Sql Exception at table level");
}
tl = new JTable(data, columnName);
jsp = new JScrollPane(tl);
jTPane = new JPanel();
tl.setPreferredScrollableViewportSize(new Dimension(500, 90));
tl.setVisible(true);
tl.setFillsViewportHeight(true);
jTPane.add(jsp);
}// end of method tabmethod
}// end of class TabCl
public static void main(String[] args) {
// TODO Auto-generated method stub
PersonProject perProj = new PersonProject();
}
}
TabCl implicitly extends Object, while add() expects a Component. Instead of this:
private class TabCl {…}
create a factory method that returns a JPanel like this:
private JPanel createTablePanel() {
…
jTPane.add(jsp);
return jTPane;
}// end of method createTablePanel
and use it like this:
JPanel tlb = createTablePanel();
cont.add(flPanel, bl.NORTH);
cont.add(glPanel, bl.CENTER);
cont.add(tlb, bl.SOUTH);//// error at this point
See also JDBCAdapter, cited here.
For some reason my JTable is not displaying it's column names?! I'm certain I've done everything correctly. I've literally copied this from a demonstration so I don't understand why it won't work.
Here is my code:
public class MemTableModel extends AbstractTableModel{
private ArrayList<member> members = new ArrayList<member>();
private String[] columnNames = {"ID", "Name", "Email", "Country", "Genre",
"Gender", "Description", "Type", "Limit", "Card No", "Expiry Date"};
public MemTableModel(){
LoadTableFromDB();
}
public int getRowCount(){
return members.size();
}
public int getColumnCount(){
return columnNames.length;
}
public Object getValueAt(int row, int col){
//Get the row from the about get method
member f = members.get(row);
switch(col){
case 0: return f.getmembId();
case 1: return f.getname();
case 2: return f.getemail();
case 3: return f.getcountry();
case 4: return f.getfavGenre();
case 5: return f.getgender();
case 6: return f.getdescription();
case 7: return f.getmemberType();
case 8: return f.getsongLimit();
case 9: return f.getcard_no();
case 10: return f.getexpiry_date();
}
return null;
}
public String getColumnName(int col){
return columnNames[col];
}
public member getRow(int row){
member c = members.get(row);
return c;
}
public Connection getConnection(){
Connection conDB = null;
/****** DEFAULT MYSQL DRIVERS **************************/
String url = connection.geturl();
String username = connection.getUsername();
String password = connection.getPassword();
try{
//load the MYSQL driver
Class.forName(connection.getDriver());
conDB = DriverManager.getConnection(url, username, password);
}
catch(Exception e){
}
return conDB;
}
//Load all DB values into ARRAY
public void LoadTableFromDB(){
Connection conDB = null;
Statement stmt = null;
ResultSet r = null;
try{
//Connection + Statement
conDB = getConnection();
stmt = conDB.createStatement();
//Queries
String sqlSelectAll = "SELECT * FROM members";
r = stmt.executeQuery(sqlSelectAll);
members.clear();
//Loop through the resultset
while(r.next()){
members.add(new member(r.getInt("membId"), r.getString("name"),
r.getString("email"), r.getString("country"), r.getString("favGenre"),
r.getString("gender"), r.getString("description"), r.getString("memberType"),
r.getString("songLimit"), r.getString("card_no"), r.getString("expiry_date")));
}
conDB.close(); // Close the DB connection
}//End of TRY
catch(Exception er){
System.out.println("Error was: " + er);
}
}
}
Here is how I've implemented the JTable:
public class ViewAll extends JFrame implements ActionListener{
//Jtextfields, buttons, labels
private JButton btnBack = new JButton("Back");
private static JLabel lblMembTitle = new JLabel("<html><h1>All Members</h1></html>");
private static JLabel lblPlayTitle = new JLabel("<html><h1>All Playlists</h1><br /></html>");
//Containers, Panels, Scrollpanes
private Container mainCon = this.getContentPane();
private static JPanel pnlTable = new JPanel(new BorderLayout());
//Jpanels - sections
private JPanel mainPanel = new JPanel();
private JPanel subPanel1 = new JPanel();
private JPanel subPanel2 = new JPanel();
private JPanel subPanel3 = new JPanel();
//Tables
private static JTable tblShowAllMemb = new JTable();
private static JTable tblShowAllPlay = new JTable();
JScrollPane scrollPane = new JScrollPane(mainPanel, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
public ViewAll(){
super("Search/Edit/Delete Members");
this.setBounds(400, 800, 854,400);
this.setVisible(true);
mainCon.add(scrollPane);
//Table Models:
MemTableModel tblMembers = new MemTableModel();
PlayTableModel tblPlaylist = new PlayTableModel();
//LAYOUT
/*By removing this the scrollpane works
^^mainPanel is already added to the scrollPane object above ^^
*/
// mainCon.add(mainPanel);
//Main Panel
mainPanel.setLayout(new BorderLayout());
mainPanel.add(BorderLayout.NORTH, subPanel1);
mainPanel.add(BorderLayout.CENTER, subPanel2);
//Panel1 - Member table + Back Button
subPanel1.setLayout(new BorderLayout());
subPanel1.add(BorderLayout.NORTH, btnBack);
subPanel1.add(BorderLayout.CENTER, lblMembTitle);
subPanel1.add(BorderLayout.SOUTH, tblShowAllMemb);
tblShowAllMemb.setModel(tblMembers);
btnBack.addActionListener(this);
//Panel2 - Playlist table
subPanel2.add(BorderLayout.NORTH, lblPlayTitle);
subPanel2.add(BorderLayout.CENTER, tblShowAllPlay);
tblShowAllPlay.setModel(tblPlaylist);
}
#Override
public void actionPerformed(ActionEvent e) {
if(e.getSource() == btnBack){
this.dispose();
}
}
}
The likely issue is you've not wrapped the JTable, which represents your TableModel in a JScrollPane as demonstrated in How to Use Tables
By simply using something like...
add(new JScrollPane(new JTable(new MemTableModel())));
I can get:
See also How to Use Scroll Panes for more details
Updated based on updated code...
Not one of your tables is actually wrapped within it's own JScrollPane
// By the way, static here is very, very bad idea
private static JTable tblShowAllMemb = new JTable();
private static JTable tblShowAllPlay = new JTable();
JScrollPane scrollPane = new JScrollPane(mainPanel, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
public ViewAll(){
//....
//Table Models:
MemTableModel tblMembers = new MemTableModel();
PlayTableModel tblPlaylist = new PlayTableModel();
//...
subPanel1.add(BorderLayout.SOUTH, tblShowAllMemb);
//...
subPanel2.add(BorderLayout.CENTER, tblShowAllPlay);
You've just added the table by itself to some other container. Instead, consider using something like
//...
subPanel1.add(BorderLayout.SOUTH, new JScrollPane(tblShowAllMemb));
//...
subPanel2.add(BorderLayout.CENTER, new JScrollPane(tblShowAllPlay));
I'm making a simple program that show the teams, the matches and racking goal of Euro2016 in France.
I have some problem with JTable when changing query.
Here is what happens:
when I change from a Table of (for example) 10 rows to another one that contains only 5 rows it works. But if I change from a table that contains 5 rows to another of 10, the table doesn't change, it displays only 5 rows.
Here the code:
public class Euro2016GUI extends JFrame {
private Container container;
private Sfondo pnlSfondo;
JTable table;
JPanel panel;
static Vector<Vector<String>> data = new Vector<Vector<String>>();
static Vector<String> headers = new Vector<String>();
public Euro2016GUI() {
data.removeAll(data);
headers.removeAll(headers);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(600, 400);
this.setTitle("Euro2016");
this.setLocationRelativeTo(null);
pnlSfondo = new Sfondo();
container = this.getContentPane();
container.add(pnlSfondo);
}
public void createTable(String pQuery) {
data.removeAll(data);
headers.removeAll(headers);
Control control = new Control();
panel = new JPanel(new BorderLayout());
panel.setSize(300, 300);
panel.setBackground(Color.red);
control.getData(pQuery);
data = control.getData();
headers = control.getHeaders();
//this is the model which contain actual body of JTable
DefaultTableModel model = new DefaultTableModel(data, headers);
table = new JTable(model);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
table.setEnabled(false);
table.setMaximumSize(new Dimension(100, 300));
header_size();
JScrollPane scroll = new JScrollPane(table);
//scroll.setSize(600, 400);
scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
this.getContentPane().add(panel);
panel.add(scroll, BorderLayout.CENTER);
}
public void header_size() {
int colonne = table.getColumnModel().getColumnCount();
TableColumn column;
for (int i = 0; i < colonne; i++) {
column = table.getColumnModel().getColumn(i);
column.setPreferredWidth(200);
}
}
public void cleanData() {
if (table != null) {
DefaultTableModel dm = (DefaultTableModel) table.getModel();
dm.setRowCount(0);
table.revalidate();
}
data.removeAll(data);
headers.removeAll(headers);
}
}
CLASS CONTROL
public class Control {
private static Vector<Vector<String>> data = new Vector<Vector<String>>();
private static Vector<String> headers = new Vector<String>();
public void getData(String pQuery) {
// Enter Your MySQL Database Table name in below Select Query.
String query = pQuery;
Connection con = null;
ResultSet rs;
Statement st = null;
int colonne = 0;
data.removeAll(data);
headers.removeAll(headers);
try {
con = DBConnectionPool.getConnection();
st = con.createStatement();
rs = st.executeQuery(query);
ResultSetMetaData rsmd = rs.getMetaData();
colonne = rsmd.getColumnCount();
for (int i = 1; i <= colonne; i++) {
headers.add(rsmd.getColumnName(i));
}
while (rs.next()) {
Vector<String> d = new Vector<String>();
for (int i = 1; i <= colonne; i++) {
d.add(rs.getString(i));
}
data.add(d);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (st != null) {
try {
st.close();
} catch (SQLException ex) {
Logger.getLogger(DataInJTable.class.getName()).log(Level.SEVERE, null, ex);
}
}
if (con != null) {
DBConnectionPool.releaseConnection(con);
}
}
}
public Vector<Vector<String>> getData() {
return this.data;
}
public Vector<String> getHeaders() {
return this.headers;
}
}
HERE THE ACTION LISTENER IN THE MENU:
...
//----ROSE---//
private class OnClickRose implements ActionListener {
Sfondo sfondo;
#Override
public void actionPerformed(ActionEvent e) {
String str = e.getActionCommand();
str = str.replace("[", "");
str = str.replace("]", "");
String sx = "'";
String dx = "'";
String query = query2.concat(sx.concat(str.concat(dx)));
//frame.cleanData();
sfondo = frame.getPnlSfondo();
if (sfondo.isVisible() && sfondo.getParent().isVisible()) {
sfondo.setVisible(false);
}
frame.createTable(query);
}
}
//----CALENDARIO----//
private class OnClickCalendario implements ActionListener {
Sfondo sfondo;
#Override
public void actionPerformed(ActionEvent e) {
frame.cleanData();
sfondo = frame.getPnlSfondo();
if (sfondo.isVisible() && sfondo.getParent().isVisible()) {
sfondo.setVisible(false);
}
frame.createTable(query4);
}
}
//----CLASSIFICA MARCATORI----//
private class OnClickMarcatori implements ActionListener {
Sfondo sfondo;
#Override
public void actionPerformed(ActionEvent e) {
frame.cleanData();
sfondo = frame.getPnlSfondo();
if (sfondo.isVisible() && sfondo.getParent().isVisible()) {
sfondo.setVisible(false);
}
frame.createTable(query3);
}
}
...
Could anybody tell me where I wrong?
Basically to tell the table to refresh itself, you just call the method fireTableDataChanged() of it's table model.
So in your example, after you run the query, you could just call:
((DefaultTableModel)yourTable.getModel()).fireTableDataChanged();
But I suggest you to stop using default table model, and implement your own table model. It's a lot easier to work.