2015-01-19 11 views
3

JFrame에 JTextField가 있습니다. 캐럿은 일반적인 캐럿과 캐럿 절반 사이에서 깜박입니다. Screen ShotJTextField 캐럿이 올바르게 표시되지 않습니다.

캐럿은 위쪽과 아래쪽에만 표시됩니다. 맞춤 캐럿을 사용해 보았지만 모두 그래픽의 일부만 보여줍니다. 버그는 암호 필드에서도 마찬가지입니다. 관련성이 있는지는 모르겠지만 Mac을 사용하고 있으며 윈도우에서도 버그가 발생하는지 테스트 할 수있는 Windows 머신을 소유하고 있지 않습니다. 여기에 (내가 그것을 만들 수 짧게) 내 방 창문의 MCVE입니다 : 사전에

public class Login1 extends JFrame implements Serializable { 
private static final long serialVersionUID = 1L; 

private JPanel pnl_mainPanel; 
private JButton btn_login_main, btn_newAccount, btn_seeAccounts, btn_login_login, btn_cancel_login, btn_next, btn_cancel_new; 
private JTextField tf_username_login, tf_username_new; 
private JPasswordField pf_password, pf_password_new, pf_password_confirm; 
private JLabel lbl_username_login, lbl_password_login, lbl_username_new, lbl_password_new, lbl_password_confirm; 

private static final String TITLE = "Login"; 
private final int WINDOW_WIDTH = 400; 
private final int WINDOW_HEIGHT = 300; 
private final Dimension WINDOW_DIM = new Dimension(WINDOW_WIDTH, WINDOW_HEIGHT); 

public Login1() { 
    super(TITLE); 
    setSize(WINDOW_DIM); 
    setLocationRelativeTo(null); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setLayout(new BorderLayout()); 
    buildPanel(); 
    add(pnl_mainPanel); 
    setVisible(true); 
    setResizable(false); 
} 

private void buildPanel() { 
    pnl_mainPanel = new JPanel(); 
    btn_login_main = new JButton("Login"); 
    btn_newAccount = new JButton("New Account"); 
    btn_seeAccounts = new JButton("ℹ"); 

    // login page 
    btn_login_login = new JButton("Login"); 
    btn_cancel_login = new JButton("Cancel"); 
    tf_username_login = new JTextField(); 
    pf_password = new JPasswordField(); 
    lbl_username_login = new JLabel("Username:"); 
    lbl_password_login = new JLabel("Password:"); 

    // new account page 
    btn_next = new JButton("Next"); 
    btn_cancel_new = new JButton("Cancel"); 
    tf_username_new = new JTextField(); 
    pf_password_new = new JPasswordField(); 
    pf_password_confirm = new JPasswordField(); 
    lbl_username_new = new JLabel("Username:"); 
    lbl_password_new = new JLabel("Password:"); 
    lbl_password_confirm = new JLabel("<html>Confirm<br>Password:</html>"); 

    pnl_mainPanel.setLayout(null); 
    pnl_mainPanel.add(btn_login_main); 
    pnl_mainPanel.add(btn_newAccount); 
    pnl_mainPanel.add(btn_seeAccounts); 

    btn_login_login.setSize(75, 30); 
    btn_login_login.setLocation(new Point(310, 175)); 
    btn_cancel_login.setSize(75, 30); 
    btn_cancel_login.setLocation(new Point(310, 215)); 
    tf_username_login.setSize(200, 25); 
    tf_username_login.setLocation(new Point(100, 178)); 
    pf_password.setSize(200, 25); 
    pf_password.setLocation(new Point(100, 218)); 
    lbl_username_login.setSize(100, 25); 
    lbl_username_login.setLocation(new Point(15, 178)); 
    lbl_password_login.setSize(100, 25); 
    lbl_password_login.setLocation(new Point(15, 218)); 

    btn_next.setSize(75, 30); 
    btn_next.setLocation(new Point(310, 160)); 
    btn_cancel_new.setSize(75, 30); 
    btn_cancel_new.setLocation(new Point(310, 200)); 
    tf_username_new.setSize(200, 25); 
    tf_username_new.setLocation(new Point(100, 163)); 
    pf_password_new.setSize(200, 25); 
    pf_password_new.setLocation(new Point(100, 203)); 
    pf_password_confirm.setSize(200, 25); 
    pf_password_confirm.setLocation(new Point(100, 243)); 
    lbl_username_new.setSize(100, 25); 
    lbl_username_new.setLocation(new Point(15, 163)); 
    lbl_password_new.setSize(100, 25); 
    lbl_password_new.setLocation(new Point(15, 203)); 
    lbl_password_confirm.setSize(100, 30); 
    lbl_password_confirm.setLocation(new Point(15, 238)); 

    btn_login_main.setSize(163, 100); 
    btn_login_main.setLocation(new Point(25, 150)); 
    btn_newAccount.setSize(162, 100); 
    btn_newAccount.setLocation(new Point(213, 150)); 
    btn_seeAccounts.setSize(20, 20); 
    btn_seeAccounts.setLocation(new Point(375, 255)); 

    btn_login_main.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      pnl_mainPanel.remove(btn_login_main); 
      pnl_mainPanel.remove(btn_newAccount); 

      pnl_mainPanel.remove(btn_next); 
      pnl_mainPanel.remove(btn_cancel_new); 
      pnl_mainPanel.remove(tf_username_new); 
      pnl_mainPanel.remove(pf_password_new); 
      pnl_mainPanel.remove(pf_password_confirm); 
      pnl_mainPanel.remove(lbl_username_new); 
      pnl_mainPanel.remove(lbl_password_new); 
      pnl_mainPanel.remove(lbl_password_confirm); 

      pnl_mainPanel.add(btn_login_login); 
      pnl_mainPanel.add(btn_cancel_login); 
      pnl_mainPanel.add(tf_username_login); 
      pnl_mainPanel.add(pf_password); 
      pnl_mainPanel.add(lbl_username_login); 
      pnl_mainPanel.add(lbl_password_login); 
      repaint(); 
      tf_username_login.requestFocus(); 
     } 
    }); 
    btn_cancel_login.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      pnl_mainPanel.remove(btn_login_login); 
      pnl_mainPanel.remove(tf_username_login); 
      pnl_mainPanel.remove(pf_password); 
      pnl_mainPanel.remove(btn_cancel_login); 
      pnl_mainPanel.remove(lbl_username_login); 
      pnl_mainPanel.remove(lbl_password_login); 
      pnl_mainPanel.add(btn_login_main); 
      pnl_mainPanel.add(btn_newAccount); 
      repaint(); 
     } 
    }); 
    btn_newAccount.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      pnl_mainPanel.remove(btn_login_main); 
      pnl_mainPanel.remove(btn_newAccount); 
      pnl_mainPanel.add(btn_next); 
      pnl_mainPanel.add(btn_cancel_new); 
      pnl_mainPanel.add(tf_username_new); 
      pnl_mainPanel.add(pf_password_new); 
      pnl_mainPanel.add(pf_password_confirm); 
      pnl_mainPanel.add(lbl_username_new); 
      pnl_mainPanel.add(lbl_password_new); 
      pnl_mainPanel.add(lbl_password_confirm); 
      repaint(); 
      tf_username_new.requestFocus(); 
     } 
    }); 
    btn_cancel_new.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      pnl_mainPanel.remove(btn_next); 
      pnl_mainPanel.remove(btn_cancel_new); 
      pnl_mainPanel.remove(tf_username_new); 
      pnl_mainPanel.remove(pf_password_new); 
      pnl_mainPanel.remove(pf_password_confirm); 
      pnl_mainPanel.remove(lbl_username_new); 
      pnl_mainPanel.remove(lbl_password_new); 
      pnl_mainPanel.remove(lbl_password_confirm); 
      pnl_mainPanel.add(btn_login_main); 
      pnl_mainPanel.add(btn_newAccount); 
      repaint(); 
     } 
    }); 

} 

