जावा में एक कस्टम जेबटन बनाना

क्या आपके बटन बटन के साथ JButton बनाने का कोई तरीका है और न केवल बटन के अंदर एक छवि के साथ?

यदि नहीं, जावा में कस्टम JButton बनाने का कोई और तरीका है?

0
जोड़ा संपादित
विचारों: 1

5 उत्तर

जब मैं पहली बार जावा सीख रहा था तो हमें Yahtzee बनाना पड़ा और मैंने सोचा कि यह एक JPanel पर सबकुछ खींचने के बजाय कस्टम स्विंग घटकों और कंटेनर बनाने के लिए अच्छा होगा। स्विंग घटकों को विस्तारित करने का लाभ, कीबोर्ड शॉर्टकट्स और अन्य पहुंच-योग्यता सुविधाओं के लिए समर्थन जोड़ने की क्षमता है जो आप paint() </कोड> विधि एक सुंदर तस्वीर मुद्रित करें। हालांकि यह सबसे अच्छा तरीका नहीं किया जा सकता है, लेकिन यह आपके लिए एक अच्छा प्रारंभिक बिंदु हो सकता है।

8/6 संपादित करें - अगर यह छवियों से स्पष्ट नहीं था, तो प्रत्येक डाई एक बटन है जिसे आप क्लिक कर सकते हैं। यह इसे नीचे DiceContainer पर ले जायेगा। स्रोत कोड को देखते हुए आप देख सकते हैं कि प्रत्येक डाई बटन गतिशील रूप से इसके मूल्य के आधार पर खींचा जाता है।

alt text
alt text
alt text

यहां बुनियादी कदम हैं:

  1. Create a class that extends JComponent
  2. Call parent constructor super() in your constructors
  3. Make sure you class implements MouseListener
  4. Put this in the constructor:

    enableInputMethods(true);   
    addMouseListener(this);
    
  5. Override these methods:

    public Dimension getPreferredSize()  
    public Dimension getMinimumSize()  
    public Dimension getMaximumSize()
    
  6. Override this method:

    public void paintComponent(Graphics g)
    

अपने बटन को खींचते समय आपको जिस स्थान पर काम करना है, उसे getPreferredSize() द्वारा परिभाषित किया गया है, getMinimumSize() और getMaximumSize() वापसी वही मूल्य मैंने इसके साथ बहुत अधिक प्रयोग नहीं किया है, लेकिन आपके जीयूआई के लिए उपयोग किए जाने वाले लेआउट के आधार पर आपका बटन पूरी तरह से अलग दिख सकता है।

और अंत में, स्रोत कोड । अगर मुझे कुछ याद आया।

0
जोड़ा
क्या आप यहां पूरा कोड डाल सकते हैं।
जोड़ा लेखक Doug Hauf, स्रोत
हाय, कोड के लिए पहले धन्यवाद! मैं आपके कोड में 'setActionComme (स्ट्रिंग कमांड)' जोड़ने का सुझाव दूंगा। यह स्विंग में घटनाओं को फ़िल्टर करने के तरीकों में से एक है। (लेकिन फिर आप तर्क दे सकते हैं कि 1001 चीजें हैं जिन्हें चीजों को थोड़ा बेहतर बनाने के लिए जोड़ा जा सकता है: पी)
जोड़ा लेखक Jason Rogers, स्रोत
एक मरने के लिए जिसे आप दबा सकते हैं, आप वास्तव में setIcon / setPressedIcon के साथ-साथ JButton में अन्य आइकन कार्यक्षमता का लाभ उठाकर एक सादे पुराने जेबटन (उप-वर्गीकरण या कस्टम जेकंपोनेंट बनाने के बजाय) का उपयोग कर सकते हैं
जोड़ा लेखक ControlAltDel, स्रोत

You could always try the Synth look & feel. You provide an xml file that acts as a sort of stylesheet, along with any images you want to use. The code might look like this:

try {
    SynthLookAndFeel synth = new SynthLookAndFeel();
    Class aClass = MainFrame.class;
    InputStream stream = aClass.getResourceAsStream("\\default.xml");

    if (stream == null) {
        System.err.println("Missing configuration file");
        System.exit(-1);                
    }

    synth.load(stream, aClass);

    UIManager.setLookAndFeel(synth);
} catch (ParseException pe) {
    System.err.println("Bad configuration file");
    pe.printStackTrace();
    System.exit(-2);
} catch (UnsupportedLookAndFeelException ulfe) {
    System.err.println("Old JRE in use. Get a new one");
    System.exit(-3);
}

वहां से, आगे बढ़ें और अपने जेबटन को सामान्य रूप से पसंद करें। एकमात्र परिवर्तन यह है कि आप setName (स्ट्रिंग) विधि का उपयोग यह पहचानने के लिए करते हैं कि बटन को xml फ़ाइल में क्या मैप करना चाहिए।

