2012-02-15 18 views
1

在嘗試使用Tab鍵將焦點置於JEditorPane上時,在我的應用程序中存在問題。我不明白爲什麼一開始,但我設法做出一個小例子來證明這個問題。JEditorPane焦點問題在setText()之後

public class JEditorPaneFocusTest 
{ 
    public static void main(String... args) throws Exception 
    { 
     JFrame jFrame = new JFrame(); 
     jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     Container container = jFrame.getContentPane(); 
     container.setLayout(new BorderLayout()); 

     container.add(new JTextField(), BorderLayout.NORTH); 

     JEditorPane editorPane = new JEditorPane(); 
     editorPane.setEditorKit(new HTMLEditorKit()); 
     editorPane.setText("<html><body>Hello World</body></html>"); 
     container.add(editorPane, BorderLayout.CENTER); 

     jFrame.setSize(new Dimension(400, 400)); 
     jFrame.setVisible(true); 
    } 
} 

(測試在Windows 7和Mac OS X的獅子)的應用程序將重點放在JTextField的開始。使用Tab鍵不會將焦點設置到JEditorPane。但如果你評論setText行,它似乎工作...

任何想法?

回答

4
  • 簡短的回答

延遲本次活動由包木窗的invokeLater()

  • 再回應

Focus/Focus Subsystem是異步的,在大多數情況下很難管理/定時爲了更好地理解這個問題,你必須使用這個/這些甚至是(s) EAD鏈接教程,

例如約焦點問題

import java.awt.*; 
import java.awt.event.*; 
import java.awt.font.TextAttribute; 
import java.math.RoundingMode; 
import java.text.NumberFormat; 
import java.util.Map; 
import javax.swing.*; 
import javax.swing.border.EmptyBorder; 
import javax.swing.event.*; 

public class TextAttributeSTRIKETHROUGH { 

    private JFrame frame = new JFrame(); 
    private JPanel pnl = new JPanel(); 
    private JLabel focusLabel = new JLabel(" focusLost Handle "); 
    private JFormattedTextField formTextField; 
    private JLabel docLabel = new JLabel(" document Handle "); 
    private JFormattedTextField formTextField1; 
    private NumberFormat formTextFieldFormat; 
    private double amount = 10000.00; 
    private Map attributes; 

    @SuppressWarnings("unchecked") 
    public TextAttributeSTRIKETHROUGH() { 
     formTextFieldFormat = NumberFormat.getNumberInstance(); 
     formTextFieldFormat.setMinimumFractionDigits(2); 
     formTextFieldFormat.setMaximumFractionDigits(2); 
     formTextFieldFormat.setRoundingMode(RoundingMode.HALF_UP); 

     focusLabel.setFont(new Font("Serif", Font.BOLD, 14)); 
     focusLabel.setForeground(Color.blue); 
     focusLabel.setPreferredSize(new Dimension(120, 27)); 
     formTextField = new JFormattedTextField(formTextFieldFormat); 
     formTextField.setValue(amount); 
     formTextField.setFont(new Font("Serif", Font.BOLD, 22)); 
     formTextField.setForeground(Color.black); 
     formTextField.setBackground(Color.yellow); 
     formTextField.setPreferredSize(new Dimension(120, 27)); 
     formTextField.setHorizontalAlignment(SwingConstants.RIGHT); 
     formTextField.addFocusListener(new FocusListener() { 

      @Override 
      public void focusGained(FocusEvent e) { 
       formTextField.requestFocus(); 
       formTextField.setText(formTextField.getText()); 
       formTextField.selectAll(); 
      } 

      public void focusLost(FocusEvent e) { 
       //Runnable doRun = new Runnable() { 

       //@Override 
       //public void run() { 
       double t1a1 = (((Number) formTextField.getValue()).doubleValue()); 
       if (t1a1 < 1000) { 
        formTextField.setValue(amount); 
       } 
       //} 
       // }; 
       //SwingUtilities.invokeLater(doRun); 
      } 
     }); 

     docLabel.setFont(new Font("Serif", Font.BOLD, 14)); 
     docLabel.setForeground(Color.blue); 
     docLabel.setPreferredSize(new Dimension(120, 27)); 

     formTextField1 = new JFormattedTextField(formTextFieldFormat); 
     formTextField1.setValue(amount); 
     formTextField1.setFont(new Font("Serif", Font.BOLD, 22)); 
     formTextField1.setForeground(Color.black); 
     formTextField1.setBackground(Color.yellow); 
     formTextField1.setPreferredSize(new Dimension(120, 27)); 
     formTextField1.setHorizontalAlignment(SwingConstants.RIGHT); 
     formTextField1.addFocusListener(new FocusListener() { 

      @Override 
      public void focusGained(FocusEvent e) { 
       formTextField1.requestFocus(); 
       formTextField1.setText(formTextField1.getText()); 
       formTextField1.selectAll(); 
      } 

      @Override 
      public void focusLost(FocusEvent e) { 
      } 
     }); 
     formTextField1.getDocument().addDocumentListener(docListener); 

     attributes = (new Font("Serif", Font.BOLD, 24)).getAttributes(); 
     attributes.put(TextAttribute.STRIKETHROUGH, TextAttribute.STRIKETHROUGH_ON); 

     pnl = new JPanel(); 
     pnl.setBorder(new EmptyBorder(2, 2, 2, 2)); 
     pnl.setLayout(new GridLayout(2, 2)); 
     pnl.add(focusLabel); 
     pnl.add(formTextField); 
     pnl.add(docLabel); 
     pnl.add(formTextField1); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(pnl, BorderLayout.CENTER); 
     frame.setLocation(200, 200); 
     frame.pack(); 
     frame.setVisible(true); 
     formTextFieldFocus1(); 
    } 
    // 
    private DocumentListener docListener = new DocumentListener() { 

     @Override 
     public void changedUpdate(DocumentEvent documentEvent) { 
      printIt(documentEvent); 
     } 

     @Override 
     public void insertUpdate(DocumentEvent documentEvent) { 
      printIt(documentEvent); 
     } 

     @Override 
     public void removeUpdate(DocumentEvent documentEvent) { 
      printIt(documentEvent); 
     } 

     private void printIt(DocumentEvent documentEvent) { 
      DocumentEvent.EventType type = documentEvent.getType(); 
      double t1a1 = (((Number) formTextField1.getValue()).doubleValue()); 
      if (t1a1 < 1000) { 
       Runnable doRun = new Runnable() { 

        @Override 
        public void run() { 
         formTextField1.setFont(new Font(attributes)); 
        } 
       }; 
       SwingUtilities.invokeLater(doRun); 
      } else { 
       Runnable doRun = new Runnable() { 

        @Override 
        public void run() { 
         formTextField1.setFont(new Font("Serif", Font.BOLD, 22)); 
        } 
       }; 
       SwingUtilities.invokeLater(doRun); 
      } 
     } 
    }; 

