खोज…


एक विशिष्ट अवधि के लिए एक यूआई कार्य में देरी

सभी स्विंग से संबंधित ऑपरेशन एक समर्पित थ्रेड (EDT - E वेंट डी ispatch T hread) पर होते हैं। यदि यह थ्रेड ब्लॉक हो जाता है, तो UI गैर-प्रतिक्रियाशील हो जाता है।

इसलिए, यदि आप किसी ऑपरेशन में देरी करना चाहते हैं तो आप Thread.sleep उपयोग नहीं कर सकते। इसके बजाय javax.swing.Timer उपयोग करें। उदाहरण के लिए निम्नलिखित Timer एक JLabel पर पाठ को उलट JLabel

  int delay = 2000;//specify the delay for the timer
  Timer timer = new Timer( delay, e -> {
    //The following code will be executed once the delay is reached
    String revertedText = new StringBuilder( label.getText() ).reverse().toString();
    label.setText( revertedText );
  } );
  timer.setRepeats( false );//make sure the timer only runs once

इस Timer का उपयोग करने वाला एक पूर्ण रने योग्य उदाहरण नीचे दिया गया है: UI में एक बटन और एक लेबल होता है। बटन दबाने पर 2 सेकंड की देरी के बाद लेबल का पाठ उल्टा हो जाएगा

import javax.swing.*;
import java.awt.*;

public final class DelayedExecutionExample {

  public static void main( String[] args ) {
    EventQueue.invokeLater( () -> showUI() );
  }

  private static void showUI(){
    JFrame frame = new JFrame( "Delayed execution example" );

    JLabel label = new JLabel( "Hello world" );
    JButton button = new JButton( "Reverse text with delay" );
    button.addActionListener( event -> {
      button.setEnabled( false );
      //Instead of directly updating the label, we use a timer
      //This allows to introduce a delay, while keeping the EDT free
      int delay = 2000;
      Timer timer = new Timer( delay, e -> {
        String revertedText = new StringBuilder( label.getText() ).reverse().toString();
        label.setText( revertedText );
        button.setEnabled( true );
      } );
      timer.setRepeats( false );//make sure the timer only runs once
      timer.start();
    } );

    frame.add( label, BorderLayout.CENTER );
    frame.add( button, BorderLayout.SOUTH );
    frame.pack();
    frame.setDefaultCloseOperation( WindowConstants.EXIT_ON_CLOSE );
    frame.setVisible( true );
  }
}

एक निश्चित अंतराल पर UI कार्य दोहराएं

इवेंट डिस्पैच थ्रेड (EDT) पर एक स्विंग घटक की स्थिति को अपडेट करना होगा। javax.swing.Timer EDT पर अपनी ActionListener को चलाता है, जिससे यह स्विंग ऑपरेशन करने के लिए एक अच्छा विकल्प है।

निम्न उदाहरण प्रत्येक दो सेकंड में एक JLabel के पाठ को अद्यतन करता है:

//Use a timer to update the label at a fixed interval
int delay = 2000;
Timer timer = new Timer( delay, e -> {
  String revertedText = new StringBuilder( label.getText() ).reverse().toString();
  label.setText( revertedText );
} );
timer.start(); 

एक पूरी तरह से चलने योग्य उदाहरण जो इस Timer का उपयोग करता है, नीचे दिया गया है: यूआई में एक लेबल होता है, और लेबल का पाठ प्रत्येक दो सेकंड में वापस आ जाएगा।

import javax.swing.*;
import java.awt.*;

public final class RepeatTaskFixedIntervalExample {
  public static void main( String[] args ) {
    EventQueue.invokeLater( () -> showUI() );
  }
  private static void showUI(){
    JFrame frame = new JFrame( "Repeated task example" );
    JLabel label = new JLabel( "Hello world" );

    //Use a timer to update the label at a fixed interval
    int delay = 2000;
    Timer timer = new Timer( delay, e -> {
      String revertedText = new StringBuilder( label.getText() ).reverse().toString();
      label.setText( revertedText );
    } );
    timer.start();

    frame.add( label, BorderLayout.CENTER );
    frame.pack();
    frame.setDefaultCloseOperation( WindowConstants.EXIT_ON_CLOSE );
    frame.setVisible( true );
  }
}

