我的程序中有一个 JTable。我想在单击 JButton 后更新它。 我写了这个:
DefaultTableModel myTable = new DefaultTableModel(celDatas,celNames);
JTable source = new JTable(myTable){public boolean isCellEditable(int rowIndex, int colIndex) {
return false;}};
JScrollPane pane = new JScrollPane(source);
(...)
start.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
query = "Select sal FROM EMP";
myTable =(DefaultTableModel)source.getModel();
myTable.fireTableDataChanged();
}
问题是 id 没有更新我在 JTable 上的数据。 如何解决这个问题?
编辑: JTable是通过JScrollPane显示在我的家伙里面的。 我现在做这个:
source = new JTable(myTable){public boolean isCellEditable(int rowIndex, int colIndex) {return false;}};
pane = new JScrollPane(source);
我还创建了一个新的 void,从数据库获取数据的地方 + 在那里我定义了 myTable:
void queryConnection() {
(...)
myTable = new DefaultTableModel(celDatas,celNames);
我添加了一个 JButton,它更新了我的 JTable(当我们更改查询时。
start.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
query = "Select sal FROM EMP";
queryConnection();
}
}
============================================= =================================
public class Application2 implements Runnable {
private JTable source;
private JScrollPane pane;
private DefaultTableModel myTable;
private JPanel panel;
private String[][] celDatas = null;
private String[] celNames = null;
public void run() {
(...)
start.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
if(...) {
query = "Select sal FROM EMP";
queryConnection();
}
}
if(query == null) {
query = "Select * from EMP";
queryConnection();
}
source = new JTable(myTable){public boolean isCellEditable(int rowIndex, int colIndex) {return false;}};
pane = new JScrollPane(source);
pane.setSize(f.getSize().width-60,300);
pane.setLocation(30,20);
panel.add(pane);
f.add(panel);
f.pack();
}
void queryConnection() {
//here is connection and downloading datas
myTable = new DefaultTableModel(celDatas,celNames);
}
我希望现在更方便? ;)
最佳答案
如果您正在创建一个新的 TableModel,则不需要调用任何 fireXXX()
方法,但如果您正在编写基于 AbstractTableModel 的 TableModel,则主要需要调用这些方法(你不)。
我认为您的问题出在其他地方。您似乎正在创建一个新的 JTable 并将其添加到一个新的 JScrollPane 中。您是否将这些组件添加到您的 GUI(您没有显示)?如果是这样,您要添加的容器是否能够顺利接受新组件?您是否重新验证并重新粉刷容器?您新创建的 JTable 是否显示在 GUI 中?
或者,您的 GUI 中是否已经显示了一个 JTable?如果是这样,也许您只想设置它的模型而不是创建一个新的 JTable。我赞成这个解决方案是最简单的。
编辑 1
我会这样做:
- 在后台线程中访问数据库并从中获取信息。
- 创建一个新的 DefaultTableModel 对象,用从数据库中提取的数据填充它。
- 如果 JTable 已经存在,我不会创建新的 JTable。相反,我只是在当前显示的 JTable 上调用
setTableModel(...)
并传入我新创建的 DefaultTableModel 对象。 - 然后我会坐下来享受我成功带来的巨额收入和其他成果。
编辑2
Ganjira,为了让我们能够最好地帮助您,我们需要更好地理解问题,这就是为什么我要求对您的问题进行全面澄清或 sscce ,其中我都没有见过。我在理解您的问题时遇到的问题包括:
- 同样,您是否已经在 GUI 中显示了一个 JTable,现在您正试图根据从数据库中提取的数据更改 JTable 中显示的数据?
- 如果是这样,为什么不简单地更改现有 JTable 的模型而不是创建一个全新的 JTable?
- 如果您的应用程序中还没有 JTable 而现在您想要显示一个,您声明您的数据没有显示,但没有显示代码来帮助我们理解原因。
- 如果您能回答前两个问题,我们可能不需要 sscce,但如果不需要,请理解您当前的帖子离 sscce 还差得很远。 ,因为我们无法运行它,我们无法编译它,它不会为我们重现您的问题,...我想知道您是否已经阅读了链接,因为它解释了为什么所有这些条件都很重要(那个和简洁,以免我们淹没在大量不相关的代码中)。
- 不,您不需要发布 SSCCE,但如果我们无法根据您问题中的文本和您的代码片段帮助您,它确实提供了更好的机会让我们了解问题并找到一个适合您的解决方案。
编辑 3
你声明:
JTable's been already in GUI, because it shows the 'beginning of the program'. After clicking JButton I want to change values in JTable. It doesn't change the model of the existing JTable - it doesn't change nothing.
这让我感到困惑,因为最好的解决方案是我一直建议的——不要创建新的 JTable,而是创建一个新的 DefaultTableModel 并更改现有 JTable 的模型。你还没有提到为什么你不尝试这个,或者如果你已经尝试过,它为什么不适合你。
关于Java - 使用 fireTableDataChanged() 更新 JTable;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10162950/