    private void formTextFieldFocus1() { 
     Runnable doRun = new Runnable() { 

      @Override 
      public void run() { 
       formTextField1.grabFocus(); 
       formTextField1.requestFocus(); 
       formTextField1.setText(formTextField1.getText()); 
       formTextField1.selectAll(); 
      } 
     }; 
     SwingUtilities.invokeLater(doRun); 
    } 

    private void formTextFieldFocus() { 
     Runnable doRun = new Runnable() { 

      @Override 
      public void run() { 
       formTextField.grabFocus(); 
       formTextField.requestFocus(); 
       formTextField.setText(formTextField.getText()); 
       formTextField.selectAll(); 
       formTextFieldFocus1(); 
      } 
     }; 
     SwingUtilities.invokeLater(doRun); 
    } 

    public static void main(String args[]) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       TextAttributeSTRIKETHROUGH fl = new TextAttributeSTRIKETHROUGH(); 
      } 
     }); 
    } 
} 
+0

謝謝,實際上在我的應用程序中,將setText調用放在invokeLater中並沒有幫助。但是,當嵌入在由camickr描述的invokeLater中時,我的小案例測試似乎工作得很好......我需要在測試用例上再次工作,因爲它沒有解決我原來的問題......我只是不明白爲什麼,這個對話框是從我的程序中的一個actionPerformed創建的(所以在事件分派器線程中),並且只是評論setText行似乎可以防止這個問題... – 2012-02-16 21:00:45

+0

沒關係,這似乎工作。 – 2012-02-16 21:07:36

+0

hmmm @camickr是作者(好主意)Dialog Focus http://tips4java.wordpress.com/2010/03/14/dialog-focus/,這也許是改變接受標誌的重要原因:-) – mKorbel 2012-02-16 21:10:21

3

所有GUI相關的代碼應在EDT執行。有關更多詳細信息,請參閱Concurrency in Swing

import java.awt.*; 
import javax.swing.*; 
import javax.swing.text.html.*; 

public class JEditorPaneFocusTest 
{ 
    public static void main(String... args) throws Exception 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       JFrame jFrame = new JFrame(); 
       jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

       Container container = jFrame.getContentPane(); 
       container.setLayout(new BorderLayout()); 

       container.add(new JTextField(), BorderLayout.NORTH); 

       JEditorPane editorPane = new JEditorPane(); 
       editorPane.setEditorKit(new HTMLEditorKit()); 
       editorPane.setText("<html><body>Hello World</body></html>"); 
       container.add(editorPane, BorderLayout.CENTER); 

       jFrame.setSize(new Dimension(400, 400)); 
       jFrame.setVisible(true); 
      } 
     }); 

    } 
} 
+0

我忘了提到+1 – mKorbel 2012-02-16 05:41:41