swing

摘自:
    http://www.ntu.edu.sg/home/ehchua/programming/java/J4a_GUI.html

Writing Swing Applications

In summary, to write a Swing application, you have:

    Use the Swing components with prefix "J" in package javax.swing, e.g., JFrame, JButton, JTextField, JLabel, etc.
    A top-level container (such as JFrame or JApplet) is needed. The JComponents should be added directly onto the top-level container. 
They shall be added onto the content-pane of the top-level container. You can retrieve a reference to the content-pane by invoking method 
getContentPane() from the top-level container, or set the content-pane to the main JPanel created in your program.
    Swing applications uses AWT event-handling classes, e.g., ActionEvent/ActionListener, MouseEvent/MouseListener, etc.
    Run the constructor in the Event Dispatcher Thread (instead of Main thread) for thread safety, as shown in the following program template.

1import java.awt.*;       // Using AWT containers and components
import java.awt.event.*; // Using AWT events and listener interfaces
import javax.swing.*;    // Using Swing components and containers
 
// A Swing GUI application inherits from top-level container javax.swing.JFrame
public class SwingCounter extends JFrame {
   private JTextField tfCount;  // Use Swing's JTextField instead of AWT's TextField
   private int count = 0;
 
   /** Constructor to setup the GUI */
   public SwingCounter () {
      // Retrieve the content-pane of the top-level container JFrame
      // All operations done on the content-pane
      Container cp = getContentPane();
      cp.setLayout(new FlowLayout());
 
      cp.add(new JLabel("Counter"));
      tfCount = new JTextField("0", 10);
      tfCount.setEditable(false);
      cp.add(tfCount);
 
      JButton btnCount = new JButton("Count");
      cp.add(btnCount);
 
      // Allocate an anonymous instance of an anonymous inner class that
      //  implements ActionListener as ActionEvent listener
      btnCount.addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
            ++count;
            tfCount.setText(count + "");
         }
      });
 
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  // Exit program if close-window button clicked
      setTitle("Swing Counter"); // "this" JFrame sets title
      setSize(300, 100);         // "this" JFrame sets initial size
      setVisible(true);          // "this" JFrame shows
   }
 
   /** The entry main() method */
   public static void main(String[] args) {
      // Run the GUI construction in the Event-Dispatching thread for thread-safety
      SwingUtilities.invokeLater(new Runnable() {
         @Override
         public void run() {
            new SwingCounter(); // Let the constructor do the job
         }
      });
   }
}
2、练习
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class SwingCalculator extends JFrame {

    private JTextField tfDisplay;
    private String numberInStr = "";
    private char previousOpr = ' ';
    private char currentOpr = ' ';
    private int previousNum = 0;
    private int currentNum = 0;
    private int result = 0; 

    private JButton[] btns;
    private char[] btnsText = { 
            '7', '8', '9', '+', 
            '4', '5', '6', '-', 
            '1', '2', '3', '*', 
            'C', '0', '=', '/' 
        };

    
    public SwingCalculator() {
        tfDisplay = new JTextField("0");
        tfDisplay.setEditable(false);
        // 设置内容右对齐
        tfDisplay.setHorizontalAlignment(JTextField.RIGHT);
        JPanel btnPanel = new JPanel();
        btnPanel.setLayout(new GridLayout(4, 4, 4, 4));
        // btns只是引用,并没有内存空间
        btns = new JButton[16];
        for (int i = 0; i < btns.length; ++i) {
            //使用引用的对象时,需要为每个对象引用申请空间
            //将char转为String
            btns[i] = new JButton(btnsText[i] + "");
            if(btnsText[i] >= '0' && btnsText[i] <= '9')
                btns[i].addActionListener(new NumberBtnListener());
            else
                btns[i].addActionListener(new OprBtnListener());
            btnPanel.add(btns[i]);
        }

        Container cp = getContentPane();
        cp.setLayout(new BorderLayout());
        cp.add(tfDisplay, BorderLayout.NORTH);
        cp.add(btnPanel, BorderLayout.CENTER);
     
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();      //将所有component打包成一块
        setTitle("calculator");
        setVisible(true);
        requestFocus();  //聚焦
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new SwingCalculator();
            }
        });
    }

    class NumberBtnListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent evt) {
            numberInStr += evt.getActionCommand();
            //保存第一次输入的数字
       previousNum
= currentNum;
       //获取输入的数字 currentNum
= evt.getActionCommand().charAt(0) - '0'; tfDisplay.setText(numberInStr); } } // Operator buttons listener (inner class) class OprBtnListener implements ActionListener { @Override public void actionPerformed(ActionEvent evt) { previousOpr = currentOpr; // save currentOpr = evt.getActionCommand().charAt(0);
       //字符'C’,清空所有内容
if (currentOpr == 'C') { numberInStr = ""; previousOpr = ' '; currentOpr = ' '; previousNum = 0; currentNum = 0; result = 0; tfDisplay.setText("0"); } else if (currentOpr == '=') { switch (previousOpr) { case '+': result = previousNum + currentNum; break; case '-': result = previousNum - currentNum; break; case '*': result = previousNum * currentNum; break; case '/': result = previousNum / currentNum; break; }
          //计算结果保存为第一个数字,可以继续作为后面的被除数使用 currentNum
= result; numberInStr = result + ""; tfDisplay.setText(result + ""); } else { numberInStr += evt.getActionCommand(); tfDisplay.setText(numberInStr); } } } }

posted @ 2016-02-21 12:06  SuperTao1024  阅读(309)  评论(0编辑  收藏  举报