Apakah ada cara untuk membuat JButton
dengan gambar tombol Anda sendiri dan tidak hanya dengan gambar di dalam tombol?
Jika tidak, apakah ada cara lain untuk membuat custom JButton
di java?
Jawaban:
Ketika saya pertama kali belajar Java, kami harus membuat Yahtzee dan saya pikir akan sangat keren untuk membuat komponen dan wadah Swing khusus daripada hanya menggambar semuanya di satu JPanel
. Manfaat memperluas Swing
komponen, tentu saja, adalah memiliki kemampuan untuk menambahkan dukungan untuk pintasan keyboard dan fitur aksesibilitas lainnya yang tidak dapat Anda lakukan hanya dengan paint()
metode mencetak gambar yang cantik. Namun ini mungkin tidak dilakukan dengan cara terbaik, tetapi ini mungkin titik awal yang baik untuk Anda.
Edit 8/6 - Jika tidak terlihat dari gambar, setiap Die adalah tombol yang dapat Anda klik. Ini akan memindahkannya ke DiceContainer
bawah. Melihat kode sumber Anda dapat melihat bahwa setiap tombol Die digambar secara dinamis, berdasarkan nilainya.
Berikut langkah-langkah dasarnya:
JComponent
super()
di konstruktor AndaMouseListener
Letakkan ini di konstruktor:
enableInputMethods(true);
addMouseListener(this);
Ganti metode ini:
public Dimension getPreferredSize()
public Dimension getMinimumSize()
public Dimension getMaximumSize()
Ganti metode ini:
public void paintComponent(Graphics g)
Jumlah ruang yang harus Anda kerjakan saat menggambar tombol Anda ditentukan oleh getPreferredSize()
, dengan asumsi getMinimumSize()
dan getMaximumSize()
mengembalikan nilai yang sama. Saya belum banyak bereksperimen dengan ini, tetapi, tergantung pada tata letak yang Anda gunakan untuk GUI, tombol Anda dapat terlihat sangat berbeda.
Dan terakhir, kode sumber . Seandainya saya melewatkan sesuatu.
Ya, ini mungkin. Salah satu kelebihan utama dalam menggunakan Swing adalah kemudahan pembuatan dan manipulasi kontrol abstrak.
Berikut adalah cara cepat dan kotor untuk memperluas kelas JButton yang ada untuk menggambar lingkaran di sebelah kanan teks.
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);
}
}
Perhatikan bahwa dengan mengganti paintComponent , konten tombol bisa diubah, tetapi batasnya dicat dengan metode paintBorder . The getPreferredSize metode juga perlu dikelola untuk mendukung perubahan secara dinamis dengan konten. Perhatian harus diberikan saat mengukur metrik font dan dimensi gambar.
Untuk membuat kontrol yang dapat Anda andalkan, kode di atas bukanlah pendekatan yang benar. Dimensi dan warna dinamis di Ayunan dan bergantung pada tampilan dan nuansa yang digunakan. Bahkan tampilan Metal default telah berubah di semua versi JRE. Akan lebih baik untuk mengimplementasikan AbstractButton dan menyesuaikan dengan pedoman yang ditetapkan oleh Swing API. Sebuah titik awal yang baik adalah dengan melihat kelas javax.swing.LookAndFeel dan 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
Memahami anatomi LookAndFeel berguna untuk kontrol penulisan: Membuat Tampilan dan Nuansa Kustom
Anda selalu dapat mencoba tampilan & nuansa Synth. Anda menyediakan file xml yang berfungsi sebagai semacam lembar gaya, bersama dengan gambar yang ingin Anda gunakan. Kode tersebut mungkin terlihat seperti ini:
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);
}
Dari sana, lanjutkan dan tambahkan JButton Anda seperti biasa. Satu-satunya perubahan adalah Anda menggunakan metode setName (string) untuk mengidentifikasi ke mana tombol harus dipetakan dalam file xml.
File xml mungkin terlihat seperti ini:
<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>
Elemen bind di sana menentukan apa yang akan dipetakan (dalam contoh ini, ini akan menerapkan gaya itu ke tombol apa pun yang properti namanya telah disetel ke "kotoran").
Dan beberapa tautan berguna:
http://javadesktop.org/articles/synth/
http://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/synth.html
Saya mungkin pergi sejuta mil ke arah yang salah (tapi saya hanya muda: P). tetapi Anda tidak dapat menambahkan grafik ke panel dan kemudian pendengar mouse ke objek grafik sehingga ketika pengguna pada grafik tindakan Anda dilakukan sebelumnya.
Saya belum melakukan pengembangan SWING sejak kelas CS awal saya, tetapi jika itu tidak dibangun, Anda bisa mewarisi javax.swing.AbstractButton
dan membuatnya sendiri. Harus cukup sederhana untuk menghubungkan sesuatu dengan kerangka yang ada.