2012-06-18 40 views
3

大約一週前,我開始研究選項類型的GUI。我從一個JFrame開始,並通過各種按鈕和按鍵偵聽器添加了相當多的功能。我有這一切工作,並決定我想窗口是模態。我將JFrame轉換爲JDialog,儘管它仍然不是模態,但所有功能仍然存在,但是當我將它設置爲模態(true或false)時,我失去了監聽器的所有功能。任何想法是什麼錯誤?來自JFrame的JDialog,爲什麼我的聽衆不工作?

我正在上傳我的SVN到GitHub。如果您需要查看代碼,只需發表評論,然後給我幾分鐘。提前致謝。

package main; 

import java.awt.BorderLayout; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 
import java.util.ArrayList; 
import javax.swing.*; 
import Twitter.SearchTweets; 

public class OptionsGUI { 

// auto generated 
private static final long serialVersionUID = 1L; 

private JDialog f; 
private JPanel buttonPanel; 
private JPanel optionsLabelPanel; 
private JPanel optionsSetPanel; 

private JLabel sortLocationLabel; 
private JLabel timeoutLabel; 
private JLabel maxTweetsLabel; 
private JLabel keywordsLabel; 
private JLabel currentKeywordsLabel; 

private JButton add; 
private JButton remove; 
private JButton save; 
private JButton cancel; 

private JCheckBox sortLocationField; 
private JTextField setTimeoutField; 
private JTextField setMaxTweetsField; 
private JTextField addKeywordField; 
private JComboBox currentKeywordsField; 

public OptionsGUI() { 
    f = new JDialog(f, "Options"); 
    buttonPanel = new JPanel(); 
    optionsLabelPanel = new JPanel(); 
    optionsSetPanel = new JPanel(); 

    sortLocationLabel = new JLabel("Sort by location: "); 
    sortLocationLabel.setHorizontalAlignment(JLabel.RIGHT); 
    timeoutLabel = new JLabel("Timeout (in seconds): "); 
    timeoutLabel.setHorizontalAlignment(JLabel.RIGHT); 
    maxTweetsLabel = new JLabel("Maximum Tweets to show: "); 
    maxTweetsLabel.setHorizontalAlignment(JLabel.RIGHT); 
    keywordsLabel = new JLabel("Keyword to add: "); 
    keywordsLabel.setHorizontalAlignment(JLabel.RIGHT); 
    currentKeywordsLabel = new JLabel("Current keywords: "); 
    currentKeywordsLabel.setHorizontalAlignment(JLabel.RIGHT); 

    add = new JButton("Add Keyword"); 
    remove = new JButton("Remove Keyword"); 
    save = new JButton("Save"); 
    cancel = new JButton("Cancel"); 

    sortLocationField = new JCheckBox(); 
    setTimeoutField = new JTextField(10); 
    setMaxTweetsField = new JTextField(10); 
    addKeywordField = new JTextField(10); 
    currentKeywordsField = new JComboBox(); 
    currentKeywordsField.setEditable(false); 

    buttonPanel.setLayout(new GridLayout(2,2)); 
    buttonPanel.add(add); 
    buttonPanel.add(remove); 
    buttonPanel.add(save); 
    buttonPanel.add(cancel); 

    optionsLabelPanel.setLayout(new GridLayout(5,1)); 
    optionsLabelPanel.add(sortLocationLabel); 
    optionsLabelPanel.add(timeoutLabel); 
    optionsLabelPanel.add(maxTweetsLabel); 
    optionsLabelPanel.add(keywordsLabel); 
    optionsLabelPanel.add(currentKeywordsLabel); 

    optionsSetPanel.setLayout(new GridLayout(5,1)); 
    optionsSetPanel.add(sortLocationField); 
    optionsSetPanel.add(setTimeoutField); 
    optionsSetPanel.add(setMaxTweetsField); 
    optionsSetPanel.add(addKeywordField); 
    optionsSetPanel.add(currentKeywordsField); 

    sortLocationField.setSelected(BasicGUI.isSortedByLocation()); 
    setTimeoutField.setText("" + SearchTweets.getTimeout()); 
    setMaxTweetsField.setText("" + BasicGUI.getMaxTweets()); 
    if (SearchTweets.getKeywords().size() > 0) { 
     for (String keyword: SearchTweets.getKeywords()) { 
      currentKeywordsField.addItem(keyword); 
     } 
    } 
    else 
     currentKeywordsField.addItem("(none)"); 

    f.getContentPane().setLayout(new BorderLayout()); 
    f.getContentPane().add(buttonPanel, BorderLayout.SOUTH); 
    f.getContentPane().add(optionsLabelPanel, BorderLayout.WEST); 
    f.getContentPane().add(optionsSetPanel, BorderLayout.CENTER); 
    f.setBounds(50, 50, 300, 235); 
    f.setResizable(false); 
    f.setAlwaysOnTop(true); 
    f.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 
    f.setVisible(true); 
    addKeywordField.requestFocus(); 


    add.addActionListener(new ButtonListener()); 
    addKeywordField.addKeyListener(new KeyChecker()); 
    remove.addActionListener(new ButtonListener()); 
    save.addActionListener(new ButtonListener()); 
    cancel.addActionListener(new ButtonListener()); 
} 

public class ButtonListener implements ActionListener { 