public static void main(String[] args){ 
    Login1 l = new Login1(); 
} 
} 

감사합니다!

+0

정보가 충분하지 않습니다. 가장 좋은 방법은 문제를 보여주는 프로그램의 단순화 된 버전 인 [MCVE] (http://stackoverflow.com/help/mcve)를 만드는 것입니다 (링크의 세부 정보 참조). 간단한 코드를 질문에 편집으로 넣어 복사하고 실행할 수 있습니다. – RealSkeptic

+0

@RealSkeptic 이것은 로그인 윈도우를위한 큰 클래스의 것입니다. 이것은 일반적인 오류입니까? 텍스트 필드를 표시하는 버튼에 대한 액션 리스너를 추가했습니다 – Dando18

+1

그건 MCVE가 아닙니다. 아이디어는 ** 작은 프로그램 인 **을 작성하는 것입니다. 그러나 우리는 여러분의 문제를보기 위해 컴파일하고 실행할 수 있습니다. 문제가 발생한 곳이 어디인지는 분명하지 않기 때문에 완전한 프로그램이 필요하므로 새 프로그램을 만들어야합니다. – RealSkeptic

답변

1

이것은 내 Mac에서 발생하며 내 Linux에서는 발생하지 않음을 확인할 수 있습니다.

적어도 28

tf_username_login.setSize(200, 28); 

내 추측이지라도 맥 OS X가 (그 높이보다 28 개 픽셀 필드를 만들 수 있다는 것은 쉽게 필드의 높이를 변경함으로써 해결 될 수있다 글꼴 선택 등의 질문이 있습니다. 필자는 그렇게까지 테스트하지 않았습니다.) 어떤 이유로 전체 높이 (28 픽셀)로 전체 캐럿을 그으나 사용자가 알 수있는 현상을 일으키는 크기 (25)로 지 웁니다.

+0

스윙은 플랫폼에 독립적이라고 생각했습니다 –

+1

GUI에 관해서는, 플랫폼에 의존하지 않는 것이 없습니다. 결국 코드는 시스템 종속 호출로 변환됩니다. – RealSkeptic

+0

@RealSkeptic 감사합니다! 그것은 작동합니다. – Dando18