友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
富士康小说网 返回本书目录 加入书签 我的书架 我的书签 TXT全本下载 『收藏到我的浏览器』

Java编程思想第4版[中文版](PDF格式)-第78部分

快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!



 (不像BadTechnuque。java 那样我们能时时刻刻看到)。  

试验这个程序是十分的有教育意义的,因为我们学习了许多的关于在Java 中事件发生的方法。一则它展示了 

大多数开窗口的系统中设计上的瑕疵:它相当的难以去单击和释放鼠标,除非移动它,并且当我们实际上正 

试图用鼠标单击在某物体上时开窗口的会常常认为我们是在拖动。一个解决这个问题的方案是使用 

mousePressed() 鼠标按下方法和mouseReleased()鼠标释放方法去代替mouseClicked() 鼠标单击方法,然后 

判断是否去调用我们自己的以时间和4 个像素的鼠标滞后作用的“mouseReallyClicked()真实的鼠标单击” 

方法。  

  

5。 蹩脚的组件继承  

另一种做法是调用 enableEvent()方法,并将与希望控制的事件对应的模型传递给它(许多参考书中都曾提 

及这种做法)。这样做会造成那些事件被发送至老式方法(尽管它们对Java 1。1 来说是新的),并采用象 

processFocusEvent()这样的名字。也必须要记住调用基础类版本。下面是它看起来的样子。  

  

//: BadTechnique。java  

// It's possible to override ponents this way;  

// but the listener approach is much better; so  

// why would you?  

import java。awt。*;  

import java。awt。event。*;  

  

class Display {  

  public static final int  

    EVENT = 0; PONENT = 1;  

    MOUSE = 2; MOUSE_MOVE = 3;  



                                                                                   443 


…………………………………………………………Page 445……………………………………………………………

    FOCUS = 4; KEY = 5; ACTION = 6;  

    LAST = 7;  

  public String'' evnt;  

  Display() {  

    evnt = new String'LAST';  

    for(int i = 0; i 《 LAST; i++)  

      evnt'i' = new String();  

  }  

  public void show(Graphics g) {  

    for(int i = 0; i 《 LAST; i++)  

      g。drawString(evnt'i'; 0; 10 * i + 10);  

  }  

}  

  

class EnabledPanel extends Panel {  

  Color c;  

  int id;  

  Display display = new Display();  

  public EnabledPanel(int i; Color mc) {  

    id = i;  

    c = mc;  

    setLayout(new BorderLayout());  

    add(new MyButton(); BorderLayout。SOUTH);  

    // Type checking is lost。 You can enable and  

    // process events that the ponent doesn't  

    // capture:  

    enableEvents(  

      // Panel doesn't handle these:  

      AWTEvent。ACTION_EVENT_MASK |  

      AWTEvent。ADJUSTMENT_EVENT_MASK |  

      AWTEvent。ITEM_EVENT_MASK |  

      AWTEvent。TEXT_EVENT_MASK |  

      AWTEvent。WINDOW_EVENT_MASK |  

      // Panel can handle these:  

      AWTEvent。PONENT_EVENT_MASK |  

      AWTEvent。FOCUS_EVENT_MASK |  

      AWTEvent。KEY_EVENT_MASK |  

      AWTEvent。MOUSE_EVENT_MASK |  

      AWTEvent。MOUSE_MOTION_EVENT_MASK |  

      AWTEvent。CONTAINER_EVENT_MASK);  

      // You can enable an event without  

      // overriding its process method。  

  }  

  // To eliminate flicker:  

  public void update(Graphics g) {  

    paint(g);  

  }  

  public void paint(Graphics  g) {  

    g。setColor(c);  

    Dimension s = getSize();  

    g。fillRect(0; 0; s。width; s。height);  

    g。setColor(Color。black);  



                                                                                             444 


…………………………………………………………Page 446……………………………………………………………

    display。show(g);  

  }  

  public void processEvent(AWTEvent e) {  

    display。evnt'Display。EVENT'= e。toString();  

    repaint();  

    super。processEvent(e);  

  }  

  public void  

