दिलचस्प पोस्ट
क्यों है 1 >> 32 == 1? मैं एक धागा कैसे मार सकता हूं? स्टॉप () का उपयोग किए बिना; यूआरएल से एक स्ट्रिंग में एनएटी में पढ़ने का सबसे आसान तरीका है एक माउस के एक्स / वाई निर्देशांक प्राप्त करना एक छवि पर क्लिक करता है आईआईएस 7.5 में होस्ट किए गए वेब एपीआई में HTTP 404 पृष्ठ नहीं मिला JTable हेडर छवि में क्यों नहीं दिखाई देता है? ईवेंट हैंडलर्स को निकालना क्या मैं प्रोग्राम को Google क्रोम एक्सटेंशन से devtools खोल सकता / सकती हूं? जावा – जेपीए – @ वर्जन एनोटेशन xmllint xpath से ठीक से क्वेरी करने में असफल रहा I एसक्यूएल सर्वर एक अंडरस्कोर से बचें समायोजित करने के बीच अंतर Android में रीज़ेस करें और समायोजित करें? गैर-आधार मार्गों के लिए Laravel स्टाइलशीट्स और जावास्क्रिप्ट लोड नहीं होते हैं "इनर जॉइन" और "आउटर जॉइन" के बीच अंतर क्या है? एक गहरी कॉपी और उथले प्रतिलिपि में क्या अंतर है?

जावा चेतन जेएलैबेल

इसलिए मैं एक मूल अनुप्रयोग बना रहा हूं जो मुझे स्क्रीन के निचले भाग में जेएलैबल करना है जो कि नीचे के कोने पर चलता है और एक निश्चित समय में सही नीचे के कोने में, एनीमेशन शैली को चालू करता है, और केंद्र में एक स्थिर छवि है । ऐसा करने के लिए, मैंने बॉर्डर लेआउट का उपयोग करते हुए एक जेपीएनल के साथ एक जेफ्राम बनाया। एक जेएलैबल को एक इमेज आइकन से जोड़ा गया है जो बॉर्डर लेआउट। सीएटर और बॉर्डर लेआउट में एसएटीटीएपी में जोड़ा गया है। मेरा कोड, जल्दी से और बहुत सुंदर से लिखा है, है:

import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.Timer; import javax.swing.BorderFactory; public class GameWindow extends JPanel{ private static JLabel mainWindow, arrowLabel, arrowBox; protected static JFrame frame; protected static JPanel arrows; public static int x = 600; public GameWindow(){ mainWindow = new JLabel("Center"); arrowLabel = new JLabel("Moving"); arrows = new JPanel(); arrows.setSize(600, 100); arrows.setLayout(null); arrowBox = new JLabel(""); arrowBox.setBounds(0, 0, 150, 100); arrowBox.setPreferredSize(new Dimension(150, 100)); arrowBox.setBorder(BorderFactory.createLineBorder(Color.black)); arrows.add(arrowBox); this.setSize(600,600); this.setLayout(new BorderLayout()); this.add(mainWindow, BorderLayout.CENTER); this.add(arrows, BorderLayout.SOUTH); } public static void main(String[] args) { GameWindow g = new GameWindow(); frame = new JFrame("Sword Sword Revolution"); frame.add(g); frame.setSize(600,600); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); Timer t = new Timer(1000, new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { arrows.add(arrowLabel); arrowLabel.setBounds(x, 100, 100, 100); x-=50; arrows.repaint(); frame.repaint(); } }); t.start(); } 

}

केंद्र JLabel में ImageIcon ठीक लग रहा है, और एक सीमा के साथ खाली JLabel नीचे दिखाई देता है, लेकिन मैं स्क्रीन पर दिखाने के लिए तीर की छवि के साथ दूसरा जेएलैबल नहीं मिल सकता। आखिरकार मैं शेड्यूल में बदलूंगा, स्थिर रूप से JLabel को स्थानांतरित करने के लिए, लेकिन अभी भी मुझे स्क्रीन पर दिखाई देने वाली छवि भी नहीं मिल सकती।

