Re: Coordinating multiple JTextField updates across panels
In article <4a36e448$0$30328$b9f67a60@news.newsdemon.com>,
Knute Johnson <nospam@rabbitbrush.frazmtn.com> wrote:
John B. Matthews wrote:
In article
<4a366bb8$0$32356$5a62ac22@per-qv1-newsreader-01.iinet.net.au>,
"Jarrick Chagma" <jarrick@large.com> wrote:
[...]
Do you realise that there are many, many panels and that
this is the cause of the problem?
How many is "many, many"? I see apparently simultaneous updates
with 256 separate JPanels. I really don't think that's the problem.
Perhaps you could supply a short example:
<http://pscode.org/sscce.html>.
Here's an SSCCE with a thousand JTextFields being updated. I see his
problem on my computer. A really fast computer might not.
I see your point, but a thousand fields on my oldest 1 GHz machine
causes barely a ripple; that's 20 times the 50 text fields mentioned by
the OP. Your glass pane example and Michael Rauscher's use of
RepaintManager are exemplary, but I fear the OP may have systemic
problems, too. In particular, he may have errant processes interrupting
his application, as suggested by Mark Space.
I would also advocate carefully separating the view and the model, as
suggested in the example below. The single notification allows the
numerous update events to coalesce. If the model's update method takes
unacceptably long, it can be delegated to a SwingWorker.
<code>
import java.awt.*;
import java.awt.event.*;
import java.util.Observable;
import java.util.Observer;
import javax.swing.*;
/** @author John B. Matthews */
public class UpdateTest {
private static final int ROW = 16;
private static final int COL = 16;
private static final int MAX = COL * ROW;
private static final DataModel model = new DataModel(MAX);
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@ Override
public void run() {
new UpdateTest().create();
}
});
}
void create() {
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(ROW, COL));
for (int i = 0; i < MAX; i++) {
panel.add(new ViewPanel(model, i));
}
JButton button = new JButton("Update");
button.addActionListener(new ActionListener() {
@ Override
public void actionPerformed(ActionEvent e) {
model.update();
}
});
JFrame f = new JFrame("JTextTest");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(panel, BorderLayout.CENTER);
f.add(button, BorderLayout.SOUTH);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}
class ViewPanel extends JPanel implements Observer {
private final JTextField item = new JTextField();
private DataModel model;
private int index;
public ViewPanel(DataModel model, int i) {
this.model = model;
this.index = i;
this.add(item);
item.setText(Long.toString(model.get(i)));
model.addObserver(this);
}
public void update(Observable o, Object arg) {
item.setText(Long.toString(model.get(index)));
}
}
class DataModel extends Observable {
private final long[] data;
public DataModel(int n) {
data = new long[n];
for (int i = 0; i < data.length; i++) {
data[i] = i + 100;
}
}
public void update() {
for (int i = 0; i < data.length; i++) {
data[i]++;
}
this.setChanged();
this.notifyObservers();
}
public long get(int i) {
return data[i];
}
}
</code>
[...]
--
John B. Matthews
trashgod at gmail dot com
<http://sites.google.com/site/drjohnbmatthews>