mailclient.java

来自「< Professional Java,JDK 5 Edition>」· Java 代码 · 共 285 行

JAVA
285
字号
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.tree.*;
import java.util.*;
import javax.swing.SwingConstants;

class MessageTableModel extends AbstractTableModel {
    public String[] colNames = {"From", "Subject"};
    public Class[] colTypes = {String.class, String.class, String.class};
    public Vector<String[]> data;

    public MessageTableModel()
    {
        super();

        data = new Vector<String[]>();
    }

    public int getColumnCount()
    {
        return(colNames.length);
    }

    public int getRowCount()
    {
        return(data.size());
    }

    public String getColumnName(int col)
    {
        return(colNames[col]);
    }

    public Class getColumnClass(int col)
    {
        return(colTypes[col]);
    }

    public Object getValueAt(int row, int col)
    {
        String strArray[] = data.elementAt(row);

        return(strArray[col]);
    }

    public void addMessage(String from, String subj)
    {
        data.add(new String[]{from,subj});
        fireTableDataChanged();
    }
}

public class MailClient extends JFrame implements ActionListener {
    private JPanel mainPanel;
    private JTree folderTree;
    private JTable messageTable;
    private MessageTableModel tableModel;
    private JMenuBar menuBar;
    private CardLayout cardLayout;
    private JMenuItem sendMailItem;
    private JMenuItem readMailItem;
    private JMenuItem quitApp;
    private JNIMailBridge mailLibrary;
    private JTextField toAddressTF, subjectTF;
    private JTextArea sendMsgBodyTA, readMsgBodyTA;
    private JButton sendMailButton;
    private String currentFolderName="";

    public MailClient(String title)
    {
        super(title);

        mailLibrary = new JNIMailBridge();
        loadMailFolders();
    }

    private void sendMail()
    {
        mailLibrary.sendMail("Outlook", toAddressTF.getText(),
                             subjectTF.getText(), sendMsgBodyTA.getText());
    }

    private JPanel createSendMailPanel()
    {
        JLabel toLabel, subjLabel, bodyLabel;
        JPanel sendMailPanel, topPanel, bottomPanel;

        sendMailPanel = new JPanel(new BorderLayout());
        bottomPanel = new JPanel(new BorderLayout());
        topPanel = new JPanel(new GridBagLayout());

        sendMailButton = new JButton("Send Mail");
        sendMailButton.addActionListener(this);

        toLabel = new JLabel("To: ");
        toLabel.setHorizontalAlignment(SwingConstants.RIGHT);
        subjLabel = new JLabel("Subject: ");
        subjLabel.setHorizontalAlignment(SwingConstants.RIGHT);
        bodyLabel = new JLabel("Message Text");
        toAddressTF = new JTextField(30);
        subjectTF = new JTextField(30);
        sendMsgBodyTA = new JTextArea(10, 40);

        GridBagConstraints c = new GridBagConstraints();

        c.gridx = 0;
        c.gridy = 0;
        c.anchor = GridBagConstraints.LINE_END;
        topPanel.add(toLabel, c);

        c.gridx = 1;
        c.gridy = 0;
        c.anchor = GridBagConstraints.LINE_START;
        topPanel.add(toAddressTF, c);

        c.gridx = 0;
        c.gridy = 1;
        c.anchor = GridBagConstraints.LINE_END;
        topPanel.add(subjLabel, c);

        c.gridx = 1;
        c.gridy = 1;
        c.anchor = GridBagConstraints.LINE_START;
        topPanel.add(subjectTF, c);

        c.gridx = 2;
        c.gridy = 0;
        c.gridheight = 2;
        c.anchor = GridBagConstraints.CENTER;
        topPanel.add(sendMailButton, c);

        c.gridx = 0;
        c.gridy = 3;
        c.gridwidth = 2;
        bottomPanel.add(bodyLabel, BorderLayout.PAGE_START);
        bottomPanel.add(new JScrollPane(sendMsgBodyTA), BorderLayout.CENTER);

        sendMailPanel.add(topPanel, BorderLayout.PAGE_START);
        sendMailPanel.add(bottomPanel, BorderLayout.CENTER);

        return(sendMailPanel);
    }

