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

वोट
86

वहाँ एक बनाने के लिए एक रास्ता है JButtonअपने स्वयं के बटन ग्राफ़िक के साथ और न सिर्फ बटन के अंदर एक छवि के साथ?

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

05/08/2008 को 13:15
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


5 जवाब

वोट
85

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

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

वैकल्पिक शब्द
वैकल्पिक शब्द
वैकल्पिक शब्द

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

  1. एक वर्ग है कि फैली बनाएं JComponent
  2. कॉल माता पिता निर्माता super()अपने कंस्ट्रक्टर्स में
  3. सुनिश्चित करें कि आप वर्ग के औजार बनाने MouseListener
  4. निर्माता में इस रखो:

    enableInputMethods(true);   
    addMouseListener(this);
    
  5. इन तरीकों ओवरराइड:

    public Dimension getPreferredSize()  
    public Dimension getMinimumSize()  
    public Dimension getMaximumSize()
    
  6. इस विधि ओवरराइड:

    public void paintComponent(Graphics g)
    

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

और अंत में, स्रोत कोड । मामले में मैं कुछ भी याद किया।

05/08/2008 को 14:03
का स्रोत उपयोगकर्ता

वोट
32

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

यहाँ एक त्वरित और गंदी तरह से पाठ के अधिकार के लिए एक चक्र आकर्षित करने के लिए मौजूदा JButton वर्ग का विस्तार करने के लिए है।

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 विधि भी आदेश गतिशील सामग्री में परिवर्तन का समर्थन करने के कामयाब होने की जरूरत है। देखभाल जब फ़ॉन्ट मैट्रिक्स और छवि आयाम को मापने रखा जाना चाहिए।

एक नियंत्रण है कि आप पर भरोसा कर सकते बनाने के लिए, ऊपर कोड सही दृष्टिकोण नहीं है। आयाम और रंग स्विंग में गतिशील हैं और देखो पर निर्भर हैं और इस्तेमाल किया जा रहा है। यहां तक कि डिफ़ॉल्ट धातु देखो JRE संस्करणों में बदल गया है। बेहतर होगा लागू करने के लिए होगा AbstractButton और दिशा निर्देशों घुमाओ एपीआई द्वारा निर्धारित के अनुरूप हैं। एक अच्छा प्रारंभिक बिंदु को देखने के लिए 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

: LookAndFeel की शारीरिक रचना को समझना नियंत्रण लिखने के लिए उपयोगी है एक कस्टम देखो और महसूस बनाना

05/08/2008 को 13:53
का स्रोत उपयोगकर्ता

वोट
12

तुम हमेशा सिंथ देखने और महसूस की कोशिश कर सकते। आप एक xml फ़ाइल है कि, स्टाइलशीट का एक प्रकार के रूप में कार्य आप उपयोग करना चाहते किसी भी चित्र के साथ प्रदान करते हैं। कोड इस प्रकार दिखाई देंगे:

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);
}

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

xml फ़ाइल इस प्रकार दिखाई देंगे:

<synth>
    <style id="button">
        <font name="DIALOG" size="12" style="BOLD"/>
        <state value="MOUSE_OVER">
            <imagePainter method="buttonBackground" path="dirt.png" sourceInsets="2 2 2 2"/>
            <insets top="2" botton="2" right="2" left="2"/>
        </state>
        <state value="ENABLED">
            <imagePainter method="buttonBackground" path="dirt.png" sourceInsets="2 2 2 2"/>
            <insets top="2" botton="2" right="2" left="2"/>
        </state>
    </style>
    <bind style="button" type="name" key="dirt"/>
</synth>

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

और उपयोगी लिंक के एक जोड़े:

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

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

05/08/2008 को 13:47
का स्रोत उपयोगकर्ता

वोट
8

मैं शायद गलत प्रत्यक्ष में एक लाख मील की दूरी जा रहा हूँ (लेकिन मैं कर रहा हूँ केवल युवा: पी)। लेकिन आप ग्राफिक पैनल के सामने एक mouselistener ग्राफिक वस्तु को इतनी है कि जब ग्राफिक अपनी कार्रवाई पर उपयोगकर्ता preformed है जोड़ने और फिर नहीं कर सका।

20/08/2008 को 16:48
का स्रोत उपयोगकर्ता

वोट
6

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

05/08/2008 को 13:30
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more