How can I add two jTextFields to JTable cell on button click - java

I have a JTable, edit button and save button. when I click the edit button , I want to insert two JTextFields into a particular cell which is selected . So I can write (strings) into these text fields .
when I click on save button want to remove those two textfields from the cell and paste that strings (into the same cell of the table).

You don't need to add a JTextField to a JTable in order for a cell to be editable. The isCellEditable(int row, int column) function can be overridden to return a boolean dependent on the edit button. Here's an example:
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.EventQueue;
import java.awt.event.*;
import java.awt.Dimension;
public class EditTableExample extends JFrame {
private boolean editable = false;
public EditTableExample() {
//set up jframe
setPreferredSize(new Dimension(500, 500));
setMinimumSize(new Dimension(500, 500));
setResizable(false);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
//set up content pane
JPanel contentPane = new JPanel();
setContentPane(contentPane);
//table model
Object[][] tableContents = new Object[][]{ //contents of our table
{"Person1", "City1"},
{"Person2", "City2"},
{"Person3", "City3"}
};
Object[] tableHeader = new Object[]{
"Name", "City"
};
DefaultTableModel model = new DefaultTableModel(tableContents, tableHeader) {
#Override
public boolean isCellEditable(int row, int column) {
return editable;
}
};
//table
JTable table = new JTable(model);
//scrollpane to house table
JScrollPane tablePane = new JScrollPane(table);
tablePane.setPreferredSize(new Dimension(450, 450));
//button that will add a row
JButton add = new JButton("Add Row");
add.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
model.addRow(new Object[model.getColumnCount()]); //adds a new, empty row to the table
}
});
//button that will toggle edit mode
JButton edit = new JButton("Toggle Edit");
edit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
editable = !editable; //switches the value of 'editable' on click
}
});
//button to remove a row
JButton remove = new JButton("Remove Row");
remove.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
try {
model.removeRow(table.getSelectedRow()); //remove selected row
}
catch (ArrayIndexOutOfBoundsException e) {
JOptionPane.showMessageDialog(rootPane, "No Row Selected");
}
}
});
//add everything together
contentPane.add(tablePane);
contentPane.add(add);
contentPane.add(edit);
contentPane.add(remove);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
#Override
public void run() {
EditTableExample e = new EditTableExample();
e.setVisible(true);
}
});
}
}
As you can see, the isCellEditable function will return the value of 'editable', a boolean whose value is toggled by the 'edit' button. Instead of having one cell per person that contains "Name, City" there are two columns, one for the person's name and one for their city. Let me know if you have any other questions.

Related

Remove the rows of jTable that have been selected and were saved in a list at same time after press a button