  processponentEvent(ponentEvent e) {  

    switch(e。getID()) {  

      case ponentEvent。PONENT_MOVED:  

        display。evnt'Display。PONENT' =   

          〃ponent moved〃;  

        break;  

      case ponentEvent。PONENT_RESIZED:  

        display。evnt'Display。PONENT' =   

          〃ponent resized〃;  

        break;  

      case ponentEvent。PONENT_HIDDEN:  

        display。evnt'Display。PONENT' =   

          〃ponent hidden〃;  

        break;  

      case ponentEvent。PONENT_SHOWN:  

        display。evnt'Display。PONENT' =   

          〃ponent shown〃;  

        break;  

      default:  

    }  

    repaint();  

    // Must always remember to call the 〃super〃  

    // version of whatever you override:  

    super。processponentEvent(e);  

  }  

  public void processFocusEvent(FocusEvent e) {  

    switch(e。getID()) {  

      case FocusEvent。FOCUS_GAINED:  

        display。evnt'Display。FOCUS' =   

          〃FOCUS gained〃;  

        break;  

      case FocusEvent。FOCUS_LOST:  

        display。evnt'Display。FOCUS' =   

          〃FOCUS lost〃;  

        break;  

      default:  

    }  

    repaint();  

    super。processFocusEvent(e);  

  }  

  public void processKeyEvent(KeyEvent e) {  

    switch(e。getID()) {  

      case KeyEvent。KEY_PRESSED:  

        display。evnt'Display。KEY' =   



                                                                                        445 


…………………………………………………………Page 447……………………………………………………………

          〃KEY pressed: 〃;   

        break;  

      case KeyEvent。KEY_RELEASED:  

        display。evnt'Display。KEY' =   

          〃KEY released: 〃;   

        break;  

      case KeyEvent。KEY_TYPED:  

        display。evnt'Display。KEY' =   

          〃KEY typed: 〃;  

        break;  

      default:  

    }  

    int code = e。getKeyCode();  

    display。evnt'Display。KEY' +=   

      KeyEvent。getKeyText(code);  

    repaint();  

    super。processKeyEvent(e);  

  }  

  public void processMouseEvent(MouseEvent e) {  

    switch(e。getID()) {  

      case MouseEvent。MOUSE_CLICKED:  

        requestFocus(); // Get FOCUS on click  

        display。evnt'Display。MOUSE' =   

          〃MOUSE clicked〃;  

        break;  

      case MouseEvent。MOUSE_PRESSED:  

        display。evnt'Display。MOUSE' =   

          〃MOUSE pressed〃;  

        break;  

      case MouseEvent。MOUSE_RELEASED:  

        display。evnt'Display。MOUSE' =   

          〃MOUSE released〃;  

        break;  

      case MouseEvent。MOUSE_ENTERED:   

        display。evnt'Display。MOUSE' =   

          〃MOUSE entered〃;  

        break;  

      case MouseEvent。MOUSE_EXITED:   

        display。evnt'Display。MOUSE' =   

          〃MOUSE exited〃;  

        break;  

      default:  

    }  

    display。evnt'Display。MOUSE' +=   

      〃; x = 〃 + e。getX() +   

      〃; y = 〃 + e。getY ();  

    repaint();  

    super。processMouseEvent(e);  

  }  

  public void  

  processMouseMotionEvent(MouseEvent e) {  

    switch(e。getID()) {  



                                                                                         446 


…………………………………………………………Page 448……………………………………………………………

      case MouseEvent。MOUSE_DRAGGED:  

        display。evnt'Display。MOUSE_MOVE' =   

          〃MOUSE dragged〃;  

        break ;  

      case MouseEvent。MOUSE_MOVED:  

        display。evnt'Display。MOUSE_MOVE' =   

          〃MOUSE moved〃;  

        break;  

      default:  

    }  

    display。evnt'Display。MOUSE_MOVE' +=   

      〃; x = 〃 + e。getX() +   

      〃; y = 〃 + e。getY();  

    repaint();  

    super。processMouseMotionEvent(e);  

  }  

}  

  

class MyButton extends Button {  

  int clickCounter;  

  String label = 〃〃;  

  public MyButton() {  

    enableEvents(AWTEvent。ACTION_EVENT_MASK);  

  }  