UI कार्य को एक निश्चित संख्या में चलाना

ActionListener javax.swing.Timer से जुड़े, आप Timer द्वारा ActionListener निष्पादित करने की संख्या का ट्रैक रख सकते हैं। एक बार बार की अपेक्षित संख्या तक पहुँच जाता है, तो आप उपयोग कर सकते हैं Timer#stop() को रोकने के लिए विधि Timer

Timer timer = new Timer( delay, new ActionListener() {
  private int counter = 0;
  @Override
  public void actionPerformed( ActionEvent e ) {
    counter++;//keep track of the number of times the Timer executed
    label.setText( counter + "" );
    if ( counter == 5 ){
      ( ( Timer ) e.getSource() ).stop();
    }
  }
});

एक पूरी तरह से चलने योग्य उदाहरण जो इस Timer का उपयोग करता है, नीचे दिया गया है: यह एक यूआई दिखाता है जहां लेबल का पाठ शून्य से पांच तक गिना जाएगा। पांच बार पहुंचने के बाद, Timer बंद कर दिया जाता है।

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public final class RepeatFixedNumberOfTimes {
  public static void main( String[] args ) {
    EventQueue.invokeLater( () -> showUI() );
  }
  private static void showUI(){
    JFrame frame = new JFrame( "Repeated fixed number of times example" );
    JLabel label = new JLabel( "0" );

    int delay = 2000;
    Timer timer = new Timer( delay, new ActionListener() {
      private int counter = 0;
      @Override
      public void actionPerformed( ActionEvent e ) {
        counter++;//keep track of the number of times the Timer executed
        label.setText( counter + "" );
        if ( counter == 5 ){
          //stop the Timer when we reach 5
          ( ( Timer ) e.getSource() ).stop();
        }
      }
    });
    timer.setInitialDelay( delay );
    timer.start();

    frame.add( label, BorderLayout.CENTER );
    frame.pack();
    frame.setDefaultCloseOperation( WindowConstants.EXIT_ON_CLOSE );
    frame.setVisible( true );
  }
}

आपका पहला JFrame बनाना

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

public class FrameCreator {
    
    public static void main(String args[]) {
        //All Swing actions should be run on the Event Dispatch Thread (EDT)
        //Calling SwingUtilities.invokeLater makes sure that happens.
        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame();
            //JFrames will not display without size being set
            frame.setSize(500, 500);
            
            JLabel label = new JLabel("Hello World");
            frame.add(label);
            
            frame.setVisible(true);
        });
    }
        
}

जैसा कि आप देख सकते हैं यदि आप इस कोड को चलाते हैं, तो लेबल बहुत खराब जगह पर है। add मेथड के इस्तेमाल से अच्छे तरीके से बदलना मुश्किल है। अधिक गतिशील और लचीले रखने के लिए स्विंग लेआउट प्रबंधकों की जांच करें।

JFrame उप-वर्ग बनाना

import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

public class CustomFrame extends JFrame {
    
    private static CustomFrame statFrame;
    
    public CustomFrame(String labelText) {
        setSize(500, 500);
        
        //See link below for more info on FlowLayout
        this.setLayout(new FlowLayout());
        
        JLabel label = new JLabel(labelText);
        add(label);
        
        //Tells the JFrame what to do when it's closed
        //In this case, we're saying to "Dispose" on remove all resources
        //associated with the frame on close
        this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    }
    
    public void addLabel(String labelText) {
        JLabel label = new JLabel(labelText);
        add(label);
        this.validate();
    }
    
    public static void main(String args[]) {
        //All Swing actions should be run on the Event Dispatch Thread (EDT)
        //Calling SwingUtilities.invokeLater makes sure that happens.
        SwingUtilities.invokeLater(() -> {
            CustomFrame frame = new CustomFrame("Hello Jungle");
            //This is simply being done so it can be accessed later
            statFrame = frame;
            frame.setVisible(true);
        });
        
        try {
            Thread.sleep(5000);
        } catch (InterruptedException ex) {
            //Handle error
        }
        
        SwingUtilities.invokeLater(() -> statFrame.addLabel("Oh, hello world too."));
    }
        
}