I need to remove the rows that are selected after a button is pressed.
That's is my code: I have a column that is a checkbox, then a check if it is checked and add the corresponding line to the list.
DefaultTableModel model = (DefaultTableModel) jTableLayouts.getModel();
// gets the number of rows that were selected
Public ArrayList<Integer> selectedLines = new ArrayList<Integer>();
for (int j = 0; j <= jTableLayouts.getModel().getRowCount(); j++) {
if ((Boolean) jTableLayouts.getModel().getValueAt(j,2)){ //checkbox
selectedLines.add(jTableLayouts.getSelectedRow());
}
model.removeRow(selectedLines.get(j));
}
With this code I can remove one by one. Any ideas how I can remove all the lines after a press the button?
EDIT: I only need to remove the rows that are marked as true in the checkbox. Example: the rows 0,1,4,5 are marked as true, after that I will add these lines in a list, and then just remove the lines that are on the list at same time after the button is pressed.
As #MadProgrammer already commented, you can do this from a button by having the ActionListener perform the deletes and add the deleted rows to the list you want.
In this snippet when pressing the button, the checked rows on the left are deleted and added to the table on the right. Check the createDeleteButton method for how this is done.
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
#SuppressWarnings("serial")
public class TestTableDeleteRows extends JPanel {
private JTable tblLeft;
private JTable tblRight;
public TestTableDeleteRows() {
initialize();
}
#Override
public Dimension getPreferredSize() {
return new Dimension(600,400);
}
private void initialize() {
setLayout(new BorderLayout());
add(createHeaderPane(),BorderLayout.NORTH);
add(createTablePane(),BorderLayout.CENTER);
add(createDeleteButton(),BorderLayout.SOUTH);
}
private JPanel createHeaderPane() {
JPanel p = new JPanel();
p.setLayout(new BoxLayout(p, BoxLayout.LINE_AXIS));
p.add(new JScrollPane(new JLabel("Source",SwingConstants.CENTER)));
p.add(new JScrollPane(new JLabel("Deleted",SwingConstants.CENTER)));
return p;
}
private JPanel createTablePane() {
JPanel p = new JPanel();
p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS));
tblLeft = createTable(stdRows);
tblRight = createTable(new Vector<Vector<Object>>());
p.add(new JScrollPane(tblLeft));
p.add(new JScrollPane(tblRight));
return p;
}
private static final int COL_CHECK=0;
private static final int COL_TEXT=1;
private static final Vector<Vector<Object>> stdRows;
private static final Vector<Object> cols;
static {
stdRows = new Vector<Vector<Object>>();
for(int i=0;i!=100;++i)
stdRows.add(new Vector<Object>(Arrays.asList(new Object[]{Boolean.FALSE,"This is text line number "+(i+1)})));
cols = new Vector<>(Arrays.asList(new Object[]{"Check me","Silly text"}));
}
private static JTable createTable(Vector<Vector<Object>> rows) {
JTable t = new JTable(rows,cols) {
#Override
public Class<?> getColumnClass(int column) {
if(getRowCount()>0)
return getValueAt(0, column).getClass();
return super.getColumnClass(column);
}
};
t.getColumnModel().getColumn(COL_CHECK).setPreferredWidth(50);
t.getColumnModel().getColumn(COL_TEXT).setPreferredWidth(200);
return t;
}
private JButton createDeleteButton() {
JButton b = new JButton("Delete checked rows");
b.addActionListener(new ActionListener() {
#SuppressWarnings("unchecked")
#Override
public void actionPerformed(ActionEvent e) {
Vector<Vector<Object>> removedRows = new Vector<>();
DefaultTableModel modelLeft = (DefaultTableModel) tblLeft.getModel();
for(int r=0;r!=modelLeft.getRowCount();++r)
if((Boolean) modelLeft.getValueAt(r,COL_CHECK)) {
removedRows.add((Vector<Object>) modelLeft.getDataVector().get(r));
modelLeft.removeRow(r--);
}
DefaultTableModel modelRight = (DefaultTableModel) tblRight.getModel();
for(Vector<Object> row : removedRows)
modelRight.addRow(row);
}
});
return b;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
#Override
public void run() {
JFrame f = new JFrame("Delete checked rows in JTable from button");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setContentPane(new TestTableDeleteRows());
f.pack();
f.setVisible(true);
}
});
}
}
Result:

JTable ComboBox loses value when clicked elsewhere

