아이디어 분석 :
작업 패널과 진행률 표시 줄이 있어야하므로 JFrame 클래스를 상속하는 두 가지 양식이 나타나야합니다.
먼저 호출 된 진행률 표시 줄 양식을 살펴보면 수동 작업이 필요하지 않으므로 클래스 내에서 메소드를 구현할 수 있습니다. 설계 파일 작업으로 인해 예외를 잡아야합니다. 먼저 복사 할 파일을 기반으로 파일 객체를 작성한 다음 복사 된 파일의 저장된 주소를 기반으로 파일 객체를 작성한 다음 파일 OutputStream 객체를 작성한 다음 FileInputStream 객체를 작성한 다음 ProgressMonitorIntrestReam 객체를 작성한 다음 읽습니다. 파일. 총 시간이 2 초 이상 걸리면 진행 상황 모니터링 창이 자동으로 나타납니다. 그런 다음 바이트 배열을 정의한 다음 While Loop을 사용하여 파일을 읽고 FileOutputStream 클래스의 write () 메소드를 사용하여 스트림을 통해 데이터를 쓰고 FileOutputStream 클래스의 Close () 메소드를 사용하여 출력 스트림을 닫습니다. 마지막으로 ProgressMonitorInputStream 클래스의 Close () 메소드를 사용하여 입력 스트림을 닫습니다. 이 메소드에는 세 가지 매개 변수가 필요하다는 것을 알 수 있습니다. 부모 창이 팝업, 파일 주소를 복사 할 파일 및 복사 할 폴더가 필요합니다.
코드는 다음과 같습니다.
ProgressMonitortest.java :
코드 사본은 다음과 같습니다.
패키지 cn.edu.xidian.crytoll;
import java.io.fileInputStream;
java.io.*;
import javax.swing.jframe;
import javax.swing.progressmonitorinputstream;
공개 클래스 Progressmonitortest {
public void useprogressmonitor (jframe frame, String copypath, String newPath) {
노력하다 {
파일 = 새 파일 (copypath);
파일 NewFile = 새 파일 (NewPath);
fileoutputStream fop = new FileOutputStream (newFile);
inputStream in = new FileInputStream (파일);
// 파일을 읽습니다. 총 2 초 이상이 걸리면 진행 상황 모니터링 창이 자동으로 나타납니다.
ProgressMonitorInputStream PM = New ProgressMonitorInputStream (
프레임, "파일 읽기, 기다려주세요 ...", in);
int c = 0;
바이트 [] BYTES = 새로운 바이트 [1024];
while ((c = pm.read (bytes))! = -1) {// 파일을 읽는 루프
FOP.WRITE (BYTES, 0, C);
}
fop.close (); // 출력 스트림을 닫습니다
pm.close (); // 입력 스트림을 닫습니다
} catch (예외) {
ex.printstacktrace ();
}
}
}
3. 메인 형식을 다시보십시오. 말할 것도없이, Jlabel과 Jtextfield는 파일을 선택하고 폴더를 선택하는 두 버튼도 일반적입니다. 가장 중요한 것은 "시작"버튼입니다. 새로운 형태는 JFrame 클래스를 상속 할뿐만 아니라 런닝 가능한 인터페이스를 구현해야합니다. 그의 삼촌.
4. 사본을 시작하는 특정 메소드에서 먼저 스레드 개체를 새 스레드로 작성한 다음 객체의 start () 메소드를 호출하고 run () 메소드를 과부하하고 메소드에서 진행률 막대 객체를 작성하고 사용하십시오. jtextfield 클래스의 getText () 메소드는 파일 주소를 복사하고 복사 할 경로를 가져온 다음 진행률 표시 줄 클래스에서 메소드를 호출합니다.
코드는 다음과 같습니다.
코드 사본은 다음과 같습니다.
패키지 cn.edu.xidian.crytoll;
java.awt.borderlayout import;
java.awt.desktop import;
java.awt.dimension import;
java.awt.eventqueue import;
java.awt.gridbagconstraints import;
java.awt.gridbaglayout import;
java.awt.insets 가져 오기;
import java.awt.event.actionevent;
import java.awt.event.actionListener;
import java.io.file;
import java.io.filenotfoundException;
import java.io.filereader;
import java.io.filewriter;
import java.io.ioexception;
import javax.swing.jbutton;
import javax.swing.jfilechooser;
import javax.swing.jframe;
import javax.swing.jlabel;
import javax.swing.joptionpane;
import javax.swing.jpanel;
import javax.swing.jtextfield;
import javax.swing.border.emptyborder;
import javax.swing.filechooser.filenameextensionFilter;
공개 클래스 usermonitorframe은 jframe emplements runnable {를 확장합니다.
/**
*
*/
개인 정적 최종 최종 긴 SerialversionUID = 8674569541853793419L;
개인 jpanel contentpane;
개인 jtextfield 파일 필드;
개인 JtextField SearchTextField;
Private Jtextfield ReplacetextField;
개인 파일 파일;
개인 Jtextfield Textfield;
개인 jtextfield textfield_1;
/**
* 응용 프로그램을 시작하십시오.
*/
public static void main (String [] args) {
eventqueue.invokelater (new Runnable () {
public void run () {
노력하다 {
usermonitorframe 프레임 = 새로운 usermonitorframe ();
frame.setVisible (true);
} catch (예외 e) {
e.printstacktrace ();
}
}
});
}
/**
* 프레임을 만듭니다.
*/
public usermonitorframe () {
setResizable (false);
setDefaultCloseOperation (jframe.exit_on_close);
세트 바운드 (100, 100, 501, 184);
settitle ( "파일을 읽을 때 진행 상황 사용");
getContentPane (). setLayout (null);
Jlabel 레이블 = New Jlabel ( "/u6587/u4ef6/u5730/u5740/uff1a");
label.setbounds (10, 10, 70, 15);
getContentPane (). add (레이블);
Textfield = New Jtextfield ();
Textfield.setBounds (90, 7, 300, 21);
getContentPane (). Add (TextField);
Textfield.setColumns (10);
JBUTTON 버튼 = New JButton ( "/u9009/u62e9/u6587/u4ef6");
button.addactionListener (new ActionListener () {
public void actionperformed (ActionEvent e) {
do_button_actionperformed (e);
}
});
button.setbounds (400, 6, 93, 23);
getContentPane (). add (버튼);
Jlabel label_1 = new Jlabel ( "/u590d/u5236/u5730/u5740/uff1a");
label_1. 세트 바운드 (10, 40, 70, 15);
getContentPane (). add (label_1);
TextField_1 = 새로운 jtextfield ();
Textfield_1. 세트 바운드 (90, 38, 300, 21);
getContentPane (). add (TextField_1);
TextField_1.SetColumns (10);
JBUTTON BULTIL_1 = NEW JBUTTON ( "/u9009/u62e9/u5730/u5740");
button_1.addactionListener (New ActionListener () {
public void actionperformed (ActionEvent e) {
do_button_1_ActionPerformed (e);
}
});
button_1. 세트 바운드 (400, 39, 93, 23);
getContentPane (). add (button_1);
JBUTTON BULTIL_2 = NEW JBUTTON ( "/u5f00/u59cb/u590d/u5236");
button_2.addactionListener (new ActionListener () {
public void actionperformed (ActionEvent e) {
do_copybutton_actionperformed (e);
}
});
button_2.setbounds (182, 69, 93, 23);
getContentPane (). add (button_2);
}
보호 된 void do_button_actionperformed (ActionEvent e) {
JFILECHOOSER ChoOser = New JFileChooser ();
chooSer.setFilesElectionMode (jfilechooser.files_only);
// 파일 열기 대화 상자 표시
int 옵션 = chooser.showopendialog (this);
// 사용자가 취소 버튼 대신 열기 버튼을 누르는지 확인하십시오.
if (옵션! = jfilechooser.Approve_Option)
반품;
// 사용자가 선택한 파일 객체를 가져옵니다
file = chooser.getSelectedFile ();
// 텍스트 상자에 파일 정보를 표시합니다
textfield.settext (file.toString ());
}
보호 된 void do_button_1_ActionPerformed (ActionEvent e) {
JFILECHOOSER ChoOSER = New JFILECHOOSER ();
chooser.setfileSelectionMode (jfilechooser.directories_only);
int 옵션 = chooser.showopendialog (this);
if (옵션! = jfilechooser.Approve_Option)
반품;
file = chooser.getSelectedFile ();
textfield_1.settext (file.toString ());
}
// 복사 버튼 확인 클릭 이벤트를 확인하십시오
보호 된 void do_copybutton_actionperformed (ActionEvent arg0) {
스레드 스레드 = 새 스레드 (this);
thread.start ();
}
// 멀티 스레딩 기술을 사용하여 읽기 작업을 실현합니다
@보수
public void run () {
ProgressMonitortest test = new ProgressMonitortest ();
문자열 path = textfield.getText ();
문자열 save = textfield_1.getText ();
test.useprogressmonitor (this, path, save+path.substring (path.lastindexof ( "."), path.length ()));
}
}