2014-05-16 1 views
0

CardLayoutJPanel 카드로 포커스를 이동할 수없는 이유는 무엇입니까?설명되지 않은 상태로 포커스를 이동할 수 없습니다. CardLayout JPanel

CardLayout 기반 인터페이스를 구현하여 키보드 탐색에 친숙해질 필요가 있습니다. 사용자가 한 카드의 모든 입력란을 통해 탭 이동을 완료하면 사용자는 다음 카드로 이동할 수 있어야합니다.

는 이미 새로에 탭 카드를 팝업 과정에서 각 지점에서 우측 Component을 생산하는 FocusTraversalPolicyFocusAdapter을 구현했지만, 뭔가 메시지를 먹고 포커스 변경을 방지한다.

나는 는 uncleanly의 기능 중 하나가 스윙의 많은 스레드에서 여러 번 호출하고 이상한 행동에 이르게된다 불구하고 카드 -을 변경할 수 CardLayout FocusTraversalPolicy에 전달할 수 있습니다. 게다가, 그게 그냥 더러운거야.

자바가 이미 수행하고있는 포커스 작업을 모두 다시 구현해야하는 키 바인딩을 사용하고 싶지만 실제로는 부정합니다.

기본적으로 자바는 CardLayout s- 에 카드를 포커스를 이동하는 것을 싫어합니다. 어떻게 이것을 무시할 수 있습니까?

답변

2

마법사와 비슷한 UI가있는 것 같습니다. 그렇다면 각 카드의 마지막 필드로 "다음"버튼을 추가하십시오.

다음 버튼을 누르면 첫 번째 입력 필드에 포커스를 설정하여 다음 카드로 넘기는 것입니다.

각 카드의 마지막 입력 필드는 초점을 다음 단추로 이동시키고, 다음 단추는 포커스를 받으면 스페이스 바를 두드리면 (JButton의 기본 동작) 스페이스 바를 누른 다음 키보드를 계속 누르고 있습니다 -친한.

이렇게하면 특수 KeyBindings 또는 FocusTraversalPolicies의 필요성이 완화됩니다.

편집 :

가 JTextFields에 대한 FocusListeners를 사용하여,이보십시오. Tab을 누르면 필드가 표시되고 마지막 필드에서 탭을 선택하면 카드가 자동으로 다음 필드로 넘어갑니다. 원하는 경우 ActionListeners를 사용할 수 있습니다.

EDIT 2 : 필드가 하나 뿐인 패널에 해킹이 추가되었습니다. 그것은 별개의 단계에서 실행으로

import java.awt.*; 
import java.awt.event.*; 
import java.beans.*; 

import javax.swing.*; 

public class CardLayoutDemo2 implements Runnable 
{ 
    final static String CARD1 = "One"; 
    final static String CARD2 = "Two"; 
    final static String CARD3 = "Three"; 

    JPanel cards; 
    CardLayout cardLayout; 
    JTextField tf1, tf2, tf3, tf4, tf5; 
    JButton dummy; 

    public static void main(String[] args) 
    { 
    SwingUtilities.invokeLater(new CardLayoutDemo2()); 
    } 