I have set a jCombobox as DefaultCellEditor for a JTable cell.
The problem comes when I type a value in the cell (jCombobox) and whenever I click somewhere else, the value is lost. Someone knows why and how can I fix this?
table.getColumnModel().getColumn(1).setCellEditor(new SpringJobTablePopupCellEditor());
public class SpringJobTablePopupCellEditor extends AbstractCellEditor implements TableCellEditor {
JTextField jtf;
DefaultCellEditor other;
DefaultCellEditor checkbox;
private DefaultCellEditor lastSelected;
JComboBox cbox = null;
public SpringJobTablePopupCellEditor() {
jtf = new JTextField();
jtf.setDocument(new JTextFieldLimit(1000));
other = new DefaultCellEditor(jtf);
checkbox = new DefaultCellEditor(generateBox("10"));
}
#Override
public Object getCellEditorValue() {
return lastSelected.getCellEditorValue();
}
#Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
final JTable t = table;
cbox.getEditor().getEditorComponent().addFocusListener(new FocusListener() {
#Override
public void focusGained(FocusEvent e) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
#Override
public void focusLost(FocusEvent e) {
if(t.isEditing()){
t.getCellEditor().stopCellEditing();
}
}
});
String val = table.getModel().getValueAt(row, column - 1).toString();
if("ak".equals(val)){
lastSelected = checkbox;
return checkbox.getTableCellEditorComponent(table, value, isSelected, row, column);
}
lastSelected = other;
return other.getTableCellEditorComponent(table, value, isSelected, row, column);
}
private JComboBox generateBox(String type) {
cbox = new JComboBox();
cbox.setEditable(true);
for (Map.Entry<String, String> entry : SpringJob.akMap.entrySet()) {
cbox.addItem(entry.getValue());
}
return cbox;
}
}
try
JTable table = new yourTable();
table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
When you go from one combobox to another you need to force your table to stop editing
i achieved similar with adding a focusListener to the combobox and in the focuslost adding
public void focusLost(FocusEvent e) {
if (table.isEditing())
table.getCellEditor().stopCellEditing();
}
}
Combo box has stored more than one items list normally. when you click JCombo box in jtable and type the value it will not add directly in to combobox list item. you must add value first in combo-box. Combo-box contains array of objects.
Try this code its dynamically add value in Jtable combo-box
static JComboBox combo = new JComboBox();
static JTable table = new JTable();
public static void main(String[] args)
{
JFrame frame = new JFrame();
JPanel topPanel = new JPanel();
JPanel middlepanel = new JPanel();
combo.addItem("First");
combo.addItem("Second");
combo.addItem("Third");
JButton button = new JButton("Add Item");
topPanel.add(button);
frame.setLayout(new BorderLayout());
frame.setSize(500, 500);
frame.add(topPanel, BorderLayout.NORTH);
DefaultTableModel model = (DefaultTableModel) table.getModel();
model.addColumn("A", new Object[] { "item1" });
middlepanel.setLayout(new BorderLayout());
middlepanel.add(table,BorderLayout.CENTER);
String str[] = new String[combo.getItemCount()];
for(int i=0;i<combo.getItemCount();i++){
str[i] = combo.getItemAt(i).toString();
}
table.getColumnModel().getColumn(0).setCellEditor(new MyComboBoxEditor(combo));
table.getColumnModel().getColumn(0).setCellRenderer(new MyComboBoxRenderer(str));
table.setRowHeight(25);
frame.add(middlepanel,BorderLayout.CENTER);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
button.addActionListener(new ActionListener() {
#Override
public void actionPerformed(ActionEvent e) {
String cmd = e.getActionCommand();
switch(cmd)
{
case "Add Item":
combo.addItem("Fourth");
combo.addItem("Fifth");
String str[] = new String[combo.getItemCount()];
for(int i=0;i<combo.getItemCount();i++){
str[i] = combo.getItemAt(i).toString();
}
table.getColumnModel().getColumn(0).setCellEditor(new MyComboBoxEditor(combo));
table.getColumnModel().getColumn(0).setCellRenderer(new MyComboBoxRenderer(str));
break;
}
}
});
}
#Override
public void actionPerformed(ActionEvent e)
{
}

Java Eclipse Jtable Cell / Column

