다음과 같은 예상되는 동작으로 JLabel을 업데이트하려고합니다.
COND 1 : JLabel이 5 초 동안 표시되고 다음 3 초 동안 표시되지 않고 5 초 동안 표시되어야합니다.
COND 2 : JLabel이 0.5 초 동안 표시되고 다음 3 초 동안 보이지 않아야합니다.
순열 조합의 종류에 따라 동작이 작동합니다. 다음은 샘플 코드입니다.
import java.awt.LayoutManager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingWorker;
public class Main
{
static CounterTask task;
public static void main ( String[] args )
{
final JLabel label = new JLabel( "TEST ME " );
JButton startButton = new JButton( "Start" );
startButton.addActionListener( new ActionListener()
{
public void actionPerformed ( ActionEvent e )
{
task = new CounterTask( label );
task.execute();
}
} );
JButton cancelButton = new JButton( "Cancel" );
cancelButton.addActionListener( new ActionListener()
{
public void actionPerformed ( ActionEvent e )
{
task.cancel( true );
}
} );
JPanel buttonPanel = new JPanel();
buttonPanel.add( startButton );
buttonPanel.add( cancelButton );
JPanel cp = new JPanel();
LayoutManager layout = new BoxLayout( cp, BoxLayout.Y_AXIS );
cp.setLayout( layout );
cp.add( buttonPanel );
cp.add( label );
JFrame frame = new JFrame();
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
frame.setContentPane( cp );
frame.pack();
frame.setVisible( true );
}
}
class CounterTask
extends SwingWorker< Integer, Integer >
{
int DELAY = 3000;
JLabel label;
int WAIT = 5000;
public CounterTask ( JLabel label )
{
this.label = label;
}
@Override
protected Integer doInBackground () throws Exception
{
int i = 0;
int count = 1000;
while ( !isCancelled() && i < count )
{
i++;
publish( new Integer[] { i } );
label.setVisible( false );
Thread.sleep( DELAY );
}
return count;
}
protected void process ( List< Integer > chunks )
{
Integer strContent = chunks.get( chunks.size() - 1 );
label.setVisible( true );
label.validate();
label.setText( "DISPLAYING " + strContent );
try
{
Thread.sleep( WAIT );
}
catch ( InterruptedException e )
{
e.printStackTrace();
}
}
@Override
protected void done ()
{
if ( isCancelled() )
System.out.println( "Cancelled !" );
else
System.out.println( "Done !" );
}
}
이 조합이 일부 데이터에 대해 작동하고 대부분 JLabel이 전체적으로 보이지 않기 때문에 분명히 뭔가 잘못하고 있지만 SOP를 넣으면 적절한 지연과 대기 시간에 적절한 데이터를 얻습니다.
Swing 워커의 위 코드에는 두 개의 변수 WAIT DELAY가 있습니다. WAIT는 JLabel을 X 초 동안 표시하고 DELAY는 JLAbel을 Y 초 동안 보이지 않게합니다. 그러나 다른 파마와 빗으로 시도하면 JLabel 가시성이 예상대로 작동하지 않는다는 것을 알게 될 것입니다. Label의 EDT 업데이트 또는 다시 그리기와 관련된 것일 수 있습니다. 근본 원인이 확실하지 않습니다.
예상 :
- 코드가 SOP처럼 작동하거나 이상적인 경우에 작동하도록 만들고 싶습니다.
- 제대로 작동하지 않는 이유를 알아야합니다.
SwingWorker는 깜박이는 레이블에 대한 과잉입니다. 다음 타이머 기반 접근 방식을 시도해보십시오. 스레드 마법이 전혀 필요하지 않습니다.
public class Main {
private static Timer setVisibleTimer;
private static Timer setInvisibleTimer;
public static void main(String[] args) {
final JLabel label = new JLabel("TEST ME ");
JButton startButton = new JButton("Start");
startButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
setVisibleTimer = new Timer(8000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
label.setVisible(true);
}
});
setInvisibleTimer = new Timer(5000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
label.setVisible(false);
}
});
setVisibleTimer.start();
setInvisibleTimer.start();
}
});
JButton cancelButton = new JButton("Cancel");
cancelButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
label.setVisible(true);
if (setVisibleTimer != null){
setInvisibleTimer.stop();
setVisibleTimer.stop();
}
}
});
JPanel buttonPanel = new JPanel();
buttonPanel.add(startButton);
buttonPanel.add(cancelButton);
JPanel cp = new JPanel();
LayoutManager layout = new BoxLayout(cp, BoxLayout.Y_AXIS);
cp.setLayout(layout);
cp.add(buttonPanel);
cp.add(label);
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setContentPane(cp);
frame.pack();
frame.setVisible(true);
}
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다