  public void paint(Graphics g) {  

    g。setColor(Color。green);  

    Dimension s = getSize();  

    g。fillRect(0; 0; s。width; s。height);  

    g。setColor(Color。black);  

    g。drawRect(0; 0; s。width 1; s。height 1);  

    drawLabel(g);  

  }  

  private void drawLabel(Graphics g) {  

    FontMetrics fm = g。getFontMetrics();  

    int width = fm。stringWidth(label);  

    int height = fm。getHeight();  

    int ascent = fm。getAscent();  

    int leading = fm。getLeading();  

    int horizMargin =   

      (getSize()。width width)/2;  

    int verMargin =   

      (getSize()。height height)/2;  

    g。setColor(Color。red);  

    g。drawString(label; horizMargin;   

                 verMargin + ascent + leading);  

  }  

  public void processActionEvent(ActionEvent e) {  

    clickCounter++;  

    label = 〃click #〃 + clickCounter +  

      〃 〃 + e。toString();  

    repaint();  

    super。processActionEvent(e);  



                                                                                             447 


…………………………………………………………Page 449……………………………………………………………

  }  

}  

    

public class BadTechnique extends Frame {  

  BadTechnique() {  

    setLayout(new GridLayout(2;2));  

    add(new EnabledPanel(1; Color。cyan));  

    add(new EnabledPanel(2; Color。lightGray));  

    add(new EnabledPanel(3; Color。yellow));  

    // You can also do it for Windows:  

    enableEvents(AWTEvent。WINDOW_EVENT_MASK);  

  }  

  public void processWindowEvent(WindowEvent e) {  

    System。out。println(e);  

    if(e。getID() == WindowEvent。WINDOW_CLOSING) {  

      System。out。println (〃Window Closing〃);  

      System。exit(0);  

    }  

  }  

  public static void main(String'' args) {  

    Frame f = new BadTechnique();  

    f。setTitle(〃Bad Technique〃);  

    f。setSize(700;700);  

    f。setVisible(true);  

  }  

} ///:~  

  

的确,它能够工作。但却实在太蹩脚,而且很难编写、阅读、调试、维护以及再生。既然如此,为什么还不 

使用内部接收器类呢?  



13。17 Java 1。1 用户接口 API   



Java 1。1 版同样增加了一些重要的新功能,包括焦点遍历,桌面色彩访问,打印“沙箱内”及早期的剪贴板 

支持。  

焦点遍历十分的简单,因为它显然存在于AWT 库里的组件并且我们不必为使它工作而去做任何事。如果我们 

制造我们自己组件并且想使它们去处理焦点遍历,我们过载 isFocusTraversable()以使它返回真值。如果我 

们想在一个鼠标单击上捕捉键盘焦点,我们可以捕捉鼠标按下事件并且调用requestFocus()需求焦点方法。  



13。17。1 桌面颜色  



利用桌面颜色,我们可知道当前用户桌面都有哪些颜色选择。这样一来,就可在必要的时候通过自己的程序 

来运用那些颜色。颜色都会得以自动初始化,并置于SystemColor 的static 成员中,所以要做的唯一事情就 

是读取自己感兴趣的成员。各种名字的意义是不言而喻的:desktop,activeCaption,  

activeCaptionText,activeCaptionBorder, inactiveCapt ion, inactiveCaptionText, 

inactiveCaptionBorder, window, windowBorder , windowText, menu,menuText,text, textText,  

textHighlight, textHighlightText ,textInactiveText,control, controlText, controlHighlight, 

controlLtHighlight,controlShadow ,controlDkShadow, scrollbar, info (用于帮助)以及infoText 

 (用于帮助文字)。  



13。17。2 打印  



非常不幸,打印时没有多少事情是可以自动进行的。相反,为完成打印,我们必须经历大量机械的、非 OO 

 (面向对象)的步骤。但打印一个图形化的组件时,可能多少有点儿自动化的意思:默认情况下,print()方 

法会调用paint()来完成自己的工作。大多数时候这都已经足够了,但假如还想做一些特别的事情,就必须 



                                                                                         448 


…………………………………………………………Page 450……………………………………………………………

知道页面的几何尺寸。  

