swing
मूल बातें
खोज…
एक विशिष्ट अवधि के लिए एक यूआई कार्य में देरी
सभी स्विंग से संबंधित ऑपरेशन एक समर्पित थ्रेड (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);
////////////////////////////////////////////////////////////////////////////
}
इस कोड को निष्पादित / संकलित करके आपको कुछ इस तरह से प्राप्त करना चाहिए ...
जब बटन पर क्लिक किया जाता है ... "हैलो वर्ल्ड" भी आपके कंसोल में दिखाई देना चाहिए।