    public void actionPerformed(ActionEvent e) { 
     if (e.getSource() == add) { 
      String newKeyword = addKeywordField.getText(); 
      if (newKeyword != null && newKeyword.length() > 0) { 
       boolean duplicate = false; 
       ArrayList<String> keywords = SearchTweets.getKeywords(); 
       for (int i = 0; i < keywords.size(); i++) { 
        if (keywords.get(i).equalsIgnoreCase(newKeyword)) { 
         duplicate = true; 
         break; 
        } 
       } 
       addKeywordField.transferFocus(); 
       if (duplicate == false) { 
        if (keywords.size() == 0) 
         currentKeywordsField.removeItem("(none)"); 
        currentKeywordsField.addItem(addKeywordField.getText()); 
        currentKeywordsField.setSelectedItem(addKeywordField.getText()); 
       } 
       else { 
        JOptionPane.showMessageDialog(null, "Please enter a keyword that is not already in the list.", "Duplicate Keyword", JOptionPane.ERROR_MESSAGE); 
        f.toFront(); 
        addKeywordField.requestFocus(); 
        addKeywordField.setText(""); 
       } 
      } 
      else { 
       JOptionPane.showMessageDialog(null, "Please enter a keyword before clicking \"Add\".", "Empty Field", JOptionPane.ERROR_MESSAGE); 
       f.toFront(); 
       addKeywordField.requestFocus(); 
      } 
      f.toFront(); 
      addKeywordField.requestFocus(); 
      addKeywordField.setText(""); 
     } 

     else if (e.getSource() == remove) { 
      if (currentKeywordsField.getSelectedItem() != null) { 
       if (!(((String)currentKeywordsField.getSelectedItem()).equals("(none)"))) { 
        currentKeywordsField.removeItem(currentKeywordsField.getSelectedItem()); 
        if (currentKeywordsField.getItemCount() == 0) { 
         currentKeywordsField.addItem("(none)"); 
        } 
       } 
       else 
        JOptionPane.showMessageDialog(null, "No keywords have been entered yet.", "Empty List", JOptionPane.ERROR_MESSAGE); 
       f.toFront(); 
      } 
     } 

     else if (e.getSource() == save) { 

      boolean inputFail = false; 
      //input checking try block 
      try { 

       int tempTimeout = Integer.parseInt(setTimeoutField.getText()); 
       if (tempTimeout < 0) 
        throw new Exception(); 

       int tempMaxTweets = Integer.parseInt(setMaxTweetsField.getText()); 
       if (tempMaxTweets < 0) 
        throw new Exception(); 

       BasicGUI.setSortedByLocation(sortLocationField.isSelected()); 
       SearchTweets.setTimeout(tempTimeout); 
       BasicGUI.setMaxTweets(tempMaxTweets); 

      } catch (NumberFormatException error) { 
       inputFail = true; 
       JOptionPane.showMessageDialog(null, "Please insure that Timeout and Maximum\nTweets are both integers.", "Invalid Input", JOptionPane.ERROR_MESSAGE); 
       f.toFront(); 
      } catch (Exception error) { 
       inputFail = true; 
       JOptionPane.showMessageDialog(null, "Please be sure to enter a nonzero\ninteger for Timeout and Maximum Tweets.\n0 for either insures no timeout or a\nmaximum amount of tweets shown.", "Invalid Input", JOptionPane.ERROR_MESSAGE); 
       if (Integer.parseInt(setTimeoutField.getText()) < 0) 
        setTimeoutField.setText("" + SearchTweets.getTimeout()); 
       if (Integer.parseInt(setMaxTweetsField.getText()) < 0) 
        setMaxTweetsField.setText("" + BasicGUI.getMaxTweets()); 
       f.toFront(); 
      } 

      if (inputFail == false) { 
       SearchTweets.deleteKeywords(); 
       for (int i = 0; i < currentKeywordsField.getItemCount(); i++) { 
        SearchTweets.addKeyword((String)currentKeywordsField.getItemAt(i)); 
       } 
       BasicGUI.setOptionsOpen(false); 
       f.dispose(); 
      } 
      BasicGUI.setSettingsPaneValues(); 
     } 

     else if (e.getSource() == cancel) { 
      BasicGUI.setOptionsOpen(false); 
      f.dispose(); 
     } 

     else { 
      JOptionPane.showMessageDialog(null, "Error: Button not recognized"); 
     } 

    } 

} 

public class KeyChecker implements KeyListener { 
    public void keyPressed(KeyEvent e) { 
     if (e.getKeyCode() == KeyEvent.VK_ENTER) { 
       add.doClick(); 
     } 
    } 