यहाँ FlowLayout के बारे में अधिक जानकारी के लिए।

एक घटना को सुनकर

import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class CustomFrame extends JFrame {
        
    public CustomFrame(String labelText) {
        setSize(500, 500);
        
        //See link below for more info on FlowLayout
        this.setLayout(new FlowLayout());
        
        //Tells the JFrame what to do when it's closed
        //In this case, we're saying to "Dispose" on remove all resources
        //associated with the frame on close
        this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        
        //Add a button
        JButton btn = new JButton("Hello button");
        //And a textbox
        JTextField field = new JTextField("Name");
        field.setSize(150, 50);
        //This next block of code executes whenever the button is clicked.
        btn.addActionListener((evt) -> {
            JLabel helloLbl = new JLabel("Hello " + field.getText());
            add(helloLbl);
            validate();
        });
        add(btn);
        add(field);
    }
    
    public static void main(String args[]) {
        //All Swing actions should be run on the Event Dispatch Thread (EDT)
        //Calling SwingUtilities.invokeLater makes sure that happens.
        SwingUtilities.invokeLater(() -> {
            CustomFrame frame = new CustomFrame("Hello Jungle");
            //This is simply being done so it can be accessed later
            frame.setVisible(true);
        });
    }
        
}

"कृपया प्रतीक्षा करें ..." पॉपअप बनाएं

इस कोड को श्रोता, बटन आदि जैसी किसी भी घटना में जोड़ा जा सकता है। एक अवरुद्ध JDialog दिखाई देगा और यह प्रक्रिया पूरी होने तक रहेगा।

final JDialog loading = new JDialog(parentComponent);
JPanel p1 = new JPanel(new BorderLayout());
p1.add(new JLabel("Please wait..."), BorderLayout.CENTER);
loading.setUndecorated(true);
loading.getContentPane().add(p1);
loading.pack();
loading.setLocationRelativeTo(parentComponent);
loading.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
loading.setModal(true);

SwingWorker<String, Void> worker = new SwingWorker<String, Void>() {
    @Override
    protected String doInBackground() throws InterruptedException 
        /** Execute some operation */   
    }
    @Override
    protected void done() {
        loading.dispose();
    }
};
worker.execute(); //here the process thread initiates
loading.setVisible(true);
try {
    worker.get(); //here the parent thread waits for completion
} catch (Exception e1) {
    e1.printStackTrace();
}

JButtons जोड़ना (नमस्ते विश्व Pt.2)

यह मानते हुए कि आपने सफलतापूर्वक JFrame बनाया है और स्विंग को आयात किया गया है ...

आप पूरी तरह से स्विंग आयात कर सकते हैं

import javax.Swing.*;

या आप स्विंग घटकों / फ़्रेम को आयात कर सकते हैं जिन्हें आप उपयोग करने का इरादा रखते हैं

import javax.Swing.Jframe;
import javax.Swing.JButton;

अब नीचे Jbutton जोड़ने के लिए ...

public static void main(String[] args) {
    
    JFrame frame = new JFrame(); //creates the frame
    frame.setSize(300, 300);
    frame.setVisible(true);

    //////////////////////////ADDING BUTTON BELOW//////////////////////////////
    JButton B = new JButton("Say Hello World");
    B.addMouseListener(new MouseAdapter() {
        
        public void mouseReleased(MouseEvent arg0) {
            System.out.println("Hello World");
        }
        
    });
    B.setBounds(0, 0,frame.getHeight(), frame.getWidth());
    B.setVisible(true);
    frame.add(B);
    ////////////////////////////////////////////////////////////////////////////
}

इस कोड को निष्पादित / संकलित करके आपको कुछ इस तरह से प्राप्त करना चाहिए ...

अंतिम उत्पाद

जब बटन पर क्लिक किया जाता है ... "हैलो वर्ल्ड" भी आपके कंसोल में दिखाई देना चाहिए।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow