ソケット接続のクライアントとサーバーがあります。サーバーに progressMonitorInputStream() を実装しようとしましたが、データは完全に転送されますが、進行状況モニターは表示されません。ファイルから片側だけを読み取るために実装しようとしましたが、進行状況モニターは正常に動作します。以下は両方のコードです
サーバ:
public class Server implements ActionListener, PropertyChangeListener {
DataInputStream dis;
ProgressMonitor pm;
ProgressMonitorInputStream pmis;
JFrame frm;
Server s;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new Server().createAndShowUI();
}
});
}
private void createAndShowUI() {
frm = new JFrame();
JPanel panel = new JPanel();
JButton st = new JButton("Start");
st.setPreferredSize(new Dimension(80, 25));
panel.add(st);
panel.setSize(500, 50);
frm.add(panel);
frm.setLocationRelativeTo(null);
frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frm.pack();
frm.show();
st.addActionListener(this);
}
@Override
public void actionPerformed(ActionEvent e) {
frm.dispose();
try {
ServerSocket ss = new ServerSocket(5555);
Socket soc = ss.accept();
dis = new DataInputStream(soc.getInputStream());
pmis = new ProgressMonitorInputStream(frm, "Progress", dis);
pm = pmis.getProgressMonitor();
// pm.setMillisToPopup(1);
Task task = new Task();
task.addPropertyChangeListener(s);
task.execute();
} catch (IOException ex) {
ex.printStackTrace();
}
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
if ("progress".equals(evt.getPropertyName())) {
int progress = (Integer) evt.getNewValue();
pm.setProgress(progress);
}
}
class Task extends SwingWorker<Void, Void> {
@Override
protected Void doInBackground() throws Exception {
int progress = 0;
setProgress(0);
int x;
while ((x = pmis.read()) != -1) {
System.out.print((char) x);
setProgress(progress);
progress++;
}
pmis.close();
return null;
}
@Override
public void done() {
pm.close();
}
}
}
上記のコードは問題のあるコードです。作業コードは以下のとおりです。
片側にファイル入力ストリームがある適切な作業コード
public class ProgressMonitorOwn implements ActionListener,
PropertyChangeListener {
JFrame frm;
Task task;
DataInputStream dis;
ProgressMonitorInputStream pmis;
JButton but;
ProgressMonitor pm;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new ProgressMonitorOwn().createAndShowUI();
}
});
}
private void createAndShowUI() {
frm = new JFrame();
JPanel panel = new JPanel();
but = new JButton("Show");
but.setPreferredSize(new Dimension(100, 25));
panel.add(but);
panel.setSize(200, 100);
frm.add(panel);
frm.setSize(200, 100);
frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frm.setLocationRelativeTo(null);
frm.show();
but.addActionListener(this);
}
class Task extends SwingWorker<Void, Void> {
@Override
protected Void doInBackground() throws Exception {
int x;
int prog = 0;
while ((x = pmis.read()) != -1) {
System.out.print((char) x);
setProgress(prog);
Thread.sleep(100);
prog++;
}
return null;
}
@Override
public void done() {
but.setEnabled(true);
pm.close();
System.exit(0);
}
}
@Override
public void actionPerformed(ActionEvent e) {
but.setEnabled(false);
try {
FileInputStream fis = new FileInputStream("D:\\test\\test.txt");
dis = new DataInputStream(fis);
pmis = new ProgressMonitorInputStream(frm, "ProgressTest", dis);
} catch (FileNotFoundException ex) {
ex.printStackTrace();
}
task = new Task();
task.addPropertyChangeListener(this);
task.execute();
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
if ("progress" .equals(evt.getPropertyName())) {
int progress = (Integer) evt.getNewValue();
pm = pmis.getProgressMonitor();
pm.setProgress(progress);
}
}
}
進行状況モニターが FileInputStream プログラムでは表示されるのに、ソケット プログラムでは表示されない理由がわかりません。何か案は?