    public void run() 
    { 
    tf1 = new JTextField(10); 
    tf2 = new JTextField(10); 
    tf2.addFocusListener(new CardFlipper(CARD2)); 

    tf3 = new JTextField(10); 
    tf4 = new JTextField(10); 
    tf4.addFocusListener(new CardFlipper(CARD3)); 

    tf5 = new JTextField(10); 
    tf5.addFocusListener(new CardFlipper(CARD1)); 

    dummy = new JButton() 
    { 
     @Override 
     public Dimension getPreferredSize() 
     { 
     return new Dimension(0,0); 
     } 
    }; 

    dummy.addFocusListener(new FocusAdapter() 
    { 
     @Override 
     public void focusGained(FocusEvent e) 
     { 
     dummy.transferFocus(); 
     } 
    }); 

    JPanel card1 = new JPanel(); 
    card1.add(new JLabel("One")); 
    card1.add(tf1); 
    card1.add(new JLabel("Two")); 
    card1.add(tf2); 

    JPanel card2 = new JPanel(); 
    card2.add(new JLabel("Three")); 
    card2.add(tf3); 
    card2.add(new JLabel("Four")); 
    card2.add(tf4); 

    JPanel card3 = new JPanel(); 
    card3.add(dummy); 
    card3.add(new JLabel("Five")); 
    card3.add(tf5);  

    cardLayout = new CardLayout(); 
    cards = new JPanel(cardLayout); 
    cards.add(card1, CARD1); 
    cards.add(card2, CARD2); 
    cards.add(card3, CARD3); 

    JFrame f = new JFrame("CardLayout Demo"); 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    f.add(cards, BorderLayout.CENTER); 
    f.setSize(180, 200); 
    f.setLocationRelativeTo(null); 
    f.setVisible(true); 
    } 

    private class CardFlipper extends FocusAdapter 
    { 
    private String nextCard; 

    CardFlipper(String cardName) 
    { 
     this.nextCard = cardName; 
    } 

    @Override 
    public void focusLost(FocusEvent e) 
    { 
     cardLayout.show(cards, nextCard); 
    } 
    } 
} 
+0

이 방법으로 문제가 해결되지만 바람직하지 않습니다. 이 인터페이스는 시각 장애인을 위해 배치 될 것이며, '공간'또는 '입력'을 두 번 눌러 앞으로 나아갈 필요가있는 혼란스러운 패러다임이 될 것입니다. – citelao

+0

스페이스 바를 두 번 탭 하시겠습니까? 누가 말했다? 버튼에 포커스가있을 때 단일 프레스가됩니다. 이것은 쓰여진 언어 (Swing, Visual Basic 등)에 관계없이 표준 데스크탑 UI 동작입니다. 표준 표준 기능 (업계 표준)이 혼란 스러울 수 있는지 잘 모르겠습니다. – splungebob

+0

또한 양식의 마지막 필드로 이동하여 내 데이터를 입력하고 필드에서 Tab/enter/anything을 입력하면 UI가 사용자에게 UI가 자동으로 전환되어 경고 메시지가 혼동스럽게 보일 수 있습니다. 사용자를 놀라게하지 마십시오. UI가 분명해야합니다. – splungebob

2

나는, 구획 프로그램을 유지하려는.

이렇게해도 긴 스크롤 양식을 만들 수 있습니까?

지금하고있는 것처럼 개별 패널을 만들 수 있습니다. 그런 다음 패널을 교체해야하는 CardLayout에 이러한 패널을 추가하는 대신 BoxLayout (또는 GridBagLayout)을 사용하여 패널을 패널에 추가 할 수 있습니다.

각 패널의 크기가 각 패널의 크기에 영향을 미치지 않으면 서 각 패널의 유연성을 높일 수 있습니다.

그러나 양식은 현재 JScrollPane에서 자동으로 스크롤되지 않으므로 Scrolling a Form을 확인하면이 작업을 수행 할 수 있습니다.

+0

특히 시각적으로 장애가있는 사용자에게 스크롤링 UI를 적용 할 수 있는지, 특히 본질적으로 스크롤 휠을 적용해야하는지 여부는 확실하지 않습니다. – citelao

+0

@citelao 누가 스크롤 휠에 대해 말 했나요? Tab 또는 Shift-Tab 만 사용하면됩니다. 탭 키를 사용하여 패널에서 패널로 이동해야했습니다.패널의 스와핑 (splungebob에서 제안한대로)을 관리하거나 양식의 스크롤을 관리해야합니다 (이것이 제시하는 것처럼). 스크롤바를 숨길 수도 있습니다. – camickr

+0

이 방법을 사용하면 UI 개념에 익숙하지 않은 사람이 실수로 창을 스크롤하면 어떻게 수정합니까? 정의에 따라 양식을 스크롤하면 스크롤 휠을 모방합니다. – citelao

관련 문제