下面这个例子同时演示了文字和图形的打印,以及打印图形时可以采取的不同方法。此外,它也对打印支持 

进行了测试:  

  

//: PrintDemo。java  

// Printing with Java 1。1  

import java。awt。*;  

import java。awt。event。*;  

  

public class PrintDemo extends Frame {  

  Button   

    printText = new Button(〃Print Text〃);  

    printGraphics = new Button(〃Print Graphics〃);  

  TextField ringNum = new TextField(3);  

  Choice faces = new Choice();  

  Graphics g = null;  

  Plot plot = new Plot3(); // Try different plots  

  Toolkit tk = Toolkit。getDefaultToolkit();  

  public PrintDemo() {  

    ringNum。setText(〃3〃);  

    ringNum。addTextListener(new RingL());  

    Panel p = new Panel();  

    p。setLayout(new FlowLayout());  

    printText。addActionListener(new TBL());  

    p。add(printText);  

    p。add(new Label(〃Font:〃));  

    p。add(faces);  

    printGraphics。addActionListener(new GBL());  

    p。add(printGraphics);  

    p。add(new Label(〃Rings:〃));  

    p。add(ringNum);  

    setLayout(new BorderLayout());  

    add(p; BorderLayout。NORTH);  

    add(plot; BorderLayout。CENTER);  

    String'' fontList = tk。getFontList();  

    for(int i = 0; i 《 fontList。length; i++)  

      faces。add(fontList'i');  

    faces。select(〃Serif〃);  

  }  

  class PrintData {  

    public PrintJob pj;  

    public int pageWidth; pageHeight;  

    PrintData(String jobName) {  

      pj = getToolkit()。getPrintJob(  

        PrintDemo。this; jobName; null);  

      if(pj != null) {  

        pageWidth = pj。getPageDimension()。width;  

        pageHeight= pj。getPageDimension()。height;  

        g = pj。getGraphics();  

      }  

    }  

    void end() { pj。end(); }  



                                                                                          449 


…………………………………………………………Page 451……………………………………………………………

  }  

  class ChangeFont {  

    private int stringHeight;  

    ChangeFont(String face; int style;int point){  

      if(g != null) {  

        g。setFont(new Font(face; style; point));  

        stringHeight =   

          g。getFontMetrics()。getHeight();  

      }  

    }  

    int stringWidth(String s) {  

      return g。getFontMetrics()。stringWidth(s);  

    }  

    int stringHeight() { return stringHeight; }  

  }  

  class TBL implements ActionListener {  

    public void actionPerformed(ActionEvent e) {  

      PrintData pd =   

        new PrintData(〃Print Text Test〃);  

      // Null means print job canceled:  

      if (pd == null) return;  

      String s = 〃PrintDemo〃;  

      ChangeFont cf = new ChangeFont(  

        faces。getSelectedItem(); Font。ITALIC;72);  

      g。drawString(s;   

        (pd。pageWidth cf。stringWidth(s)) / 2;  

        (pd。pageHeight cf。stringHeight()) / 3);  

  

      s = 〃A smaller point size〃;  

      cf = new ChangeFont(  

        faces。getSelectedItem(); Font。BOLD; 48);  

      g。drawString(s;   

        (pd。pageWidth cf。stringWidth(s)) / 2;  

        (int)((pd。pageHeight   

           cf。stringHeight())/1。5));  

      g。dispose();  

      pd。end();  

    }  

  }  

  class GBL implements ActionListener {  

    public void actionPerformed(ActionEvent e) {  

      PrintData pd =   

        new PrintData(〃Print Graphics Test〃);  

      if(pd == null) return;  

      plot。print(g);  

      g。dispose();  

      pd。end();  

    }  

  }  

  class RingL implements TextListener {  

    public void textValueChanged(TextEvent e) {  

      int i = 1;  



                                                                                          450 


…………………………………………………………Page 452……………………………………………………………

      try {  

        i = Integer。parseInt(ringNum。getText());  

      } catch(NumberFormatException ex) {  

         i = 1;  

      }  

      plot。rings = i;  

      plot。repaint();  

    }  
返回目录 上一页 下一页 回到顶部 10 9
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!