java 實現 Terminal

來源:互聯網
上載者:User
  import java.awt.*;import javax.swing.*;import java.awt.event.*;import java.awt.font.TextHitInfo;import java.awt.im.InputMethodRequests;import java.text.AttributedCharacterIterator;import java.text.AttributedCharacterIterator.Attribute;import java.util.ArrayList;import java.util.List;public class TestTerminal extends JFrame implements NotifyKeyListener{  private MyDisplay disp = null; private DataModel dm = null;  public TestTerminal(){  this.setSize(300, 200);  this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);  this.setContentPane(getJContentPane());  this.setTitle("JFrame");  this.setVisible(true); }  private JPanel getJContentPane() {    JPanel jContentPane = null;    if (jContentPane == null) {   jContentPane = new JPanel();   jContentPane.setLayout(new BorderLayout());      dm = new DataModel();   disp = new MyDisplay(dm);   disp.setNotifyKeyListener(this);      jContentPane.add(new JScrollPane(disp), BorderLayout.CENTER);  }  return jContentPane; }   public static void main(String args[]){  new TestTerminal();   }  public void notify(KeyEvent e) {     try{        int c = e.getKeyChar();    if(c==7){     Toolkit.getDefaultToolkit().beep();     return;    }        if(c==8){     dm.setCursorCol(dm.getCursorCol()-1);     disp.repaint();     return;    }        if(c==13){     return;    }        if(c==10){     dm.setCursorRow(dm.getCursorRow()+1);     dm.setCursorCol(0);     dm.addNewLine(dm.getCursorRow());     disp.updateScrollbar("Down");     disp.repaint();     return;    }    dm.writeChar((char)c);    dm.setCursorCol(dm.getCursorCol()+1);    disp.repaint();   }catch(Exception dx){    dx.printStackTrace();   }   } }class MyDisplay extends JPanel implements KeyListener,AdjustmentListener,ComponentListener,InputMethodListener, InputMethodRequests ,Scrollable{ private static final long serialVersionUID = 1L; private DataModel dm = null;  private JScrollBar scrollbar = new JScrollBar(JScrollBar.VERTICAL);  private Color fcolor = Color.white; private Color bcolor = Color.black;  private int topValue = 0;  private boolean isDiaplayInputKey = false; private NotifyKeyListener  keylistnerer = null; public MyDisplay(DataModel dm){    this.dm = dm;    this.setFocusable(true);  this.addKeyListener(this);  this.setLayout(new BorderLayout());  this.addComponentListener(this);    this.add(scrollbar,BorderLayout.EAST);    scrollbar.addAdjustmentListener(this);      enableInputMethods(true);  addInputMethodListener(this);   } public InputMethodRequests getInputMethodRequests() {        return this;    }  public void setNotifyKeyListener(NotifyKeyListener listener){  this.keylistnerer = listener; }  public void keyPressed(KeyEvent e) {    if(isDiaplayInputKey == false){      this.keylistnerer.notify(e);   return;  }    switch(e.getKeyCode()){     case KeyEvent.VK_BACK_SPACE:   if(dm.getCursorCol()==0){    Toolkit.getDefaultToolkit().beep();    return;   }   dm.setCursorCol(dm.getCursorCol()-1);   dm.deleteChar(dm.getCursorRow(), dm.getCursorCol());      break;     case KeyEvent.VK_ENTER:   dm.setCursorRow(dm.getCursorRow()+1);   dm.setCursorCol(0);   dm.addNewLine(dm.getCursorRow());   this.updateScrollbar("Down");   break;     case KeyEvent.VK_LEFT:   if(dm.getCursorCol()==0){    Toolkit.getDefaultToolkit().beep();    return;   }   dm.setCursorCol(dm.getCursorCol()-1);   break;  case KeyEvent.VK_RIGHT:   if(dm.getCursorCol()==dm.rowLength(dm.getCursorRow())){    Toolkit.getDefaultToolkit().beep();    return;   }   dm.setCursorCol(dm.getCursorCol()+1);   break;     case KeyEvent.VK_UP:   if(dm.getCursorRow()==0){    Toolkit.getDefaultToolkit().beep();    return;   }   dm.setCursorRow(dm.getCursorRow()-1);   if(dm.getCursorCol()>dm.rowLength(dm.getCursorRow())){    dm.setCursorCol(dm.rowLength(dm.getCursorRow()));   }   this.updateScrollbar("Up");      break;     case KeyEvent.VK_DOWN:   if(dm.getCursorRow()==dm.rowSize()-1){    Toolkit.getDefaultToolkit().beep();    return;   }   dm.setCursorRow(dm.getCursorRow()+1);   if(dm.getCursorCol()>dm.rowLength(dm.getCursorRow())){    dm.setCursorCol(dm.rowLength(dm.getCursorRow()));   }   this.updateScrollbar("Down");   break;     case KeyEvent.VK_HOME:   dm.setCursorCol(0);   break;  case KeyEvent.VK_END:   dm.setCursorCol(dm.rowLength(dm.getCursorRow()));   break;     case KeyEvent.VK_DELETE:   if(dm.getCursorCol()==dm.rowLength(dm.getCursorRow())){    Toolkit.getDefaultToolkit().beep();    return;   }   dm.deleteChar(dm.getCursorRow(), dm.getCursorCol());   break;     case KeyEvent.VK_F1:  case KeyEvent.VK_F2:  case KeyEvent.VK_F3:  case KeyEvent.VK_F4:  case KeyEvent.VK_F5:  case KeyEvent.VK_F6:  case KeyEvent.VK_F7:  case KeyEvent.VK_F8:  case KeyEvent.VK_F9:  case KeyEvent.VK_F10:  case KeyEvent.VK_F11:  case KeyEvent.VK_F12:  case KeyEvent.VK_TAB:  case KeyEvent.VK_ESCAPE:  case KeyEvent.VK_PAGE_UP:  case KeyEvent.VK_PAGE_DOWN:  case KeyEvent.VK_SHIFT:  case KeyEvent.VK_CAPS_LOCK:   break;     default:   dm.insertChar(e.getKeyChar());   dm.setCursorCol(dm.getCursorCol()+1);  }  this.updateUI(); }  public void paintComponent(Graphics g) {  g.setColor(bcolor);  g.fillRect(0, 0, this.getWidth(),this.getHeight());        g.setColor(fcolor);  FontMetrics fm = this.getGraphics().getFontMetrics();  int offsety = fm.charWidth('黃');    for(int row=0;rowthis.getHeight()){   scrollbar.setEnabled(true);  }else{   scrollbar.setEnabled(false);  }    scrollbar.setMinimum(0);  scrollbar.setMaximum(dm.rowSize()-newrows);    if(org!=null && org.equals("Down")){   if(dm.getCursorRow()>=(this.getHeight() / fm.getHeight())){    scrollbar.setValue(scrollbar.getValue()+1);   }  }  if(org!=null && org.equals("Up")){   if(dm.getCursorRow()this.cursorCol){   sb.deleteCharAt(this.cursorCol);  }  sb.insert(this.cursorCol, c); }  public void insertChar(char c){  if(lines.size()==this.cursorRow){   lines.add(new StringBuffer());  }  StringBuffer sb = (StringBuffer)lines.get(this.cursorRow);  sb.insert(this.cursorCol, c); }   public void addNewLine(int row){  this.lines.add(row,new StringBuffer()); }   public void deleteChar(int row,int col){  StringBuffer sb = (StringBuffer)lines.get(row);  sb.deleteCharAt(col); }  public int rowSize(){  return lines.size(); }  public int rowLength(int row){  return ((StringBuffer)lines.get(row)).length(); }}interface NotifyKeyListener{ public void notify(KeyEvent e);}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.