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); }
java 实现 Terminal
最新推荐文章于 2021-12-24 17:37:58 发布