मैं यह भी समझता हूं कि मैं इसके लिए फ्लोलेआउट का उपयोग नहीं कर सकूंगा, क्योंकि मैं समझता हूं कि यह आपको अपने घटकों का स्थान सेट करने की अनुमति नहीं देता है। मैं शून्य लेआउट का उपयोग करने की कोशिश की, लेकिन शून्य लेआउट के साथ एक सीमा के साथ खाली JLabel दिखाई नहीं देता। मैं फ्रेम के निचले किनारे पर बॉर्डर के ऊपर से बाहर निकल सकता हूं, लेकिन सेटलोकेशन के साथ भी मैं इसे प्रदर्शित नहीं कर सकता जहां मैं चाहता हूँ।

जाहिर है, मेरी सोच प्रक्रिया दोषपूर्ण है, इसलिए किसी भी मदद की सराहना की जाएगी।

वेब के समाधान से एकत्रित समाधान "जावा चेतन जेएलैबेल"

स्विंग अनुप्रयोगों के लिए आपके थ्रेडिंग का उपयोग गलत है आपको पृष्ठभूमि थ्रेड में घटकों को जोड़ने या निकालने का प्रयास नहीं करना चाहिए बल्कि स्विंग ईवेंट थ्रेड पर इसके लिए स्विंग टाइमर का उपयोग करना चाहिए।

साथ ही, आपको इसका क्या मतलब है:

मुझे स्क्रीन के तल पर एक स्क्रॉलिंग जेलाबेल रखना है

कृपया उस प्रभाव को स्पष्ट करें जिसे आप प्राप्त करने की कोशिश कर रहे हैं

इसके अलावा,

मैं यह भी समझता हूं कि मैं इसके लिए फ्लोलेआउट का उपयोग नहीं कर सकूंगा, क्योंकि मैं समझता हूं कि यह आपको अपने घटकों का स्थान सेट करने की अनुमति नहीं देता है। मैं शून्य लेआउट का उपयोग करने की कोशिश की, लेकिन शून्य लेआउट के साथ एक सीमा के साथ खाली JLabel दिखाई नहीं देता। मैं फ्रेम के निचले किनारे पर बॉर्डर के ऊपर से बाहर निकल सकता हूं, लेकिन सेटलोकेशन के साथ भी मैं इसे प्रदर्शित नहीं कर सकता जहां मैं चाहता हूँ।

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

3 संपादित करें
के बारे में:

स्पष्ट करने के लिए, स्क्रीन के निचले भाग में मुझे सही दाएं कोने में एक जेएलैबल चाहिए, फिर स्विंग टाइमर में, जेएलैब धीरे-धीरे बाईं ओर चले जाएंगे, जब तक कि यह स्क्रीन को छोड़ नहीं देगा। यदि मुझे काम करने के लिए स्थान निर्धारित किया जा सकता है, तो मूल आधार के लिए एक चर x 600 पर सेट किया जा सकता है, और फिर प्रत्येक दूसरे घूमने x को 50 कहते हैं और फिर जेएलैबल को स्क्रीन पर नए स्थान पर दोबारा प्रिंट करना होगा। मूल एनीमेशन

मैं स्क्रीन के निचले भाग के लिए एक JPanel बनाने के उद्देश्य के लिए या तो अपने जेएलैबल को पकड़कर या जेएलैबल के बिना छवि को प्रदर्शित करना चाहता हूं, जिससे इसके पेंट कम्पेनेंट paintComponent(...) विधि को ओवरराइड किया जा सकता है। यदि आप इसे कंटेनर के रूप में उपयोग करते हैं, तो हाँ, इसका लेआउट रिक्त होना चाहिए, लेकिन बाकी जीयूआई को रिक्त लेआउट का उपयोग नहीं करना चाहिए। स्विंग टाइमर बस जेएलैबल के स्थान को बदल देगी और उसके बाद अपने जेपीनल / कंटेनर पर repaint() से रंगेगा। यदि आप उत्तरार्द्ध मार्ग पर जाते हैं, तो आप g.drawImage(myImage, x, y) paintComponent(...) विधि में g.drawImage(myImage, x, y) का उपयोग करके g.drawImage(myImage, x, y) , और आपका टाइमर एक्स और / या वाई को बदल देगा और repaint() करें repaint() ड्राइंग JPanel