    private JPanel createReadMailPanel()
    {
        JSplitPane splitPaneHoriz, splitPaneVert;
        JScrollPane scrollPaneTable, scrollPaneText;

        JPanel eastPanel = new JPanel(new BorderLayout());
        JPanel westPanel = new JPanel(new BorderLayout());
        JPanel readPanel = new JPanel(new BorderLayout());

        readMsgBodyTA = new JTextArea(10, 40);

        String colNames[] = {"From", "To", "Subject", "Body"};

        tableModel = new MessageTableModel();
        messageTable = new JTable(tableModel);
        scrollPaneTable = new JScrollPane(messageTable);
        scrollPaneText = new JScrollPane(readMsgBodyTA);

        messageTable.addMouseListener(
             new MouseAdapter() {
                 public void mousePressed(MouseEvent e) {
                     int selRow = messageTable.rowAtPoint(new java.awt.Point(e.getX(), e.getY()));

                     if(selRow != -1) {
                         if(e.getClickCount() == 2) {
                             MailFolder folder = mailLibrary.findFolder(currentFolderName);

                             readMsgBodyTA.setText(folder.getMessage(selRow).body);
                         }
                     }
                 }
             }
        );

        splitPaneVert = new JSplitPane(JSplitPane.VERTICAL_SPLIT, scrollPaneTable, scrollPaneText);
        splitPaneHoriz = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, new JScrollPane(folderTree), splitPaneVert);
        readPanel.add(splitPaneHoriz);

        return(readPanel);
    }

    public void actionPerformed(ActionEvent ae)
    {
        if(ae.getSource() == sendMailItem) {
            cardLayout.show(mainPanel, "SendMail");
        } else if(ae.getSource() == readMailItem) {
            cardLayout.show(mainPanel, "ReadMail");
        } else if(ae.getSource() == quitApp) {
            dispose();
        } else if(ae.getSource() == sendMailButton) {
            sendMail();
        }
    }

    private void showMessages(int row, TreePath path)
    {
        currentFolderName = path.getLastPathComponent().toString();

        if(currentFolderName == null || currentFolderName.equals("")) {
            System.out.println("ERROR in showMessages. folderName equals " + currentFolderName);
            return;
        }

        mailLibrary.getFolderContents("Outlook", "Top of Personal Folders", currentFolderName);
        MailFolder folder = mailLibrary.findFolder("Example");

        for(int i=0; i<folder.getMessageCount(); i++) {
            tableModel.addMessage(folder.getMessage(i).fromAddress,
                                  folder.getMessage(i).subject);
        }
    }

    private void loadMailFolders()
    {
        DefaultMutableTreeNode top = new DefaultMutableTreeNode("Mail Folders");

        mailLibrary.getFolderList("Outlook", "Top of Personal Folders");

        for(int i=0; i<mailLibrary.getFolderCount(); i++) {
            top.add(new DefaultMutableTreeNode(mailLibrary.getFolder(i).getFolderName()));
        }

        folderTree = new JTree(top);

        folderTree.addMouseListener(
             new MouseAdapter() {
                 public void mousePressed(MouseEvent e) {
                     int selRow = folderTree.getRowForLocation(e.getX(), e.getY());
                     TreePath selPath = folderTree.getPathForLocation(e.getX(), e.getY());
                     if(selRow != -1) {
                         if(e.getClickCount() == 2) {
                             showMessages(selRow, selPath);
                         }
                     }
                 }
             }
        );
    }

    public void createAndShowGUI()
    {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(200, 50);

        JMenu mainMenu = new JMenu("Action");
        menuBar = new JMenuBar();

        sendMailItem = new JMenuItem("Send Mail");
        readMailItem = new JMenuItem("Read Mail");
        quitApp = new JMenuItem("Quit");

        sendMailItem.addActionListener(this);
        readMailItem.addActionListener(this);
        quitApp.addActionListener(this);

        mainMenu.add(sendMailItem);
        mainMenu.add(readMailItem);
        mainMenu.add(quitApp);

        menuBar.add(mainMenu);
        setJMenuBar(menuBar);

        cardLayout = new CardLayout();
        mainPanel = new JPanel(cardLayout);
        mainPanel.add(createReadMailPanel(), "ReadMail");
        mainPanel.add(createSendMailPanel(), "SendMail");

        add(mainPanel);

        pack();
        setVisible(true);
    }

    public static void main(String args[])
    {
        MailClient mc = new MailClient("JNI Mail Client");

        mc.createAndShowGUI();
    }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?