添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
不拘小节的口罩  ·  ORACLE ...·  1 年前    · 
乐观的签字笔  ·  Server.EarliestRestore ...·  2 年前    · 
  • 事件來源: 產生事件並管理聽候者(listener)
    例: applet
  • 聽候者(listener): 當事件發生時, 被告知
    例: MouseListener
  • 事件類別: 描述事件
    例: MouseEvent
  • MouseListener 介面

    public interface MouseListener
       void mousePressed(MouseEvent event);
          //Called when a mouse button has been pressed on a component
       void mouseReleased(MouseEvent event);
          //Called when a mouse button has been released on a component
       void mouseClicked(MouseEvent event);
          //Called when the mouse has been clicked on a component
       void mouseEntered(MouseEvent event);
          //Called when the mouse enters a component 
       void mouseExited(MouseEvent event);
          //Called when the mouse exits a component 
    

    File MouseSpy.java

    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
       This listener simply prints out the listener method name
       and the x- and y-coordinate of the mouse position.
    public class MouseSpy implements MouseListener
       public void mousePressed(MouseEvent event)
          System.out.println("Mouse pressed. x = "
             + event.getX() + " y = " + event.getY());
       public void mouseReleased(MouseEvent event)
          System.out.println("Mouse released. x = "
             + event.getX() + " y = " + event.getY());
       public void mouseClicked(MouseEvent event)
          System.out.println("Mouse clicked. x = "
             + event.getX() + " y = " + event.getY());
       public void mouseEntered(MouseEvent event)
          System.out.println("Mouse entered. x = "
             + event.getX() + " y = " + event.getY());
       public void mouseExited(MouseEvent event)
          System.out.println("Mouse exited. x = "
             + event.getX() + " y = " + event.getY());
    

    File MouseSpyApplet.java

    import java.applet.Applet;
       This applet installs a mouse spy. Try generating the
       five mouse event types by moving and clicking the mouse.
    public class MouseSpyApplet extends Applet
       public MouseSpyApplet()
          MouseSpy listener = new MouseSpy();
          addMouseListener(listener);
       class MousePressListener implements MouseListener
          public void mousePressed(MouseEvent event)
             int x = event.getX();
             int y = event.getY();
             box.setLocation(x,y);
             repaint(); 
          //do-nothing methods 
          public void mouseReleased(MouseEvent event){}
          public void mouseClicked(MouseEvent event){}
          public void mouseEntered(MouseEvent event){}
          public void mouseExited(MouseEvent event){}
       MouseListener listener = new MousePressListener();
       addMouseListener(listener);
    

    The Mouse Applet

    MouseApplet.java

    import java.applet.Applet;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Rectangle;
    import java.awt.event.MouseListener;
    import java.awt.event.MouseEvent;
       This applet lets the user move a rectangle by clicking
       the mouse.
    public class MouseApplet extends Applet
       public MouseApplet()
          // the rectangle that the paint method draws
          box = new Rectangle(BOX_X, BOX_Y,
             BOX_WIDTH, BOX_HEIGHT);
          // add mouse press listener
          class MousePressListener implements MouseListener
             public void mousePressed(MouseEvent event)
                int x = event.getX();
                int y = event.getY();
                box.setLocation(x, y);
                repaint();
             // do-nothing methods
             public void mouseReleased(MouseEvent event) {}
             public void mouseClicked(MouseEvent event) {}
             public void mouseEntered(MouseEvent event) {}
             public void mouseExited(MouseEvent event) {}
          MouseListener listener = new MousePressListener();
          addMouseListener(listener);
       public void paint(Graphics g)
          Graphics2D g2 = (Graphics2D)g;
          g2.draw(box);
       private Rectangle box;
       private static final int BOX_X = 100;
       private static final int BOX_Y = 100;
       private static final int BOX_WIDTH = 20;
       private static final int BOX_HEIGHT = 30;
      
  • JTextField xField = new JTextField(width);
  • JLabel xLabel = new JLabel("x = ");
  • Icon buttonIcon = new ImageIcon("hand.gif");
  • moveButton = new JButton("Move", buttonIcon);
  • 按鈕聽候者

  • 按下按鈕, 即移動長方形
  • 從含蓋的適用範圍讀取 xField, yField 變數
  • public ButtonApplet()
       class MoveButtonListener implements ActionListener
          public void actionPerformed(ActionEvent event)
             int x =Integer.parseInt(xField.getText());
             int y =Integer.parseInt(yField.getText());
             box.setLocation(x,y);
             repaint();
       ActionListener listener = new MoveButtonListener();
       moveButton.addActionListener(listener);
    

    在面板中放置元件

  • JPanel 是元件的容器(container)
  • 在面板中添加元件 JPanel panel = new JPanel(); panel.add(xLabel); panel.add(xField); . . .
  • 將面板放入框架(frame) JFrame frame = new JFrame(); frame.setContentPane(panel);
  • 裝填框架: 調整框架大小, 剛好容得下這些元件
    frame.pack();
    frame.show();
  • File ButtonApplet.java

    import java.applet.Applet; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; This applet lets the user move a rectangle by specifying the x- and y-position of the top left corner. public class ButtonApplet extends Applet public ButtonApplet() // the rectangle that the paint method draws box = new Rectangle(BOX_X, BOX_Y, BOX_WIDTH, BOX_HEIGHT); // the text fields for entering the x- and y-coordinates final JTextField xField = new JTextField(5); final JTextField yField = new JTextField(5); // the button to move the rectangle JButton moveButton = new JButton("Move", new ImageIcon("hand.gif")); class MoveButtonListener implements ActionListener public void actionPerformed(ActionEvent event) int x = Integer.parseInt(xField.getText()); int y = Integer.parseInt(yField.getText()); box.setLocation(x, y); repaint(); ActionListener listener = new MoveButtonListener(); moveButton.addActionListener(listener); // the labels for labeling the text fields JLabel xLabel = new JLabel("x = "); JLabel yLabel = new JLabel("y = "); // the panel for holding the user interface components JPanel panel = new JPanel(); panel.add(xLabel); panel.add(xField); panel.add(yLabel); panel.add(yField); panel.add(moveButton); // the frame for holding the component panel JFrame frame = new JFrame(); frame.setContentPane(panel); frame.pack(); frame.show(); public void paint(Graphics g) Graphics2D g2 = (Graphics2D)g; g2.draw(box); private Rectangle box; private static final int BOX_X = 100; private static final int BOX_Y = 100; private static final int BOX_WIDTH = 20; private static final int BOX_HEIGHT = 30;

    10.4 行為類似的按鈕組

    有按鈕組的小程式

    JButton leftButton = new JButton("Left"); class LeftButtonListener implements ActionListener public void actionPerformed(ActionEvent event) box.setLocation(-BOX_WIDTH,0); repaint(); LeftButtonListener leftListener = new ButtonListener(); leftButton.addActionListener(leftListener);
  • 各個按鈕的程式碼只有在按鈕標記和移動量。
  • 補救: 設計一方法, 可建構四個按鈕中任一個, 而將按鈕標記和移動量當做參數。
    public JButton makeButton(String label, final int dx, final int dy)
       JButton button = new JButton(label);
       class ButtonListener implements ActionListener
          public void actionPerformed(ActionEvent event)
             box.translate(dx, dy);
             repaint();
       ButtonListener listener = new ButtonListener();
       button.addActionListener(listener);
       return button;
      
  • 注意: 參數 dx 和 dy 宣告為 final
  • 如此, ButtonListener 才能夠存取這些參數。
  • 呼用 makeButton 方法四次: panel.add(makeButton("Left",-BOX_WIDTH,0)); panel.add(makeButton("Right",BOX_WIDTH,0)); panel.add(makeButton("Up",0,-BOX_HEIGHT)); panel.add(makeButton("Down",0,BOX_HEIGHT)); import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; This applet lets the user move a rectangle by clicking on buttons labeled "Left", "Right", "Up", and "Down". public class ButtonApplet extends Applet public ButtonApplet() // the rectangle that the paint method draws box = new Rectangle(BOX_X, BOX_Y, BOX_WIDTH, BOX_HEIGHT); // the panel for holding the user interface components JPanel panel = new JPanel(); panel.add(makeButton("Left", -BOX_WIDTH, 0)); panel.add(makeButton("Right", BOX_WIDTH, 0)); panel.add(makeButton("Up", 0, -BOX_HEIGHT)); panel.add(makeButton("Down", 0, BOX_HEIGHT)); // the frame for holding the component panel JFrame frame = new JFrame(); frame.setContentPane(panel); frame.pack(); frame.show(); public void paint(Graphics g) Graphics2D g2 = (Graphics2D)g; g2.draw(box); Makes a button that moves the box. @param label the label to show on the button @param dx the amount by which to move the box in x-direction when the button is clicked @param dy the amount by which to move the box in y-direction when the button is clicked @return the button public JButton makeButton(String label, final int dx, final int dy) JButton button = new JButton(label); class ButtonListener implements ActionListener public void actionPerformed(ActionEvent event) box.translate(dx, dy); repaint(); ButtonListener listener = new ButtonListener(); button.addActionListener(listener); return button; private Rectangle box; private static final int BOX_X = 100; private static final int BOX_Y = 100; private static final int BOX_WIDTH = 20; private static final int BOX_HEIGHT = 30;

    10.5 框架視窗

  • 應用程式, 不是小程式
  • 建構並顯示框架
    JFrame frame = new JFrame();
    . . .
    frame.show();
  • 設定預設的關閉運算
    frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
  • 將元件加入面板, 然後將面板設為內容格(pane)
    JPanel panel = new
      JPanel();
    panel.add(. . .);
    panel.add(. . .)
    frame.setContentPane(panel);
  • A Frame with Two Labels

    File FrameTest.java

    import javax.swing.ImageIcon;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
       This program displays a frame with an image and a text label.
    public class FrameTest
       public static void main(String[] args)
          JFrame frame = new JFrame();
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          JLabel iconLabel = new JLabel(new ImageIcon("world.gif"));
          JLabel textLabel = new JLabel("Hello, World!");
          JPanel panel = new JPanel();
          panel.add(iconLabel);
          panel.add(textLabel);
          frame.setContentPane(panel);
          frame.pack();
          frame.show();
    

    10.6 文字元件

  • JTextField 容納單行文字
  • JTextArea 容納多行文字
  • new JTextArea(rows, columns) 建構
  • textArea.append(aString) 在末尾添附文字
  • textArea.setEditable(false) 只用於顯示
  • 添加卷軸滑桿(scroll bar), 用
    JScrollPane scrollPane = new JScrollPane(textArea);
    textArea.setContentPane(scrollPane);
  • A Text Area with Scroll Bars

    The Control Panel for Adding Interest

    File TextAreaTest.java

    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
    import javax.swing.JTextField;
       This program shows a frame with a text area that displays
       the growth of an investment. A second frame holds a text
       field to specify the interest rate.
    public class TextAreaTest
       public static void main(String[] args)
          // the application adds interest to this bank account
          final BankAccount account = new BankAccount(INITIAL_BALANCE);
          // the text area for displaying the results
          final JTextArea textArea = new JTextArea(10, 30);
          textArea.setEditable(false);
          JScrollPane scrollPane = new JScrollPane(textArea);
          // construct the frame for displaying the text area
          JFrame frame = new JFrame();
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          frame.setContentPane(scrollPane);
          frame.pack();
          frame.show();
          // the label and text field for entering the interest rate
          JLabel rateLabel = new JLabel("Interest Rate: ");
          final JTextField rateField = new JTextField(10);
          rateField.setText("" + DEFAULT_RATE);
          // the button to trigger the calculation
          JButton calculateButton = new JButton("Add Interest");
          class CalculateListener implements ActionListener
             public void actionPerformed(ActionEvent event)
                double rate = Double.parseDouble(
                   rateField.getText());
                double interest = account.getBalance()
                   * rate / 100;
                account.deposit(interest);
                textArea.append(account.getBalance() + "\n");
          ActionListener listener = new CalculateListener();
          calculateButton.addActionListener(listener);
          // the control panel that holds the input components
          JPanel controlPanel = new JPanel();
          controlPanel.add(rateLabel);
          controlPanel.add(rateField);
          controlPanel.add(calculateButton);
          // the frame to hold the control panel
          JFrame controlFrame = new JFrame();
          controlFrame.setContentPane(controlPanel);
          controlFrame.pack();
          controlFrame.show();