Ja, das ist möglich. Eines der wichtigsten Argumente für die Verwendung von Swing ist die Leichtigkeit, mit der die abstrakten Steuerelemente erstellt und manipuliert werden können.
Hier ist eine schnelle und schmutzige Möglichkeit, die vorhandene JButton-Klasse zu erweitern, um einen Kreis auf der rechten Seite des Textes zu zeichnen.
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);
}
}
Beachten Sie, dass durch zwingende paintcomponent, dass der Inhalt der Taste kann verändert werden, sondern dass die Grenze von der Methode paintBorder gemalt. Die Methode getPreferredSize muss auch verwaltet werden, um Änderungen am Inhalt dynamisch zu unterstützen. Beim Messen von Schriftmetriken und Bilddimensionen ist Vorsicht geboten.
Zum Erstellen eines Steuerelements, auf das Sie sich verlassen können, ist der obige Code nicht der richtige Ansatz. Abmessungen und Farben sind dynamisch in Swing und hängen vom verwendeten Look and Feel ab. Selbst der Standard Metal Aussehen hat sich über JRE-Versionen geändert. Es wäre besser, AbstractButton zu implementieren und den Richtlinien der Swing API zu entsprechen. Ein guter Ausgangspunkt ist die javax.swing.LookAndFeel und javax.swing.UIManager Klassen.
http://docs.oracle.com/javase/8/docs/api/javax/swing/LookAndFeel.html
http://docs.oracle.com/javase/8/docs/api/javax/swing/UIManager.html
die Anatomie des LookAndFeel zu verstehen, ist für das Schreiben von Kontrollen nützlich: Creating a Custom Look and Feel
Hallo, erstmal danke für den Code! Ich würde vorschlagen, einen 'setActionComm (String Command)' zu Ihrem Code hinzuzufügen. Dies ist eine der Möglichkeiten, Ereignisse in Swing zu filtern. (Aber dann können Sie argumentieren, dass es 1001 Dinge gibt, die hinzugefügt werden könnten, um die Dinge etwas besser zu machen: P) –
Kannst du den ganzen Code hier einfügen? –
Um einen Würfel zu erstellen, den Sie drücken können, können Sie tatsächlich einen einfachen alten JButton verwenden (anstatt eine benutzerdefinierte JComponent zu unterklassifizieren oder zu erstellen), indem Sie die setIcon/setPressedIcon- und andere Icon-Funktionen in JButton verwenden. – ControlAltDel