2010-10-10 45 views
3

我有一個程序在一個JTextArea中獲取包含文件路徑的輸入字符串,然後將其內容加載到第二個JTextArea。問題是,當使用JTextArea時,我不能添加一個actionListener,它會在離開此字段時加載第二個JTextArea中的內容。如何解決這個問題?用於將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

你想聽什麼樣的事件? – 2010-10-10 23:00:24

+0

離開inputField區域。我無法使用按鈕,因爲在我的佈局中沒有它的位置。所以在關注inputField之後,我需要運行操作。 – mastodon 2010-10-10 23:03:58

+0

@mastadon「我有一個程序在一個JTextArea中獲取輸入字符串和文件路徑..」使用JTextArea指定一個文件路徑是非常低技術的。將它換成彈出JFileChooser的JButton。如果'佈局'有很多問題,我建議你着重解決這個問題。 – 2010-10-11 02:15:27

回答

6

你不想一個ActionListener,你想有一個FocusListener

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

}); 
2

或者,來充實我的第一個評論,試試這個SSCCE使用一個JButton(&爲內容創建一個JEditorPane)。

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

如果您只需要ActionListener的,看看這個例子:

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

它等於:

textArea.addActionListener(actionListener); 

P. S.的ActionListener必須爲以這種方式使用最終或類字段。