for Java Kepler Eclipse and Jtable, I am trying to make it so as when a specific table cell is selected, that cell will work as an editorPane; or have the whole column work as editorPane. When I click a cell on column COMMENTS it enlargens the row but I cant get it to work as an editorPane. My project is actualy very different but I wrote this mini one with the table so you can copy, paste and run it to see exactly what the problem is when you click on a COMMENTS cell.
I tried to make the column an editorPane to begin with like I made the column DONE with checkBox, but it doesnt work or I am doing it wrong. I also tried cellRenderer but I couldnt make that work either.
Whether the whole column works as an editorPane or just the selected cell it doesnt matter, whatever is easier and as long as it works
import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
public class JavaTestOne {
JFrame frmApp;
private JTable table;
private JCheckBox checkbox;
DefaultTableModel model;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
JavaTestOne window = new JavaTestOne();
window.frmApp.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public JavaTestOne() {
initialize();
}
private void initialize() {
frmApp = new JFrame();
frmApp.getContentPane().setFont(new Font("Tahoma", Font.PLAIN, 13));
frmApp.setBounds(50, 10, 1050, 650);
frmApp.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frmApp.getContentPane().setLayout(new CardLayout(0, 0));
frmApp.setTitle("App");
{
JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(0, 42, 984, 484);
frmApp.add(scrollPane);
{
table = new JTable();
table.setFillsViewportHeight(true);
Object[][] data = {
{"I01", "Tom",new Boolean(false), ""},
{"I02", "Jerry",new Boolean(false), ""},
{"I03", "Ann",new Boolean(false), ""}};
String[] cols = {"ID","NAME","DONE","COMMENTS"};
model = new DefaultTableModel(data, cols) {
private static final long serialVersionUID = -7158928637468625935L;
public Class getColumnClass(int column) {
return getValueAt(0, column).getClass();
}
};
table.setModel(model);
table.setRowHeight(20);
table.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
int row = table.rowAtPoint(evt.getPoint());
int col = table.columnAtPoint(evt.getPoint());
table.setRowHeight(20);
if(col==3){
table.setRowHeight(row, 100);
//this is where I need it to work as an editorPane if it is only for the selected cell
}
}
});
table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
scrollPane.setViewportView(table);
checkbox = new JCheckBox("OK");
checkbox.setHorizontalAlignment(SwingConstants.CENTER);
checkbox.setBounds(360, 63, 97, 23);
}
}
}
}
Another alternative is to display a popup window to edit the cell:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
/*
* The editor button that brings up the dialog.
*/
//public class TablePopupEditor extends AbstractCellEditor
public class TablePopupEditor extends DefaultCellEditor
implements TableCellEditor
{
private PopupDialog popup;
private String currentText = "";
private JButton editorComponent;
public TablePopupEditor()
{
super(new JTextField());
setClickCountToStart(1);
// Use a JButton as the editor component
editorComponent = new JButton();
editorComponent.setBackground(Color.white);
editorComponent.setBorderPainted(false);
editorComponent.setContentAreaFilled( false );
// Make sure focus goes back to the table when the dialog is closed
editorComponent.setFocusable( false );
// Set up the dialog where we do the actual editing
popup = new PopupDialog();
}
public Object getCellEditorValue()
{
return currentText;
}
public Component getTableCellEditorComponent(
JTable table, Object value, boolean isSelected, int row, int column)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
popup.setText( currentText );
// popup.setLocationRelativeTo( editorComponent );
Point p = editorComponent.getLocationOnScreen();
popup.setLocation(p.x, p.y + editorComponent.getSize().height);
popup.show();
fireEditingStopped();
}
});
currentText = value.toString();
editorComponent.setText( currentText );
return editorComponent;
}
/*
* Simple dialog containing the actual editing component
*/
class PopupDialog extends JDialog implements ActionListener
{
private JTextArea textArea;
public PopupDialog()
{
super((Frame)null, "Change Description", true);
textArea = new JTextArea(5, 20);
textArea.setLineWrap( true );
textArea.setWrapStyleWord( true );
KeyStroke keyStroke = KeyStroke.getKeyStroke("ENTER");
textArea.getInputMap().put(keyStroke, "none");
JScrollPane scrollPane = new JScrollPane( textArea );
getContentPane().add( scrollPane );
JButton cancel = new JButton("Cancel");
cancel.addActionListener( this );
JButton ok = new JButton("Ok");
ok.setPreferredSize( cancel.getPreferredSize() );
ok.addActionListener( this );
JPanel buttons = new JPanel();
buttons.add( ok );
buttons.add( cancel );
getContentPane().add(buttons, BorderLayout.SOUTH);
pack();
getRootPane().setDefaultButton( ok );
}
public void setText(String text)
{
textArea.setText( text );
}
/*
* Save the changed text before hiding the popup
*/
public void actionPerformed(ActionEvent e)
{
if ("Ok".equals( e.getActionCommand() ) )
{
currentText = textArea.getText();
}
textArea.requestFocusInWindow();
setVisible( false );
}
}
private static void createAndShowUI()
{
String[] columnNames = {"Item", "Description"};
Object[][] data =
{
{"Item 1", "Description of Item 1"},
{"Item 2", "Description of Item 2"},
{"Item 3", "Description of Item 3"}
};
JTable table = new JTable(data, columnNames);
table.getColumnModel().getColumn(1).setPreferredWidth(300);
table.setPreferredScrollableViewportSize(table.getPreferredSize());
JScrollPane scrollPane = new JScrollPane(table);
// Use the popup editor on the second column
TablePopupEditor popupEditor = new TablePopupEditor();
table.getColumnModel().getColumn(1).setCellEditor( popupEditor );
JFrame frame = new JFrame("Popup Editor Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new JTextField(), BorderLayout.NORTH);
frame.add( scrollPane );
frame.pack();
frame.setLocationRelativeTo( null );
frame.setVisible(true);
}
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowUI();
}
});
}
}
Using this approach you don't continually manipulate the row size. You could even customize the code to make the dialog fit the width of the cell and appear below the cell.
Seems you need to implement your own TableCellEditor, read more in tutorial.
For example like that:
private class CustomEditor extends AbstractCellEditor implements TableCellEditor{
private JTextPane pane = new JTextPane();
private JScrollPane scroll = new JScrollPane(pane);
private int row = -1;
#Override
public Object getCellEditorValue() {
return pane.getText();
}
#Override
public Component getTableCellEditorComponent(JTable table,
Object value, boolean isSelected, int row, int column) {
if(this.row != -1)
table.setRowHeight(this.row, 20);
this.row = row;
table.setRowHeight(row, 100);
pane.setText(value == null ? "" : value.toString());
return scroll;
}
}
and then set it as column editor: table.getColumn("COMMENTS").setCellEditor(new CustomEditor());

