3

約 1 週間前に、オプション タイプの GUI の作業を開始しました。JFrame から始めて、さまざまなボタンとキー リスナーを使用してかなりの機能を追加しました。私はこれをすべて機能させ、ウィンドウをモーダルにしたいと決めました。JFrame を JDialog に変換しましたが、まだモーダルではありませんが、すべての機能が残っていますが、モーダル (true または false) に設定すると、リスナーのすべての機能が失われます。何が間違っているかについて何か考えはありますか?

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();
    }
}
}
4

1 に答える 1