Java,如何从另一个框架刷新一个框架中的JTable
因此,我有一个MainFrame类,其中有一个JTable,列出了存储在数据库中的所有产品。 JButton在侦听器的帮助下将打开AddProduct(另一个类和另一个窗口/框架),我可以在其中添加产品。不幸的是,一旦AddProduct添加新产品和自动关闭,我不确定如何在MainFrame中更新/重新验证JTable。 有些人可以给我一些想法,我该如何轻松解决这个问题?Java,如何从另一个框架刷新一个框架中的JTable
由于程序是相当大的,这里是它的相关部分: 从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;
}
而且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");
}
}
也许在AddProduct
类返回创建Product
将解决你的问题的静态方法。看看在JOptionPane API例如static String showInputDialog(Object message)
为什么在所有事情的名字中,你推荐使用静态任何东西?对不起,但这是可怕的建议。 -1票。 – 2012-03-21 14:37:32
您需要在JTable的模型的一部分工作,然后刷新,重新验证将工作。 试试看的JTable动态更新的一些例子像create TableModel and populate jTable dynamically
再次:如果模型的行为您没有_need_(不重新刷新不刷新不重新验证)在_JTable_上执行任何操作... – kleopatra 2012-03-20 11:58:27
最简单的方法是在主类中的方法填充数据,并在您的actionPerformed方法,你正在处理添加新记录调用该方法后的表一个记录已被添加。这样,主类正在处理表模型的更新,而JTable的内部将处理表的重绘。如果添加记录成功,您甚至可以使用UpdateProducts中的方法仅更新表。
public void actionPerformed(ActionEvent e) {
UpdateProduct up = new UpdateProduct();
if(up.addRecord(ps.getProductByID(15))){
fillTable();
}
}
希望有助于一些。
不确定要尝试什么。我的第二天曾经和gui一起工作过,所以我有点害怕,因为与我还没有做的其他程序相比,这只是一个小小的挫折。我用Google搜索了它,但大多数答案都没有帮助,或者我不知道如何实现它们。所以,当我问我应该从哪里开始。我不想找人为我编程,只是为了指点我。 – vedran 2012-03-20 11:18:52