JTable没有得到更新
我创建了一个货币兑换计算器从互联网上导入它的日期,将它存储在一个.dat文件中,并将其所有数据显示在JTable中。JTable没有得到更新
它应该按照以下方式工作,如果更新JTable,计算器使用的汇率也会发生变化,过去工作得很好,直到我需要从数据库本身导入JTable的数据为止。 我也有一种手动更新数据库中所有数据的方法,即作为堆栈工作,并且表和计算器应始终从最近导入的货币汇率中获取数据。
现在的问题是,当您第一次手动编辑表时,它完美地工作,但如果我使用该方法更新数据,它将更新数据,因为它应该和计算器将使用更新的数据,但表格将不再有效。这意味着,在使用该方法后,它不再更新表格,手动编辑表格中的数据不会影响计算器使用的数据。
有什么办法可以在更新数据库时更新整个表? 现在它的工作方式如下: JTable构造函数接受数据库中的第一个元素,当我更新数据库时,我相信该表完全不会影响。
我创建了一个更加简化代码,显示问题:
package calc.test;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
public class main_calc {
private JFrame main_frame, table_frame;
private JMenuBar menuBar;
private JScrollPane scrollpane;
private JTable my_table;
private TableRowSorter<TableModel> rowSorter;
private String[] columns = { "Name", "Unit", "Currency", "Country", "Rate", "Change" };
private JMenuItem view_table, updates;
private JMenu File_;
private JButton Show_value;
private static JTextField result_field;
private JTextField jtFilter;
private static Database my_data;
private JPanel top_right_frame, bottom_left_frame, bottom_right_frame;
private JPanel table_panel;
private static JComboBox<String> from_ComBox;
private JLabel search_label;
final static private String[] Currencies = { "NIS", "USD", "GBP", "JPY", "EUR", "AUD", "CAD", "DKK", "NOK", "ZAR",
"SEK", "CHF", "JOD", "LBP", "EGP" };
private boolean was_created = false;
public main_calc() {
my_data = new Database();
Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
main_frame = new JFrame("My Currency Exchange Calcualtor");
menuBar = new JMenuBar();
File_ = new JMenu("File");
File_.setMnemonic(KeyEvent.VK_F);
updates = new JMenuItem("Update currrencies");
updates.setMnemonic(KeyEvent.VK_F);
updates.addActionListener((ActionEvent event) -> {
try {
Extraction_BOI(my_data);
} catch (Exception e) {
e.printStackTrace();
}
});
view_table = new JMenuItem("Table");
table_frame = new JFrame("Currencies' Table");
table_panel = new JPanel();
table_panel.setLayout(new BorderLayout());
table_frame.setLayout(new BorderLayout());
table_frame.setSize(540, 277);
table_frame.setResizable(false);
view_table.setMnemonic(KeyEvent.VK_F);
view_table.addActionListener((ActionEvent event) -> {
if (!(was_created)) {
try {
Table_Creation();
search_label = new JLabel();
search_label.setText("Search:");
table_panel.add(search_label, BorderLayout.WEST);
table_panel.add(jtFilter, BorderLayout.CENTER);
table_frame.add(scrollpane, BorderLayout.CENTER);
table_frame.add(table_panel, BorderLayout.SOUTH);
jtFilter.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
String text = jtFilter.getText();
if (text.trim().length() == 0) {
rowSorter.setRowFilter(null);
} else {
rowSorter.setRowFilter(RowFilter.regexFilter("(?i)" + text));
}
}
@Override
public void removeUpdate(DocumentEvent e) {
String text = jtFilter.getText();
if (text.trim().length() == 0) {
rowSorter.setRowFilter(null);
} else {
rowSorter.setRowFilter(RowFilter.regexFilter("(?i)" + text));
}
}
@Override
public void changedUpdate(DocumentEvent e) {
throw new UnsupportedOperationException("Not supported yet.");
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
table_frame.setVisible(true);
was_created = true;
});
Show_value = new JButton("Show");
result_field = new JTextField(10);
top_right_frame = new JPanel();
bottom_right_frame = new JPanel();
bottom_left_frame = new JPanel();
from_ComBox = new JComboBox<>(Currencies);
try {
Extraction_BOI(my_data);
} catch (Exception e) {
e.printStackTrace();
}
main_frame.setLocation(dim.width/2 - main_frame.getSize().width/2,
dim.height/2 - main_frame.getSize().height/2);
table_frame.setLocation(dim.width/2 - table_frame.getSize().width/2,
dim.height/2 - table_frame.getSize().height/2);
}
public void start() {
main_frame.setLayout(new GridLayout(0, 2));
menuBar.add(File_);
File_.add(view_table);
File_.add(updates);
main_frame.setJMenuBar(menuBar);
main_frame.add(top_right_frame);
main_frame.setResizable(false);
main_frame.setSize(400, 200);
main_frame.setVisible(true);
top_right_frame.setLayout(new FlowLayout());
top_right_frame.add(from_ComBox);
main_frame.add(bottom_left_frame);
main_frame.add(bottom_right_frame);
bottom_left_frame.add(Show_value);
bottom_right_frame.add(result_field);
Show_value.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
main_calc.get_table_cell();
}
});
main_frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public String[][] Extraction_BOI(Database my_data) throws Exception {
URL url = new URL("http://www.boi.gov.il/currency.xml");
String[] str = { "NAME", "UNIT", "CURRENCYCODE", "COUNTRY", "RATE", "CHANGE", "LAST_UPDATE" };
String listOfAll[][] = new String[15][7];
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestMethod("GET");
con.connect();
InputStream in = con.getInputStream();
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(in);
int i = 0, j = 1, k = 0;
listOfAll[0][0] = "Shekel";
listOfAll[0][1] = "1";
listOfAll[0][2] = "NIS";
listOfAll[0][3] = "ISR";
listOfAll[0][4] = "1";
listOfAll[0][5] = "0";
listOfAll[0][6] = "-";
// Copy XML Elements into NodeLists//
NodeList listName = doc.getElementsByTagName(str[0]);
NodeList listUnit = doc.getElementsByTagName(str[1]);
NodeList listCurrencyCode = doc.getElementsByTagName(str[2]);
NodeList listCountry = doc.getElementsByTagName(str[3]);
NodeList listRate = doc.getElementsByTagName(str[4]);
NodeList listChange = doc.getElementsByTagName(str[5]);
// Copy all the NodeLists into String array named listOfAll//
for (i = 0; i < listName.getLength(); i++, j++, k = 0) {
listOfAll[j][k] = listName.item(i).getTextContent();
k += 1;
listOfAll[j][k] = listUnit.item(i).getTextContent();
k += 1;
listOfAll[j][k] = listCurrencyCode.item(i).getTextContent();
k += 1;
listOfAll[j][k] = listCountry.item(i).getTextContent();
k += 1;
listOfAll[j][k] = listRate.item(i).getTextContent();
k += 1;
listOfAll[j][k] = listChange.item(i).getTextContent();
k += 1;
}
in.close();
con.disconnect();
try {
my_data.put(listOfAll);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
my_data.serialize();
return listOfAll;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
main_calc gui = new main_calc();
gui.start();
}
});
}
public static void get_table_cell() {
String[][] datas;
datas = my_data.peek();
int from_Index = from_ComBox.getSelectedIndex();
String result = datas[from_Index][4];
result_field.setText(String.valueOf(result));
}
@SuppressWarnings("serial")
public void Table_Creation() throws Exception {
this.my_table = new JTable(my_data.peek(), columns) {
public boolean isCellEditable(int row, int column) {
if (my_table.getValueAt(row, 0) == "Shekel" || column != 4)
return false;
return true;
}
};
this.scrollpane = new JScrollPane(my_table);
my_table.setFillsViewportHeight(true);
TableColumn column = null;
for (int i = 0; i < 5; i++) {
column = my_table.getColumnModel().getColumn(i);
column.setPreferredWidth(30);
}
rowSorter = new TableRowSorter<>(my_table.getModel());
jtFilter = new JTextField();
my_table.setRowSorter(rowSorter);
}
}
数据库类:
package calc.test;
import java.util.Vector;
import java.io.*;
@SuppressWarnings("serial")
public class Database extends Vector<String[][]> {
Database() {
super();
}
void put(String[][] o) {
addElement(o);
}
String[][] peek() {
if (isEmpty()) return null;
return (String[][]) lastElement();
}
void serialize(){
try {
FileOutputStream fout = new FileOutputStream("mydata.dat");
ObjectOutputStream oos = new ObjectOutputStream(fout);
oos.writeObject(this);
oos.close();
}
catch (Exception e) { e.printStackTrace(); }
}
}
在我创造我删除了接口和去除大部分的东西代码。
如果您手动更新表格并单击show,它将显示您输入的更新值,因此它会更新数据库,因为get_table_cell
方法始终会从数据库中获取数据。如果从菜单中单击更新,则从现在开始更新的所有内容对于表格都是徒劳的,但“计算器”仍将使用数据库中的更新值。
最终我确实设法通过一些解决方法来解决这个问题。我已经改变了JTable构造函数将接收一个tableModel,而不是一个String [] []和列,那样,每当我更新数据库,我只是编辑tableModel。
至于计算器转换方法,在上面列出的代码get_table_cell
中,我使它从JTable获取数据,并且由于每次单击udpate按钮时我总是更新表,所以计算器将始终使用更新的数据,所以现在当我手动编辑表时,即使在第一次更新之后,我仍然可以给计算器手动数据,而不仅仅是从数据库中。
我将它类似的东西:
一些表的创建方法:
public void tableCreation() throws Exception {
modelTable = new DefaultTableModel(myDatabase.peek(), columns);
BOI_Calculator.myTable = new JTable(modelTable);
计算器方法,它从表中获取数据:
outcome = convertFromSum * ((Double.parseDouble((String) myTable.getValueAt(fromIndex, 4)))
/(Double.parseDouble((String) myTable.getValueAt(toIndex, 4))));
outcome = Double.parseDouble(new DecimalFormat("##.####").format(outcome));
outputField.setText(String.valueOf(outcome));
而且我每次点击更新按钮时都会更新数据库和表格:
extractData(myDatabase);
String[][] temp = myDatabase.peek();
DefaultTableModel temp2 = new DefaultTableModel(temp, columns);
myTable.setModel(temp2);
''我不相信剩下的代码是需要的,但如果它确实让我知道......“ - 请看[mcve]和[SSCCE](http:// sscce .org)链接来查看*确切的*需要什么代码。这不是代码的其余部分,而是更多的代码,足以让我们编译,运行代码不变(无数据库允许),并遇到问题,但足够小以便在代码格式的文本中发布在您的问题中。 –
@HovercraftFullOfEels,我已经添加了更多的代码部分,如果他需要整个代码,请告诉我,所以它会更容易编译 – Voxito
请阅读或重新阅读我上面发布的链接。他们会解释(以及我已经说过的)为什么我们绝对不想看到整个程序,以及为什么你发布的代码段不如我们试图让你发布的内容有帮助。请在回复前阅读链接*。 –