Erstellen eines einfachen eigenen JComponent in Java?
Möchte ich beginnen, meine eigene JComponent ist für ein Projekt an der Arbeit. Ich habe ein einfaches Beispiel unten, die sollten erstellen Sie einfach ein ball auf dem Bildschirm. (Ich fand die meisten davon im internet), aber es bietet eine anständige Ausgangspunkt. Meine Frage ist warum funktioniert dieser code nicht zeigen der ball in meine form? Was habe ich falsch gemacht?
Außerdem, was würde werden alle grundlegenden Methoden, die bereitgestellt werden SOLLTEN für eine eigene JComponent?
Code:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.GridBagLayout;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class testBall {
public static void main(String[] args) {
new testBall();
}
public testBall() {
JPanel testPane = new JPanel();
testPane.setBackground(Color.white);
testPane.setLayout(new GridBagLayout());
testPane.add(new MyBall(30,30,10));
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(testPane);
frame.pack();
frame.setSize(500, 300);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
class MyBall extends JComponent
{
private static final long serialVersionUID = 1L;
public MyBall() { }
public MyBall(int x, int y, int diameter)
{
super();
this.setLocation(x, y);
this.setSize(diameter, diameter);
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.setColor(Color.red);
g.fillOval(0, 0, 100, 100);
}
}
Wo konnte ich finden Sie eine Liste aller Methoden sollten überschrieben werden, in eine JComponent-Klasse? (Ich weiß, es gibt diejenigen, die immer einbezogen werden in JComponent.)
Wenn ich eine Instanz dieser Komponente in einer Klasse und müssen, ändern Sie die Farbe des Kreises würde ich einfach dort anrufen repaint()
Methode aus dieser Klasse?
InformationsquelleAutor | 2014-05-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fügen Sie die
MyBall
zutestPane
(GridBagLayout
) ohne Angabe keine Einschränkungen. (Das ist, Ihren Anruf zuadd()
hat keinen zweiten parameter.) Die default-Einschränkungen werden die meisten wahrscheinlich nicht, was Sie wollen. Versuchen Sie es mitBorderLayout
für Ihre test-Bereich, wie diese verwendetBorderLayout.CENTER
als Standard, der ist wohl sinnvoll, in Ihrem Fall:Dies bewirkt, dass der ball zu zeigen, bis für mich.
Als für Ihre zweite Frage, ich denke, deine Klasse ist in Ordnung definiert. Die main-Methode, die Sie implementieren möchten, ist
paintComponent()
wie Sie Sie haben. Manchmal wird es notwendig, zu überschreibenget min/max/preferred size
Methoden, aber es ist wirklich nur darauf an, was Sie wollen, die Komponente zu tun.JComponent
ist nicht Abstrakt, so dass Sie nicht überschreiben nichts, wenn Sie nicht wollen. Es bietet eine viel Funktionalität out of the box wie den Tastatur-Fokus, pluggable look-and-feel, Barrierefreiheit, etc. So lange, wie Sie nicht möchten, ändern Sie das Zeug nur lassen, wie es ist. ImplementierenpaintComponent()
und die verschiedenenget*Size()
Methoden und mit ihm getan werden. (Sie haben zu wählen, die über die Methoden in der JavaDoc zu sehen, was angemessen ist, zu überschreiben.)Die andere option ist die Verlängerung eine Unterklasse von
JComponent
, wenn es als eine Klasse, die etwas ähnliches macht, was Sie tun möchten. Zum BeispielJPanel
ist oft ein guter Ausgangspunkt für impelmenting Ihren eigenen Behälter.Waren Sie wahrscheinlich auf der Suche nach etwas konkreteres als "es kommt darauf an", aber jetzt, wenn alle Sie wollen, ist draw ein ball, dann einfach überschreiben Sie die Methoden, die sich mit der Darstellung der
JComponent
(paintCompentent()
, und dieget*Size()
Methoden).Als seitliche Anmerkung, die Sie wirklich verwenden sollten
SwingUtilities.invokeLater()
zu erstellen Sie Ihre Swing-Komponenten auf dem Swing-thread. Siehe Abschnitt "Swing' s Threading Policy" in http://docs.oracle.com/javase/6/docs/api/javax/swing/package-summary.html.In meinem test-Methode was, wenn ich will, Sie zu streichen, die Jcomponent grün, wenn ich auf das Formular. Kann ich nur rufen repaint() und das sollte repaint jede Komponente auf dem Formular korrekt sind.
Aktualisiert die Antwort auf Ihre erste Frage. Für Ihre zweite Frage, ja - ich denke, dass alle Sie tun müssen ist, rufen repaint() auf die
MyBall
.Sometimes it becomes necessary to override the get min/max/preferred size methods,
- , die getan werden, all die Zeit, die Sie beim erstellen einer benutzerdefinierten Komponente. Sie implementieren müssen, um diese Methoden so, dass layout-Manager einwandfrei funktionieren kann. Die Lösung verwenden Sie ein BorderLayout nicht das problem zu beheben. Versuchen Sie, die Komponente, um den NORDEN des BorderLayout und du wirst immer noch das gleiche problem.Warum wird diese Arbeit nicht in unterschiedlichen layouts? Wenn ein real-Komponente würde ich nicht machen wollen, die Komponente so, dass es könnte verwendet werden, in das layout jeder form.
InformationsquelleAutor matt forsythe
Konstruktor: setzen wir einfach Ort, um die Punkte, die übergeben werden durch constuctor Parameter. Dies ist der Ort, in die diese Komponente angesiedelt sein wird. Die gleiche Weise setzen wir die Größe (
width
xheight
).paintComponent: hier haben wir nur malen, einige oval über übergebene graphics-Objekt.
Der andere Teil ist nur der test, der zeigt, dass die Komponente korrekt erstellt und angezeigt.
InformationsquelleAutor Dmitry Ginzburg
Machte einige Optimierungen, um Ihre java-Klasse, die einzige änderung, die ich Tat, war fügen Sie Ihre neuen MyBall direkt auf den content pane des JFrame, führen Sie diese und Sie werden sehen, ein Roter Kreis auf dein jframe
InformationsquelleAutor rahul pasricha