    public void keyReleased(KeyEvent arg0) { 
     //ignore 
    } 

    public void keyTyped(KeyEvent arg0) { 
     //ignore 
    } 
} 

public class ListenCloseWdw extends WindowAdapter{ 
    public void windowClosing(WindowEvent e){ 
     BasicGUI.setOptionsOpen(false); 
     f.dispose(); 
    } 
} 
} 
+2

我們需要看代碼。 – Nick

+0

我已經添加了相關課程的代碼。抱歉。 – takisback

+0

當你只有一個JDialogs對象時,爲什麼你在這裏有兩個JDialogs對象(OptionsGUI的當前對象或'this',以及'''''JDialog變量)? –

回答

6

請勿爲此使用KeyListener。如下所示,將ActionListener添加到您的文本字段中。 輸入密鑰已綁定到接受輸入文本的Action

另請參閱How to Use ActionsHow to Use Key Bindings

import java.awt.EventQueue; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.AbstractAction; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 

/** @see http://stackoverflow.com/a/11085850/230513 */ 
public class EnterTest extends JPanel { 

    public EnterTest() { 
     super(new GridLayout(0, 1)); 
     final JButton add = new JButton(new AbstractAction("Add") { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       System.out.println("Add"); 
      } 
     }); 
     JTextField addKeywordField = new JTextField("Press enter."); 
     addKeywordField.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       add.doClick(); 
      } 
     }); 
     this.add(addKeywordField); 
     this.add(add); 
    } 

    private void display() { 
     JFrame f = new JFrame("EnterTest"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(this); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

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

      @Override 
      public void run() { 
       new EnterTest().display(); 
      } 
     }); 
    } 
} 
+0

另請參閱'setDefaultButton()',說明[此處](http://stackoverflow.com/a/7457102/230513)。 – trashgod

+0

謝謝你的幫助。對不起,我的誤解。 – takisback

+0

我的錯:我試圖讓評論過多。 :-) – trashgod