java JTABLE - Refresh TextFields after Delete An item from database

I have text fields and a JTable on a Frame. When user clicks on the JTable row or moves key up and down, textfields filled up with these selected row values so that user can update the row. So the problem is when I select the row and then pressed the delete button the table refreshes but the textfields still show the deleted row values.So at this moment I dont want to reset the fields. I want to show the row values which comes before the deleted row in the text field
For example there are two rows
id name
1 hello
2 bello
user selected the row which has ID 2 and delete it. now the values on the textfield should be hello not bellow
You can use a ListSelectionListener on your JTable which sets the text of the JTextField elements based on the current selection in your JTable. When the delete button is pressed, you can have the ActionListener remove the selected row from the JTable and force the next selection in the model via setRowSelectionInterval. Below is a simple example:
import java.awt.*;
import java.awt.event.*;
import javax.swing.border.*;
import javax.swing.event.*;
import javax.swing.table.*;
import javax.swing.*;
public class JTableDelete extends JFrame {
private static final long serialVersionUID = 1L;
private JPanel contentPane;
private JTable table;
private JTextField textField;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
JTableDelete frame = new JTableDelete();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public JTableDelete() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new BorderLayout(0, 0));
setContentPane(contentPane);
table = new JTable();
table.setModel(new DefaultTableModel(new Object[][] { { "Red" }, { "Green" }, { "Blue" }, { "Violet" }, { "Orange" }, },
new String[] { "Colors" }));
ListSelectionModel cellSelectionModel = table.getSelectionModel();
cellSelectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
cellSelectionModel.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
int selectedRow = table.getSelectedRow();
int selectedColumn = table.getSelectedColumn();
if (selectedRow != -1 && selectedColumn != -1)
textField.setText((String) table.getValueAt(selectedRow, selectedColumn));
else
textField.setText("");
}
});
contentPane.add(table, BorderLayout.CENTER);
JButton btnDelete = new JButton("Delete");
btnDelete.addActionListener(new ActionListener() {
#Override
public void actionPerformed(ActionEvent e) {
int row = table.getSelectedRow();
int rowCount = table.getRowCount() - 1; // -1 because counting starts at 0
if (row != -1) {
((DefaultTableModel) table.getModel()).removeRow(row);
rowCount--; // 1 less row now
if (row < table.getRowCount()) // next selection
table.setRowSelectionInterval(row, row);
else if (rowCount != -1) // end selection
table.setRowSelectionInterval(rowCount, rowCount);
}
}
});
contentPane.add(btnDelete, BorderLayout.SOUTH);
textField = new JTextField();
textField.setEnabled(false);
contentPane.add(textField, BorderLayout.NORTH);
textField.setColumns(10);
pack();
}
}