एक्सएमएल फ़ाइल इस तरह दिख सकती है:


    
    

बाइंड तत्व वहां निर्दिष्ट करता है कि मानचित्र को क्या करना है (इस उदाहरण में, यह किसी भी बटन पर स्टाइल लागू करेगा जिसका नाम संपत्ति "गंदगी" पर सेट की गई है)।

और कुछ उपयोगी लिंक:

http://javadesktop.org/articles/synth/

http://docs.oracle.com/javase/tutorial/uiswing/lookandfeel /synth.html

0
जोड़ा

हाँ, यह संभव है। स्विंग का उपयोग करने के लिए मुख्य पेशेवरों में से एक वह सुविधा है जिसके साथ अमूर्त नियंत्रण बनाया जा सकता है और कुशलतापूर्वक उपयोग किया जा सकता है।

टेक्स्ट के दाईं ओर एक सर्कल खींचने के लिए मौजूदा जेबटन कक्षा को विस्तारित करने का एक त्वरित और गंदा तरीका है।

package test;

import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;

import javax.swing.JButton;
import javax.swing.JFrame;

public class MyButton extends JButton {

    private static final long serialVersionUID = 1L;

    private Color circleColor = Color.BLACK;

    public MyButton(String label) {
        super(label);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        Dimension originalSize = super.getPreferredSize();
        int gap = (int) (originalSize.height * 0.2);
        int x = originalSize.width + gap;
        int y = gap;
        int diameter = originalSize.height - (gap * 2);

        g.setColor(circleColor);
        g.fillOval(x, y, diameter, diameter);
    }

    @Override
    public Dimension getPreferredSize() {
        Dimension size = super.getPreferredSize();
        size.width += size.height;
        return size;
    }

    /*Test the button*/
    public static void main(String[] args) {
        MyButton button = new MyButton("Hello, World!");

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 400);

        Container contentPane = frame.getContentPane();
        contentPane.setLayout(new FlowLayout());
        contentPane.add(button);

        frame.setVisible(true);
    }

}

ध्यान दें कि paintComponent को ओवरराइड करके बटन की सामग्री बदला जा सकता है, लेकिन सीमा को paintBorder विधि द्वारा चित्रित किया गया है। सामग्री में परिवर्तनों को गतिशील रूप से समर्थन देने के लिए getPreferredSize विधि को भी प्रबंधित करने की आवश्यकता है। फ़ॉन्ट मेट्रिक्स और छवि आयामों को मापते समय देखभाल की जानी चाहिए।

एक नियंत्रण बनाने के लिए जिस पर आप भरोसा कर सकते हैं, उपर्युक्त कोड सही दृष्टिकोण नहीं है। आयाम और रंग स्विंग में गतिशील हैं और उपयोग और महसूस पर निर्भर हैं। यहां तक ​​कि डिफ़ॉल्ट धातु देखो जेआरई संस्करणों में बदल गया है। सार बटन को लागू करना और स्विंग एपीआई द्वारा निर्धारित दिशानिर्देशों के अनुरूप होना बेहतर होगा। एक अच्छा प्रारंभिक बिंदु javax.swing.LookAndFeel और javax.swing.UIManager कक्षाओं को देखना है।

http://docs.oracle.com/javase/8 /docs/api/javax/swing/LookAndFeel.html

http://docs.oracle.com/javase/8 /docs/api/javax/swing/UIManager.html

Understanding the anatomy of LookAndFeel is useful for writing controls: Creating a Custom Look and Feel

0
जोड़ा

मैंने अपने शुरुआती सीएस वर्गों के बाद से स्विंग विकास नहीं किया है, लेकिन यदि यह आपके अंदर नहीं बनाया गया था तो बस javax.swing.Abstract बटन को प्राप्त कर सकता है और अपना स्वयं का बना सकता है। अपने मौजूदा ढांचे के साथ कुछ तार करने के लिए बहुत आसान होना चाहिए।

0
जोड़ा

मैं शायद गलत दस लाख मील की दूरी पर जा रहा हूं (लेकिन मैं केवल युवा हूं: पी)। लेकिन क्या आप ग्राफ़िक को किसी पैनल में नहीं जोड़ सकते थे और उसके बाद ग्राफ़िक ऑब्जेक्ट में एक मूसेलिस्टनर नहीं बना सकते थे ताकि जब ग्राफ़िक पर उपयोगकर्ता आपकी क्रिया को पूर्ववत कर दे।

0
जोड़ा
यह काम करेगा, लेकिन यदि संभव हो तो मैं अपने प्रकार के बटन बनाने के बजाय मानक जेबटन का उपयोग करना पसंद करूंगा।
जोड़ा लेखक Anton, स्रोत