Java özel bir JButton oluşturma

oy
86

Bir oluşturmak için bir yolu var mı JButtonkendi buton grafik ile ve sadece düğmenin içinde bir görüntüyle?

Değilse, bir özel oluşturmak için başka bir yolu yoktur JButtonjava?

Oluştur 05/08/2008 saat 13:15
kaynak kullanıcı
Diğer dillerde...                            


5 cevaplar

oy
85

Ben ilk Java öğreniyordu Ne zaman Yahtzee yapmak zorunda ve bunu birinde her şeyi çizim yalnızca özel Salıncak bileşenleri ve konteyner oluşturmak yerine serin olacağını düşündüm JPanel. Uzatmanın faydası Swingbileşenlerinin, tabii ki, klavye kısayolları ve bir alarak yapamadığım diğer erişilebilirlik özellikleri için destek eklemek yeteneğine sahip olmaktır paint()yöntem güzel bir resim yazdırın. Ancak en iyi şekilde yapılması olmayabilir, ama bu sizin için iyi bir başlangıç noktası olabilir.

06/08 düzenle - bu görüntülerden belirgin değilse, her Die tıklayabilirsiniz bir düğme. Bu taşımak olacaktır DiceContaineraşağıda. Her Die düğmesi değeri dayalı olarak dinamik çekilir görüyoruz kaynak koduna olabilir bakıyorum.

alt metni
alt metni
alt metni

İşte temel adımlar şunlardır:

  1. genişleten bir sınıf oluşturma JComponent
  2. Çağrı ebeveyn yapıcı super()senin kurucularınızdaki
  3. emin sınıf uygular olun MouseListener
  4. yapıcı koy:

    enableInputMethods(true);   
    addMouseListener(this);
    
  5. Bu yöntemleri geçersiz kıl:

    public Dimension getPreferredSize()  
    public Dimension getMinimumSize()  
    public Dimension getMaximumSize()
    
  6. Bu yöntemi geçersiz kılar:

    public void paintComponent(Graphics g)
    

Alan miktarı size düğme ile tanımlanır çizerken ile çalışmak zorunda getPreferredSize(), varsayarak getMinimumSize()ve getMaximumSize()aynı değeri döndürür. Ben size GUI düğme tamamen farklı görünebilir için kullanmak düzenine bağlı olarak bu konuda çok fazla denediği ancak değil.

Ve son olarak, kaynak kodu . Durumunda şey kaçırdım.

Cevap 05/08/2008 saat 14:03
kaynak kullanıcı

oy
32

Evet, bu mümkün. Swing kullanarak ana artıları biri soyut kontroller oluşturulur ve manipüle edilebilir kolaylıktır.

İşte metnin sağında bir daire çizmek için mevcut JButton sınıfını genişletmek için hızlı ve kirli bir yoldur.

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

}

Geçersiz kılarak unutmayın paintComponent düğmenin içeriği değiştirilebilir olduğunu, ancak sınır boyanmış olduğunu paintBorder yöntemiyle. GetPreferredSize yöntemi dinamik olarak da içeriğinde değişiklik desteklemek amacıyla yönetilmesi gerekir. Bakım yazı tipi ölçülerine ve görüntü boyutlarını ölçerken alınması gerekir.

Güvenebileceğiniz bir denetim oluşturmak için, yukarıdaki kod doğru bir yaklaşım değildir. Boyutlar ve renkleri Swing dinamiktir ve görünüm bağlıdır ve kullanılıyor hissediyorum. Hatta varsayılan Metal görünümlü JRE sürümlerinde değişti. Uygulamaya daha iyi olurdu AbstractButton ve Salıncak API tarafından belirlenen kurallara uygundur. İyi bir başlangıç noktası bakmaktır javax.swing.LookAndFeel ve javax.swing.UIManager sınıfları.

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 anatomisini anlamak kontrolleri yazmak için yararlıdır Özel Bir Görünüş ve oluşturma

Cevap 05/08/2008 saat 13:53
kaynak kullanıcı

oy
12

Her zaman Synthesizer görünüm ve izlenime deneyebilirsiniz. Kullanmak istediğiniz görüntüleri ile birlikte, stil bir tür gibi davranan bir xml dosyası sağlayın. Kod aşağıdaki gibi görünebilir:

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

Oradan, git de her zamanki gibi JButton ekleyin. Tek değişiklik düğme xml dosyasında eşleme gerektiğini tespit etmek isimAta (dize) yöntemini kullanmasıdır.

xml dosyası aşağıdaki gibi görünebilir:

<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>

eşlemek ne var belirten bağlama elemanı (bu örnekte, bu ismi özelliği "kir" olarak ayarlanmış herhangi düğmelere o stil uygulanır).

faydalı linkler Ve birkaç:

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

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

Cevap 05/08/2008 saat 13:47
kaynak kullanıcı

oy
8

Muhtemelen yanlış direkt bir milyon mil gidiyorum (: P ama sadece gencim). grafiğininiz eylem kullanıcı önceden oluşturulmuş zaman ki ancak grafik nesnesine sonra MouseListener bir panele grafiği ekleyebilir ve olamazdı.

Cevap 20/08/2008 saat 16:48
kaynak kullanıcı

oy
6

Benim erken CS sınıfları beri SWING gelişimini yapmadım ama size kurulmadı ise sadece javax.swing.AbstractButton devralır ve kendi oluşturabilir. mevcut çerçeve ile birlikte bir şeyler Tel için oldukça basit olmalıdır.

Cevap 05/08/2008 saat 13:30
kaynak kullanıcı

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