জাভাতে একটি কাস্টম JButton তৈরি করা হচ্ছে


97

JButtonআপনার নিজের বাটন গ্রাফিক দিয়ে একটি তৈরি করার উপায় কি কেবল বোতামটির অভ্যন্তরে কোনও চিত্র নয়?

যদি তা না হয় তবে JButtonজাভাতে কাস্টম তৈরির উপায় আছে কি?

উত্তর:


92

আমি যখন প্রথম জাভা শিখছিলাম তখন আমাদের ইয়াহটজি তৈরি করতে হবে এবং আমি ভেবেছিলাম যে কেবল একটিতে সমস্ত কিছু আঁকার পরিবর্তে কাস্টম সুইং উপাদান এবং পাত্রে তৈরি করা ভাল JPanelSwingঅবশ্যই উপাদানগুলি প্রসারিত করার সুবিধাটি হ'ল কীবোর্ড শর্টকাট এবং অন্যান্য অ্যাক্সেসিবিলিটি বৈশিষ্ট্যগুলির জন্য সমর্থন যুক্ত করার ক্ষমতা থাকা যা আপনি কেবল একটি 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()ফিরে দেওয়া। আমি এটি নিয়ে খুব বেশি পরীক্ষা-নিরীক্ষা করিনি তবে, আপনি আপনার জিইউআইয়ের জন্য যে লেআউটটি ব্যবহার করেন তার উপর নির্ভর করে আপনার বোতামটি সম্পূর্ণ আলাদা দেখায়।

এবং অবশেষে, উত্স কোড । যদি আমি কিছু মিস করি।


4
হাই, কোডের জন্য প্রথম ধন্যবাদ! আমি আপনার কোডটিতে একটি 'সেটঅ্যাকশনকম (স্ট্রিং কমান্ড)' যুক্ত করার পরামর্শ দেব। এটি সুইং-এ ইভেন্টগুলি ফিল্টার করার অন্যতম উপায়। (তবে তারপরে আপনি তর্ক করতে পারেন যে জিনিসগুলিকে কিছুটা আরও উন্নত করতে 1001 টি জিনিস যুক্ত করা যেতে পারে: পি)
জেসন রজার্স

4
আপনি যে চাপতে পারেন এমন একটি ডাই তৈরি করতে আপনি JI বাটন
কন্ট্রোলএলটেল

34

হ্যাঁ, এটি সম্ভব। সুইং ব্যবহারের অন্যতম প্রধান উপায় হ'ল স্বাচ্ছন্দ্য যার সাহায্যে বিমূর্ত নিয়ন্ত্রণগুলি তৈরি করা যায় এবং ম্যানিপুলেট করা যায়।

পাঠ্যের ডানদিকে একটি বৃত্ত আঁকতে বিদ্যমান জবটন ক্লাসটি প্রসারিত করার জন্য এখানে দ্রুত এবং নোংরা উপায়।

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 পদ্ধতি এছাড়াও সামগ্রীতে পরিবর্তনশীল সমর্থন পরিবর্তন করার জন্য পরিচালিত করতে হবে। ফন্টের মেট্রিক এবং চিত্রের মাত্রা পরিমাপ করার সময় যত্ন নেওয়া দরকার।

আপনি নির্ভর করতে পারেন এমন নিয়ন্ত্রণ তৈরির জন্য, উপরের কোডটি সঠিক পদ্ধতির নয়। মাত্রা এবং রঙগুলি সুইংয়ে গতিশীল এবং এটি ব্যবহার করা চেহারা এবং বোধের উপর নির্ভরশীল। এমনকি জেআরই সংস্করণ জুড়ে ডিফল্ট ধাতব চেহারাও বদলেছে। অ্যাস্ট্রাক্ট বাটন বাস্তবায়ন করা এবং সুইং এপিআই দ্বারা নির্ধারিত গাইডলাইন মেনে চলা ভাল be জাভ্যাক্স.সুইং.লুকএন্ডফিল এবং জাভ্যাক্স.উইউইং.উইমেনেজার ক্লাসে নজর দেওয়া ভাল শুরু করার পয়েন্ট ।

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

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

লুকএন্ডফিলের এনাটমি বোঝা নিয়ন্ত্রণ নিয়ন্ত্রণের জন্য দরকারী: একটি কাস্টম লুক তৈরি করা এবং অনুভব করা


13

আপনি সর্বদা সিন্থ চেহারা এবং বোধ চেষ্টা করতে পারেন। আপনি একটি এক্সএমএল ফাইল সরবরাহ করেছেন যা আপনি ব্যবহার করতে চান এমন কোনও চিত্রের পাশাপাশি স্টাইলশীটের ধরণ হিসাবে কাজ করে। কোডটি দেখতে এই জাতীয় দেখাচ্ছে:

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

সেখান থেকে চালিয়ে যান এবং আপনার জাবন বাটনটি আপনার মতো যুক্ত করুন would একমাত্র পরিবর্তনটি হ'ল এক্সএমএল ফাইলে বোতামটি কী মানচিত্রে তা চিহ্নিত করতে আপনি সেটনাম (স্ট্রিং) পদ্ধতিটি ব্যবহার করেন।

এক্সএমএল ফাইলটি দেখতে এটির মতো হতে পারে:

<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


8

আমি সম্ভবত ভুল সরাসরি এক মিলিয়ন মাইল যাচ্ছি (তবে আমি কেবল তরুণ: পি)। তবে আপনি গ্রাফিককে একটি প্যানেলে এবং তারপরে গ্রাফিক সামগ্রীতে একটি মাউসলিস্টনার যুক্ত করতে পারেননি যাতে গ্রাফিকের ব্যবহারকারী যখন আপনার ক্রিয়াকলাপটি প্রবর্তিত হয়।


4
এটি কাজ করবে, তবে আমি যদি সম্ভব হয় তবে আমার প্রকারের বোতামটি তৈরি করার চেয়ে স্ট্যান্ডার্ড জেবাটন ব্যবহার করতে পছন্দ করব।
আন্তন

7

আমি আমার প্রারম্ভিক সিএস ক্লাসের পর থেকে সুইং ডেভেলপমেন্ট করি নি তবে এটি যদি আপনি না তৈরি করে থাকেন তবে কেবল উত্তরাধিকারী হয়ে javax.swing.AbstractButtonনিজের তৈরি করতে পারতেন । তাদের বিদ্যমান কাঠামোর সাথে কিছু একসাথে তারের করা খুব সহজ হওয়া উচিত।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.