Implementierung der Zurück-/Vorwärts-Schaltflächen in Swing
Erster Ansatz
Der bereitgestellte Code nutzt Stapel um die Bildschirmnavigation zu verwalten. Es bedarf jedoch einer Verfeinerung, um ordnungsgemäß zu funktionieren. Das Problem liegt in der Implementierung der Methode change_display. Insbesondere besteht die Möglichkeit einer Endlosstapelschleife beim Navigieren zwischen Bildschirmen. Wenn Sie auf „Zurück“ klicken, wird das aktuelle Panel auf den previousPanels-Stapel verschoben und beim Klicken auf „Weiter“ aus dem forwardPanels-Stapel abgerufen. Es ist jedoch möglich, dass das gleiche Paneel wiederholt auf beide Stapel geschoben und von beiden Stapeln abgehoben wird. Dieses Szenario kann auftreten, wenn Bildschirme auf nichtlineare Weise aufgerufen werden.
Alternativer Ansatz mit CardLayout
Um die Probleme mit dem stapelbasierten Ansatz zu beheben, gibt es eine alternative Lösung Es wird vorgeschlagen, CardLayout zu verwenden. CardLayout ermöglicht die effiziente Verwaltung mehrerer Panels in einem einzigen Container. Jedem Panel wird eine eindeutige Kennung zugewiesen, die als Name fungiert. Beim Navigieren zwischen Panels kann das CardLayout verwendet werden, um mit seinem Namen als Schlüssel zum gewünschten Panel zu wechseln.
Hier ist eine Implementierung mit CardLayout:
import java.awt.BorderLayout; import java.awt.CardLayout; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.util.Random; import javax.swing.AbstractAction; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; /** @see http://stackoverflow.com/questions/5654926 */ public class CardPanel extends JPanel { private static final Random random = new Random(); private static final JPanel cards = new JPanel(new CardLayout()); private final String name; public CardPanel(String name) { this.name = name; this.setPreferredSize(new Dimension(320, 240)); this.setBackground(new Color(random.nextInt())); this.add(new JLabel(name)); } @Override public String toString() { return name; } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { create(); } }); } private static void create() { JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); for (int i = 1; i < 9; i++) { CardPanel p = new CardPanel("Panel " + String.valueOf(i)); cards.add(p, p.toString()); } JPanel control = new JPanel(); control.add(new JButton(new AbstractAction("\u22b2Prev") { @Override public void actionPerformed(ActionEvent e) { CardLayout cl = (CardLayout) cards.getLayout(); cl.previous(cards); } })); control.add(new JButton(new AbstractAction("Next\u22b3") { @Override public void actionPerformed(ActionEvent e) { CardLayout cl = (CardLayout) cards.getLayout(); cl.next(cards); } })); f.add(cards, BorderLayout.CENTER); f.add(control, BorderLayout.SOUTH); f.pack(); f.setLocationRelativeTo(null); f.setVisible(true); } }
In dieser Implementierung wird das Die CardPanel-Klasse repräsentiert einzelne Bildschirme. Jeder Bildschirm hat einen eindeutigen Namen, der seinem Schlüssel im CardLayout entspricht. Das Kartenfeld nutzt das CardLayout und zeigt den Bildschirm an, der der aktuellen Karte entspricht.
Die Schaltflächen für die Navigation (beschriftet mit „Zurück“ und „Weiter“) befinden sich im Bedienfeld. Diese Schaltflächen rufen Aktionen auf, um durch die Kartensequenz vor- oder zurückzulaufen.
Dieser Ansatz bietet ein intuitiveres und stabileres Navigationserlebnis und eliminiert die potenziellen Probleme, die mit der stapelbasierten Implementierung verbunden sind.
Das obige ist der detaillierte Inhalt vonWie implementiert man eine effektive Vor- und Zurück-Navigation in einer Swing-Anwendung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!