> Java > java지도 시간 > Swing 애플리케이션에서 효과적인 뒤로 및 앞으로 탐색을 구현하는 방법은 무엇입니까?

Swing 애플리케이션에서 효과적인 뒤로 및 앞으로 탐색을 구현하는 방법은 무엇입니까?

Barbara Streisand
풀어 주다: 2024-12-26 15:24:10
원래의
469명이 탐색했습니다.

How to Implement Effective Back and Forward Navigation in a Swing Application?

스윙에서 뒤로/앞으로 버튼 구현

초기 접근

제공된 코드는 스택을 활용합니다. 화면 탐색을 관리합니다. 그러나 제대로 작동하려면 개선이 필요합니다. 문제는change_display 메소드의 구현에 있습니다. 특히 화면 간을 탐색할 때 무한 스택 루프가 발생할 가능성이 있습니다. "뒤로"를 클릭하면 현재 패널이 이전 패널 스택으로 푸시되고 "앞으로"를 클릭하면 앞으로Panels 스택에서 검색됩니다. 그러나 동일한 패널을 두 스택에 반복적으로 밀어넣고 팝하는 것이 가능합니다. 이 시나리오는 비선형 방식으로 화면을 방문할 때 발생할 수 있습니다.

CardLayout을 사용한 대체 접근 방식

스택 기반 접근 방식의 문제를 해결하기 위한 대체 솔루션 CardLayout을 사용하는 것이 제안됩니다. CardLayout을 사용하면 단일 컨테이너 내에서 여러 패널을 효율적으로 관리할 수 있습니다. 각 패널에는 이름 역할을 하는 고유 식별자가 할당됩니다. 패널 사이를 탐색할 때 CardLayout을 활용하면 이름을 키로 사용하여 원하는 패널로 전환할 수 있습니다.

다음은 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);
    }
}
로그인 후 복사

이 구현에서 CardPanel 클래스는 개별 화면을 나타냅니다. 각 화면에는 CardLayout의 해당 키에 해당하는 고유한 이름이 있습니다. 카드 패널은 CardLayout을 활용하고 현재 카드에 해당하는 화면을 표시합니다.

탐색 버튼("이전" 및 "다음"으로 표시됨)은 제어판에 있습니다. 이 버튼은 카드 순서를 진행하거나 되돌리는 작업을 호출합니다.

이 접근 방식은 보다 직관적이고 안정적인 탐색 환경을 제공하여 스택 기반 구현과 관련된 잠재적인 문제를 제거합니다.

위 내용은 Swing 애플리케이션에서 효과적인 뒤로 및 앞으로 탐색을 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