Bonjour,
J'ai un tabbedPane initialisé par un JTree (les branches cliquées importent des tabs dans le tabbedPane). Dans chaque Tab j'ai des JPanel contenant des JTables.
Les données du JTree arrivent d'un autre programme ( transfert XML...) et j'aimerais effectuer un refresh (lors d'un appui sur un bouton) de ces tabs même lorsqu'elles sont ouvertes. Le refresh marche mais si la Tab est ouverte et qu'elle a été modifiée, l'affichage lui ne l'est pas. je dois alors fermer la tab et la reouvrir.
J'utilise pourtant la méthode fireTableDataChanged() mais je dois mal l’implémenter, voilà ce que je fais en gros (une partie du code est retire pour plus de clarté) :
Ca c'est pour la classe qui crée les JPanels de mes Tabs.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 public class aveStatusTablePanel extends JPanel { private JTable table; private DefaultTableModel tableModel; private JButton deleteButton; private int minNbrOfRows = 0; private int initialNbrOfRows = 2; private JLabel elementLabel = null; private aveComboBoxCellRenderer comboRenderer[]; private static final Matcher TWO_DIM_TABLE = Pattern.compile("(?s)^\\(\\s*\\[.*\\]\\s*\\)").matcher(""); public aveStatusTablePanel(String[] header) { private void initStatusTablePanel(String[] header) { Object[][] data = {}; int dimension = header.length; // Create empty table (rows are added dynamically) tableModel = new DefaultTableModel(data, header); table = new JTable(tableModel); table.setDefaultRenderer(Object.class, new aveTableCellRenderer()); // Usually editing is not terminated if the focus is lost, change this! table.putClientProperty("terminateEditOnFocusLost", true); table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); // Pack table aveTableCustom.packColumns(table, 25); aveTableCustom.packRows(table, 0); // Embed table into scroll pane aveTableScrollPane tableScroll = new aveTableScrollPane(table); // Layout is BorderLayout this.setLayout(new BorderLayout()); // Give any resize space to table this.add(tableScroll, BorderLayout.CENTER); } public void refresh() { tableModel.fireTableDataChanged(); table.setModel(tableModel); JScrollPane scrollPane = new JScrollPane(table); this.add(scrollPane, CENTER_ALIGNMENT); } }
Le refresh général se fait dans une autre fonction, voila le code :
Secret (cliquez pour afficher)
Code : Java - Sélectionner
Je pense ne pas être loin de la solution mais je bloque un peu.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 public boolean refreshResultStatus() { // Success of refreshing boolean success = true; DOMTree domTree = getDOMTree(); Stack<Integer> toBeDeleted = new Stack<Integer>(); for (int i = 0; i < tabbedPane.getTabCount(); i++) { String funcDef = getFunction((JPanel) tabbedPane.getComponentAt(i)).replaceFirst(";$", ""); Map<String, String> paramMap = aveScanFormat.scanFunction(funcDef); String funcType = paramMap.get("funcType"); TreeNode funcDefNode = getFuncNode(domTree, funcType); if (funcDefNode == null || resultsNodeIsDisabled(domTree, funcDefNode, funcType)) { toBeDeleted.push(i); success = false; } // Function is valid, update StatusPanel aveStatusTablePanel StatusPanel = (aveStatusTablePanel) getPanelParameter(i, "status"); StatusPanel.refresh(); } // Delete invalid contents, if there are any while (!toBeDeleted.empty()) { tabbedPane.remove(toBeDeleted.pop()); } // update corresponding status panel AFTER all functions have been processed updateStatus(); return success; }
Quelqu'un saurait-il m'expliquer comment procéder ?
Je vous en remercie d'avance.







Répondre avec citation
Partager