इसके अलावा, आप शायद अपने टाइमर में जेएलैबल को जोड़ना नहीं छोड़ना चाहते बल्कि बल्कि जेएलैबल को आगे बढ़ाना चाहते हैं जो पहले से ही जीयूआई में दिखाया गया है।

इसके अलावा, फोकस के मुद्दों से बचने के लिए, कुंजीस्ट्रिस इनपुट को कैप्चर करने के लिए कुंजीलिस्टर का उपयोग न करें बल्कि कुंजी बाइंडिंग का उपयोग करें। Google आपको इस निर्माण पर एक महान ट्यूटोरियल के लिए निर्देशित करेगा।

4 संपादित करें
उदाहरण के लिए:

 import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.event.*; import java.awt.image.BufferedImage; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.EnumMap; import javax.imageio.ImageIO; import javax.swing.*; @SuppressWarnings("serial") public class AnimateExample extends JPanel { public static final String DUKE_IMG_PATH = "https://duke.kenai.com/iconSized/duke.gif"; private static final int PREF_W = 800; private static final int PREF_H = 800; private static final int TIMER_DELAY = 20; private static final String KEY_DOWN = "key down"; private static final String KEY_RELEASE = "key release"; public static final int TRANSLATE_SCALE = 3; private static final String BACKGROUND_STRING = "Use Arrow Keys to Move Image"; private static final Font BG_STRING_FONT = new Font(Font.SANS_SERIF, Font.BOLD, 32); private EnumMap<Direction, Boolean> dirMap = new EnumMap<AnimateExample.Direction, Boolean>(Direction.class); private BufferedImage image = null; private int imgX = 0; private int imgY = 0; private int bgStringX; private int bgStringY; public AnimateExample() { for (Direction dir : Direction.values()) { dirMap.put(dir, Boolean.FALSE); } try { URL imgUrl = new URL(DUKE_IMG_PATH); image = ImageIO.read(imgUrl); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } new Timer(TIMER_DELAY, new TimerListener()).start(); // here we set up our key bindings int condition = JComponent.WHEN_IN_FOCUSED_WINDOW; InputMap inputMap = getInputMap(condition); ActionMap actionMap = getActionMap(); for (final Direction dir : Direction.values()) { // for the key down key stroke KeyStroke keyStroke = KeyStroke.getKeyStroke(dir.getKeyCode(), 0, false); inputMap.put(keyStroke, dir.name() + KEY_DOWN); actionMap.put(dir.name() + KEY_DOWN, new AbstractAction() { @Override public void actionPerformed(ActionEvent arg0) { dirMap.put(dir, true); } }); // for the key release key stroke keyStroke = KeyStroke.getKeyStroke(dir.getKeyCode(), 0, true); inputMap.put(keyStroke, dir.name() + KEY_RELEASE); actionMap.put(dir.name() + KEY_RELEASE, new AbstractAction() { @Override public void actionPerformed(ActionEvent arg0) { dirMap.put(dir, false); } }); } FontMetrics fontMetrics = getFontMetrics(BG_STRING_FONT); int w = fontMetrics.stringWidth(BACKGROUND_STRING); int h = fontMetrics.getHeight(); bgStringX = (PREF_W - w) / 2; bgStringY = (PREF_H - h) / 2; } @Override public Dimension getPreferredSize() { return new Dimension(PREF_W, PREF_H); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; g.setFont(BG_STRING_FONT); g.setColor(Color.LIGHT_GRAY); g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); g.drawString(BACKGROUND_STRING, bgStringX, bgStringY); if (image != null) { g.drawImage(image, imgX, imgY, this); } } private class TimerListener implements ActionListener { public void actionPerformed(java.awt.event.ActionEvent e) { for (Direction dir : Direction.values()) { if (dirMap.get(dir)) { imgX += dir.getX() * TRANSLATE_SCALE; imgY += dir.getY() * TRANSLATE_SCALE; } } repaint(); }; } enum Direction { Up(KeyEvent.VK_UP, 0, -1), Down(KeyEvent.VK_DOWN, 0, 1), Left( KeyEvent.VK_LEFT, -1, 0), Right(KeyEvent.VK_RIGHT, 1, 0); private int keyCode; private int x; private int y; private Direction(int keyCode, int x, int y) { this.keyCode = keyCode; this.x = x; this.y = y; } public int getKeyCode() { return keyCode; } public int getX() { return x; } public int getY() { return y; } } private static void createAndShowGui() { AnimateExample mainPanel = new AnimateExample(); JFrame frame = new JFrame("Animate Example"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(mainPanel); frame.pack(); frame.setLocationByPlatform(true); frame.setVisible(true); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGui(); } }); } } 

जो यह GUI बनाएगा:

यहां छवि विवरण दर्ज करें

तीन संभावनाएं:

  • आप या तो एक ऐसी लाइब्रेरी का उपयोग कर सकते हैं जैसे कि स्लाइडिंग लाएआउट , इस तरह के संक्रमण को बहुत ही कम लाइन लाइनों के साथ बनाने के लिए। आप एनीमेशन में बदलाव नहीं कर पाएंगे लेकिन आपका जीवन आसान होगा।

  • आप सब कुछ को हाथ से कॉन्फ़िगर करने के लिए यूनिवर्सल टिइन इंजन जैसे एनीमेशन इंजन का उपयोग कर सकते हैं और जितना चाहें उतना एनीमेशन को ट्वीक कर सकते हैं (पहली लिब इसका उपयोग हुड के नीचे)। ऐसे इंजन का उपयोग करके, आप जो चाहते हैं उसे चेतन कर सकते हैं: स्थिति, रंग, फ़ॉन्ट आकार, …

  • आप हाथ से सब कुछ कोड और एनीमेशन दुनिया है कि नरक गले लगा सकते हैं 🙂

अंत में, आप इन्हें जल्दी से एनिमेशन बनाने में समर्थ होंगे (यह एक उपकरण है जिस पर मैं वर्तमान में काम कर रहा हूं, और एंड्रॉइड देव के लिए ग्रहण परियोजनाओं को लिबगडीएक्स गेम फ्रेमवर्क के प्रयोग से कॉन्फ़िगर करने के लिए उपयोग किया गया है):
यहां छवि विवरण दर्ज करेंयहां छवि विवरण दर्ज करें

मैंने UI लाइब्रेरी (मैं यूआई डिज़ाइन प्यार करता हूँ: पी) को कम करने के लिए इन पुस्तकालयों को बनाया है। मैंने उन्हें खुला स्रोत (उपयोग करने के लिए स्वतंत्र, लाइसेंस अपाचे -2) जारी किया था, उम्मीद करते थे कि वे कुछ लोगों को भी मदद कर सकते हैं।

यदि आपको सहायता की आवश्यकता है, तो प्रत्येक पुस्तकालय के लिए एक समर्पित सहायता फ़ोरम है।

बहुत सरल है, इसे देखें:

 javax.swing.JLabel lb = new javax.swing.JLabel(); Image image = Toolkit.getDefaultToolkit().createImage("Your animated GIF"); ImageIcon xIcon = new ImageIcon(image); xIcon.setImageObserver(this); lb.setIcon(xIcon);