2010-10-10 33 views
3

J'ai un programme qui obtient la chaîne d'entrée avec le chemin de fichier dans un JTextArea, puis charge son contenu à un second JTextArea. Le problème est que lorsque j'utilise JTextArea, je ne peux pas ajouter d'actionListener qui chargera le contenu dans la seconde JTextArea en quittant ce champ. Comment contourner ce problème?Solution de contournement pour ajouter ActionListener à JTextArea

protected JTextArea inputField, outputField; 

public Main(){ 
    super(new BorderLayout()); 
    inputField = new JTextArea(5, 20); 
    outputField = new JTextArea(2, 20); 
    //inputField.addActionListener(this); 
    inputField.setEditable(false); 
    JScrollPane scroller2 = new JScrollPane(inputField); 
    JScrollPane scroller1 = new JScrollPane(outputField); 

    this.add(scroller1, BorderLayout.WEST); 
    this.add(scroller2, BorderLayout.EAST); 
} 

public void actionPerformed(ActionEvent evt) { 
    String text = inputField.getText(); 
    (loading contents of file) 
} 
+0

Quel genre d'événement voulez-vous écouter? –

+0

en quittant la zone inputField. Je ne peux pas utiliser le bouton car il n'y a pas de place pour cela dans ma mise en page. Donc, après avoir quitté focus sur inputField je dois lancer une action. – mastodon

+0

@mastadon "J'ai un programme qui obtient la chaîne d'entrée avec le chemin de fichier dans un JTextArea .." Utiliser un JTextArea pour spécifier un chemin de fichier est très low-tech. Échangez-le pour un JButton qui fait apparaître un JFileChooser. Si la «mise en page» est un problème majeur, je vous suggère de vous concentrer sur ce problème. –

Répondre

6

Vous ne voulez pas un actionListener, vous voulez un FocusListener.

JTextArea text = ...; 
text.addFocusListener(new FocusListener() { 
    public void focusGained(FocusEvent e) {} 
    public void focusLost(FocusEvent e) { 
     // Load your content. 
    } 

}); 
2

Ou, pour étoffer mon premier commentaire, essayez cette SSCCE qui utilise un JButton (& un JEditorPane pour le contenu).

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.border.*; 

import java.io.File; 

class LoadDocument { 

    public static void main(String[] args) { 

     Runnable r = new Runnable() { 
      public void run() { 
       final JFrame f = new JFrame(); 
       f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

       JPanel contentPane = new JPanel(new BorderLayout(3,3)); 
       contentPane.setBorder(new EmptyBorder(5,5,5,5)); 

       // has convenience methods to load documents.. 
       final JEditorPane content = new JEditorPane(); 
       JScrollPane sp = new JScrollPane(content); 
       sp.setPreferredSize(new Dimension(400,400)); 
       contentPane.add(sp, BorderLayout.CENTER); 

       final JFileChooser jfc = new JFileChooser(); 

       JButton open = new JButton("Open File"); 
       open.addActionListener(new ActionListener(){ 
         public void actionPerformed(ActionEvent ae) { 
          int result = jfc.showOpenDialog(f); 
          if (result==JFileChooser.APPROVE_OPTION) { 
           File file = jfc.getSelectedFile(); 
           try { 
            content.setPage(file.toURI().toURL()); 
           } catch(Exception e) { 
            e.printStackTrace(); 
            JOptionPane.showMessageDialog(
             f, 
             "File load error!", 
             e.getMessage(), 
             JOptionPane.ERROR_MESSAGE 
             ); 
           } 
          } 
         } 
        }); 
       JToolBar tb = new JToolBar(); 
       tb.add(open); 
       contentPane.add(tb, BorderLayout.NORTH); 

       f.setContentPane(contentPane); 
       f.pack(); 
       f.setLocationByPlatform(true); 
       f.setVisible(true); 
      } 
     }; 
     SwingUtilities.invokeLater(r); 
    } 
} 
1

Si vous avez besoin que ActionListener, consultez cet exemple:

textArea.addFocusListener(new FocusAdapter() { 
    @Override 
    public void focusLost(FocusEvent e) { 
     actionListener.actionPerformed(new ActionEvent(e.getSource(), e.getID(), "focusLost")); 
    } 
}); 

Son égal:

textArea.addActionListener(actionListener); 

P. S. actionListener doit être dernier champ ou une classe pour une utilisation de cette façon.