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);
}
java 实现 Terminal
最新推荐文章于 2025-02-06 17:57:25 发布
这是一个使用Java实现的简单终端模拟器程序,它通过继承JFrame并实现了NotifyKeyListener接口来响应键盘输入事件。该程序还包含了一个名为MyDisplay的自定义面板组件,能够显示输入的字符并支持基本的光标移动。

921

被折叠的 条评论
为什么被折叠?