Java, How to refresh JTable in one frame from another frame

So I have a MainFrame class which has a JTable in it, listing all Products stored in DB. The JButton with the help of listeners will open AddProduct (another class, and another window/frame) in which I can add product in the DB. Unfortunately, I'm not exactly sure how can I update/revalidate JTable in MainFrame once AddProduct adds new product and autocloses.
Could some please give me some idea as how can I easily resolve this?
Since program is rather large, here are relevant parts of it:
From MainFrame.java
public JPanel tabProducts() {
JPanel panel = new JPanel(new MigLayout("","20 [grow, fill] 10 [grow, fill] 20", "20 [] 10 [] 20"));
/** Labels **/
JLabel label = new JLabel("List of all available products");
/** Buttons **/
JButton add = new JButton("Add product");
add.addActionListener(new ActionListener() {
#Override
public void actionPerformed(ActionEvent e) {
new AddProduct();
}
});
JButton update = new JButton("Update product");
update.addActionListener(new ActionListener() {
#Override
public void actionPerformed(ActionEvent e) {
new UpdateProduct(ps.getProductByID(15));
}
});
/** TABLE: Products **/
String[] tableTitle = new String[] {"ID", "Name", "Type", "Price", "In stock"};
String[][] tableData = null;
DefaultTableModel model = new DefaultTableModel(tableData, tableTitle);
JTable table = null;
/** Disable editing of the cell **/
table = new JTable(model){
public boolean isCellEditable(int r, int c) {
return false;
}
};
/** Load the products from DB **/
List<Product> listInv = ps.getProductsByAtt(new ArrayList<String>());
for (int i = 0; i < listInv.size(); i++) {
model.insertRow(i, new Object[] {
listInv.get(i).getID(),
listInv.get(i).getName(),
listInv.get(i).getType(),
listInv.get(i).getPrice(),
listInv.get(i).getQuantity()
});
}
/** Add scroll pane **/
JScrollPane scrollpane = new JScrollPane(table);
/** Add everything to the panel **/
panel.add(label, "wrap, span");
panel.add(scrollpane, "wrap, span");
panel.add(add);
panel.add(update);
return panel;
}
And AddProduct.java
public class AddProduct {
private JFrame frame;
private JButton add, cancel;
private JRadioButton food, beverage;
private JTextField name, price, quantity;
private IProductService ps = new ProductService();
private ButtonGroup group = new ButtonGroup();
private Product p;
private String type = "";
public AddProduct() {
/** Frame options **/
frame = new JFrame("Add new product");
frame.setSize(400, 280);
frame.setMinimumSize(new Dimension(400, 280));
frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
/** Default panel **/
final JPanel panel = new JPanel(new MigLayout("","20 [grow, fill] 10 [grow, fill] 20", "20 [] 10 [] 20"));
/** Radio Buttons to choose between the food and the beverages **/
food = new JRadioButton("Food");
beverage = new JRadioButton("Beverage");
group.add(food);
group.add(beverage);
food.addActionListener(new ActionListener(){
#Override
public void actionPerformed(ActionEvent e) {
type = "Food";
frame.validate();
}
});
beverage.addActionListener(new ActionListener(){
#Override
public void actionPerformed(ActionEvent e) {
type = "Beverage";
frame.validate();
}
});
/** Add everything to the panel **/
panel.add(new JLabel("Product ID"));
panel.add(new JLabel(Integer.toString(ps.getProductNr()+1)), "wrap, span 2");
panel.add(new JLabel("Name"));
panel.add(name = new JTextField(""), "wrap, span 2");
panel.add(new JLabel("Type"));
panel.add(food);
panel.add(beverage, "wrap");
panel.add(new JLabel("Price"));
panel.add(price = new JTextField(""), "wrap, span 2");
panel.add(new JLabel("Quantity"));
panel.add(quantity = new JTextField(""), "wrap, span 2");
/** Button: ADD **/
add = new JButton("Add product");
add.addActionListener(new ActionListener() {
#Override
public void actionPerformed(ActionEvent e) {
if ( !type.equals("Food") && !type.equals("Beverage")) {
JOptionPane.showMessageDialog(panel, "Please choose the type of this product.");
} else if (name.getText().equals("")) {
JOptionPane.showMessageDialog(panel, "Please type a name for this product.");
} else if (price.getText().equals("")) {
JOptionPane.showMessageDialog(panel, "Please enter the price for this product.");
} else if (quantity.getText().equals("")) {
JOptionPane.showMessageDialog(panel, "Please enter the available amount of this product in stock.");
} else {
try {
p = new Product(ps.getProductNr()+1, name.getText(), type, Double.parseDouble(price.getText()), Integer.parseInt(quantity.getText()));
if (ps.addProduct(p)) {
JOptionPane.showMessageDialog(panel, "Product successfully added!");
frame.validate();
frame.dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING));
}
} catch (Exception ex) {
addFinalError();
}
}
}
});
/** Button: CANCEL **/
cancel = new JButton("Cancel");
cancel.addActionListener(new ActionListener() {
#Override
public void actionPerformed(ActionEvent e) {
frame.dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING));
}
});
/** Add buttons to the panel **/
panel.add(cancel);
panel.add(add, "span 2");
/** Add panel to frame and make it visible **/
frame.add(panel);
frame.setVisible(true);
}
/**
* In case more then one error is encountered
*/
private void addFinalError(){
JOptionPane.showMessageDialog(frame, "An error occured while adding the product. Please make sure the following is correct:\n\n" +
" Name : Can contain letters and numbers\n" +
" Price : Must be a number\n" +
" Quantity : Must be a whole number\n");
}
}
You need to work on the JTable model part and then refresh , revalidate will work.
Just try some examples of JTable dynamic updates like create TableModel and populate jTable dynamically
maybe a static Method in the AddProduct class that returns the created Product will solve your problem. Take a look at the JOptionPane API for example static String showInputDialog(Object message)
The easy way would be to have a method in the main class that fills the table with data and in your actionPerformed method where you are handling adding a new record call that method after a record has been added. That way the main class is handling the update of the table model and the internals of the JTable will handle the repainting of the table. You could even use a method from the UpdateProducts to only update the table if adding a record was successful.
public void actionPerformed(ActionEvent e) {
UpdateProduct up = new UpdateProduct();
if(up.addRecord(ps.getProductByID(15))){
fillTable();
}
}
Hope that helps some.

Categories

Resources