Quelle des Artikels: Computer Enthusiast Autor: Zhang Jian
Erinnern Sie sich noch an den Minicooper, der in „The Last Day“ wie ein Elf durch den Hollywood-Verkehr pendelte? Mark Wahlberg und Sally Theron steuerten es, um Gold im Wert von mehreren zehn Millionen vor die Nase ihrer Feinde zu transportieren. Wenn jedoch jetzt eine Minicooper-Karosserie vor Ihnen steht, die nicht schnell laufen kann, wie würden Sie sich das vorstellen? Ist es immer noch der wandernde Elf? Lassen Sie uns heute Stück für Stück die Teile für diesen Minicooper zusammenbauen und ihn laufen lassen.
Vorwort
Ab dieser Ausgabe stellen wir Ihnen den vollständigen Quellcode des Spiels zur Verfügung (zum Herunterladen klicken). Java Cafe plädiert dafür, dass jeder der Theorie und der Praxis die gleiche Aufmerksamkeit schenkt. Wir werden Ihnen in der Serie Schlüsseltechnologien und Implementierungsideen vorstellen, so als ob Sie gleichzeitig eine Zeitung lesen und Kaffee trinken würden Hier ist der Duft von Didi noch nicht erschöpft.
Spiellayout
„Lianliankan“ ist ein zweidimensionales Schachspiel. Wenn Sie ein Schachspiel entwerfen möchten, sollte GridLayout die beste Wahl sein. Schauen wir uns nun den Konstruktor von GridLayout an:
・GridLayout(): Standardmäßig ist der Layoutbereich in 1*1-Größen unterteilt
・GridLayout(int rows, int cols): Gibt die Anzahl der horizontalen und vertikalen Gitter im Layoutbereich an
・GridLayout(int rows, int cols, int hgap, int vgap): Wie oben und gibt außerdem den horizontalen Abstand hgap und den vertikalen Abstand vgap zwischen den einzelnen Gittern an
Lassen Sie sich von diesen drei Konstruktoren nicht abschrecken. Solange es Ihnen gefällt, können Sie jeden davon bedenkenlos verwenden. Selbst wenn Sie versehentlich den „falschen“ verwenden, gibt es Möglichkeiten, ihn in Zukunft anzupassen. Das Einzige, was zu beachten ist, ist, dass beim Hinzufügen von Steuerelementen zu GridLayout die Standardreihenfolge von links oben nach rechts unten erfolgt.
Bestimmen wir nun die Anzahl der Gitter für das Spiel. Wie viele Gitter sind angemessen? Zu wenig macht das Spiel weniger schwierig, zu viel führt zu visuellen Auswirkungen. Daher sollten wir es durch ein Konstantenpaar ausdrücken. Auch wenn wir es in Zukunft ändern möchten, wird es ein Kinderspiel sein.
In Java muss die Definition von Konstanten in Form einer öffentlichen endgültigen Statik geschrieben werden. Wenn wir festlegen, dass das Spielbrett 8 Gitter horizontal und 8 Gitter vertikal hat, sollten wir es wie folgt definieren:
public final static int ROW = 8;
public final static int COLUMN = 8;
Dann verwenden wir den zweiten Konstruktor von GridLayout, um das Layout zu erstellen:
GridLayout gridLayout = new GridLayout(ROW, COLUMN);
Schließlich müssen wir auch das Layout des Spielbereichs (contentPanel) in das obige Layout ändern:
contentPanel.setLayout(gridLayout);
Wenn Sie das Programm zu diesem Zeitpunkt kompilieren und ausführen, fragen Sie sich möglicherweise: Warum hat sich an der Schnittstelle nichts geändert? Obwohl wir das Layout festgelegt haben, wurden keine Steuerelemente hinzugefügt, sodass natürlich keine Änderungen erkennbar sind. Jetzt fügen wir dem Layout Schaltflächen hinzu:
for (int i = 0; i < ROW * COLUMN; i++) {
JButton button = new JButton("Kyodai");
contentPanel.add(button);
}
Versuchen Sie erneut, das Programm auszuführen. Ist es dasselbe wie meins (siehe Abbildung 1)?
Cleverer Einsatz von JButton, um Aufsehen zu erregen
JButton ist auch ein äußerst häufiges Steuerelement in Swing. Wir müssen uns jedoch noch ein wenig anstrengen, um es zu verstehen und zu verwenden, denn wenn Sie in der Lage sind, JButton kompetent zu verwenden, werden Sie es auch finden auch so ähnlich.
Wenn Sie das gerade geschriebene Programm ausführen, werden Sie feststellen, dass die Schaltflächen im Spielbereich immer voll sind, was für den tatsächlichen Spielbetrieb sehr unpraktisch ist. Daher müssen wir einen Weg finden, einige Raster freizugeben. Das GridLayout-Layout ist in Ordnung, aber Sie können beim Hinzufügen von Steuerelementen ein bestimmtes Raster nicht überspringen. Was soll ich jetzt tun?
Tatsächlich ist dies nicht schwierig, da GridLayout kein Überspringen zulässt. Wenn wir die in einem bestimmten Raster hinzugefügten Steuerelemente in den Hintergrund des GridLayout-Layouts integrieren, erzielen wir einen konsistenten visuellen Effekt. Wenn jemand anderes versehentlich auf dieses Raster klickt, wird die Schaltfläche außerdem weiterhin angezeigt. Wir müssen einen Weg finden, das Klicken auf die Schaltfläche zu verhindern, was die Verwendung der setEnabled()-Methode von JButton erfordert. Schließlich müssen wir bei anklickbaren Schaltflächen beim Klicken darauf unterscheiden, auf welche Schaltfläche geklickt wurde.
Als wir die Funktion „About“ das letzte Mal implementiert haben, haben wir die Methode e.getSource() verwendet, um die Quelle des Mausklickereignisses zu ermitteln. Dies war jedoch nur für benannte Steuerelemente wirksam. Hier ist die Verwendung eines Arrays zur Darstellung von Schaltflächen zweifellos der beste Weg. Lassen Sie uns zunächst den obigen Code ändern:
JButton[] dots = new JButton[ROW * COLUMN];
for (int i = 0; i < ROW * COLUMN; i++) {
dots[i] = new JButton("Kyodai");
dots[i].setActionCommand("" + i);
contentPanel.add(dots[i]);
dots[i].addActionListener(this);
}
Vergessen Sie nicht, dots[i] = new JButton("Kyodai") in den Schleifenkörper zu schreiben. Obwohl die Punktegruppennummer bereits früher definiert und verwendet wurde, teilt dies dem Programm nur mit, dass wir einige JButtons verwenden müssen, aber diese JButtons sind immer noch nicht initialisiert. Gleichzeitig verwenden wir nicht nur setActionCommand(), um Ereignisnamen für Schaltflächen anzugeben, sondern verwenden auch die Methode addActionListener(), um jeder Schaltfläche eine Ereignisantwortverarbeitung hinzuzufügen.
Was den Ereignisantwortcode betrifft, können wir ihn nach dem ursprünglichen Ereigniscode actionPerformed() hinzufügen:
if (e.getSource() Instanz von JButton) {
JButton button = (JButton) e.getSource();
int offset = Integer.parseInt(button.getActionCommand());
int row, col;
row = Math.round(offset / COLUMN);
col = offset - row * COLUMN;
JOptionPane.showMessageDialog(this, "ROW="+row+", COL="
+ col, "Button", JOptionPane.INFORMATION_MESSAGE);
}
Im obigen Code wird die e.getSource()-Instanz von JButton verwendet, um zu bestimmen, ob das generierte Ereignis von einem Steuerelement vom Typ JButton generiert wird. Anschließend wird eine erzwungene Klassenkonvertierung für das Steuerelement durchgeführt, das die Ereignisquelle generiert, und dann wird Integer.parseInt( button Die Methode .getActionCommand() wandelt den erhaltenen Ereignisnamen in eine Ganzzahl um, und der folgende Code stellt diese Ganzzahl in Zeilen- und Spalteninformationen wieder her.
Okay, führen Sie jetzt das Programm aus und klicken Sie auf jede Schaltfläche, um zu sehen, ob ein Dialogfeld wie das rechts angezeigt wird.
Beachten Sie, dass unsere Indizes bei 0 beginnen. Der Programmquellcode dieser Ausgabe (zum Herunterladen klicken).
Bilder in Swing verwenden
Derzeit haben wir das Problem der Benutzerbedienung gelöst. Um die Benutzeroberfläche schön zu gestalten, müssen wir Bilder anstelle von Text verwenden. Freunde, die Zeit und Geduld haben, können selbst personalisierte Bilder erstellen. Achten Sie jedoch darauf, dass die Größe jedes Bildes konsistent bleibt, da es sonst zu hässlich wird. Wenn Sie sich Ärger sparen möchten, können Sie auch direkt die im Download-Paket bereitgestellten Bilder verwenden.
In Swing können Sie die Methode setIcon(Image image) verwenden, um ein Bild für einen JButton festzulegen. Der Parameter image ist das Bildobjekt, das wir festlegen möchten. Es gibt viele Möglichkeiten, dieses Objekt abzurufen.
・Verwenden Sie die Toolkit-Klasse, um Folgendes zu erhalten:
image = Toolkit.getDefaultToolkit().getImage(url);
・Verwenden Sie die Methode getImage() der ImageIcon-Klasse, um Folgendes zu erhalten:
image = new ImageIcon(getClass().getResource(filename)).getImage();
Wir wählen hier die erste Methode. Um es in Zukunft einfacher zu machen, das Image-Objekt erneut zu erhalten, können wir dies als Funktion schreiben:
Bild getImage(String filename){
URLClassLoader urlLoader = (URLClassLoader) this.getClass().getClassLoader();
URL-URL = null;
Bildbild = null;
url = urlLoader.findResource(filename);
image = Toolkit.getDefaultToolkit().getImage(url);
Bild zurückgeben;
}
Mit dieser Funktion wird es in Zukunft doch deutlich komfortabler, Bilder zu nutzen, oder?
Da das Bild nun verfügbar ist, können wir die Karteninformationen in Map.Java im Quellcodepaket in Form eines Bildes ausdrücken. Da es sich bei diesem Code um den Algorithmuscode des Spiels handelt, werde ich den Code hier nicht mehr auflisten. In Map.Java verwenden wir ein zweidimensionales Array „map[][], um Bildinformationen zu speichern. Gleichzeitig verwenden wir auch ein eindimensionales Array „images[]“, um jedes Bildobjekt zu speichern Ein Wert. Dieser Wert gibt nicht nur den Wert an, der der Schaltfläche in der Spieloberfläche entspricht, sondern auch die Nummer des Bildes im Array „images[]“, das von dieser Schaltfläche verwendet wird.
Zusammenfassung
Heute haben wir das JButton-Steuerelement in Swing eingeführt. Für die meisten Swing-Steuerelemente kann die Verwendung von JButton kopiert werden. Unterschätzen Sie diesen JButton nicht, wenn Sie ihn gut beherrschen, werden Ihre Swing-Fähigkeiten auf ein höheres Niveau gebracht. Darüber hinaus haben wir zwei Methoden zum Laden von Bilddateien in Java kennengelernt. Schließlich haben wir die beiden oben genannten Teile kombiniert, um eine schöne Spieloberfläche zu schaffen. Obwohl ich hier nicht den vollständigen Code geschrieben habe, glaube ich, dass jeder das Ziel erreichen kann, indem er sich auf mein Quellprogramm bezieht und sich selbst anstrengt. Wenn Sie auf ein Problem stoßen, das nicht gelöst werden kann, können Sie mich über [email protected] kontaktieren.
Ich weiß nicht, ob Sie mit dem heutigen Inhalt zufrieden sind? Die Aufregung steht noch bevor, jeder sollte weiterhin unser Café besuchen!