Da, acest lucru este posibil. Unul dintre principalii profesioniști care folosesc Swing este ușurința cu care se pot crea și manipula controalele abstracte.
Iată o modalitate rapidă și murdară de extindere a clasei JButton existente pentru a desena un cerc în partea dreaptă a textului.
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);
}
}
Rețineți că prin suprascrierea paintComponent că conținutul butonului poate fi schimbat, dar că marginea este vopsită prin metoda paintBorder . Metoda getPreferredSize trebuie, de asemenea, să fie gestionată pentru a sprijini dinamic modificările aduse conținutului. Trebuie să aveți grijă atunci când măsurați valorile fontului și dimensiunile imaginii.
Pentru a crea un control pe care vă puteți baza, codul de mai sus nu este abordarea corectă. Dimensiunile și culorile sunt dinamice în Swing și sunt dependente de aspectul și simțul folosit. Chiar și aspectul implicit Metal sa modificat în versiunile JRE. Ar fi mai bine să implementați AbstractButton și să respectați instrucțiunile stabilite de API-ul Swing. Un bun punct de plecare este să examinați clasele javax.swing.LookAndFeel și 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