java 实现 Terminal

  
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;row
 
 
  
  this.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);
}


  
  
 
 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值