我有一个套接字连接的客户端和服务器。我尝试将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程序中,而不是在套接字程序上。有什么想法吗?
发布于 2014-05-03 07:23:42
您需要将setMaximum()在ProgressMonitorInputStream的ProgressMonitor上调用到预期的下载大小。否则它就不知道“进步”意味着什么。
您不必用一个setProgress()调用ProgressMonitorInputStream。这是自动完成的。
你不需要DataInputStream.
你应该一次读更多的字节。读入byte[]缓冲区。
发布于 2014-05-03 07:10:40
调用frm.setVisible(true);使之可见。这两个类的变化。
删除frm.show(),因为它是一个不推荐的方法。看这里,Component#show()。
样本代码:
private void createAndShowUI() {
frm = new JFrame();
...
// call in the end after adding all the components
frm.setVisible(true);
}https://stackoverflow.com/questions/23441380
复制相似问题