java的栈图形演示

简介:

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
/*
指示发生了组件定义的动作的语义事件。当特定于组件的动作(比如被按下)发生时,由组件(比如 Button)生成此高级别事件。
事件被传递给每一个 ActionListener 对象,这些对象是使用组件的 addActionListener 方法注册的,用以接收这类事件。 
所以在给TextField类添加 ActionListener 类型的监听器时就会失败!

****下面还有XXXListener和XXXAdapter的用法,相信你会喜欢上XXXAdapter的用法
*/
public class stackDemo extends MouseAdapter{
   JFrame fr=new JFrame("StackDemo");//对话框
   JPanel pan= new JPanel();//菜单面板
   JPanel panStack = new JPanel();
   JButton pushBtn, popBtn, peekBtn;
   JTextField tf= new JTextField("整数", 4);
   JButton stackBtn[]= new JButton[10];
   
   JPanel panStackPointerLabel= new JPanel();
   JLabel stackPointerLabel = new JLabel("<-top");

   JPanel panRet= new JPanel();   
   JTextField tfRet= new JTextField("操作结果!");

   int top;
   
   public stackDemo(){
      fr.setSize(420,500);
      fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      fr.setLayout(new FlowLayout(FlowLayout.CENTER, 10, 10));

      pan.setPreferredSize(new Dimension(400, 50));
      pan.setLayout(new FlowLayout(FlowLayout.CENTER, 10, 10));
      panStack.setPreferredSize(new Dimension(80, 350));//设置栈面板大小
      panStack.setBackground(Color.yellow);
      pan.setBackground(Color.blue);
      pan.add(new JLabel("操作菜单:"));
      pan.add(pushBtn=new JButton("进栈"));
      pushBtn.addMouseListener(new pushAction());
      pan.add(popBtn=new JButton("出栈"));
      popBtn.addMouseListener(new popAction());
      pan.add(peekBtn=new JButton("栈顶元素"));
      
      tf.addMouseListener(this);
      pan.add(tf);
          
      for(int i=0; i<10; ++i){
         stackBtn[i]=new JButton("   ");
         panStack.add(stackBtn[i]);
      }
      fr.add(pan);
      fr.add(panStack);
      panStackPointerLabel.setLayout(null);
      panStackPointerLabel.setPreferredSize(new Dimension(80, 350));//设置指针面板的大小
      panStackPointerLabel.setBackground(Color.LIGHT_GRAY);
      stackPointerLabel.setFont(new Font("华文行楷", Font.BOLD, 20));
      panStackPointerLabel.add(stackPointerLabel);

      fr.add(panStackPointerLabel);
      panRet.setLayout(new FlowLayout(FlowLayout.LEFT));
      panRet.setBackground(Color.red);
      panRet.setPreferredSize(new Dimension(400, 50));
      
      tfRet.setEditable(false);//不能不编辑
      panRet.add(tfRet);//操作结果面板
      fr.add(panRet);
      fr.setVisible(true);
      stackPointerLabel.setBounds(0, stackBtn[9].getLocation().y, 50, 50);//设置栈顶指针位置
      top=9;
   }

   public void mouseClicked(MouseEvent e){
       tf.selectAll();//鼠标单击时选中全部文本
   }
   
   //push 按钮监听器
   class pushAction implements MouseListener{
       public void mouseClicked(MouseEvent e){
          String text;
          
          if((text=tf.getText())!="   "){
              for(int i=0; i<text.length(); ++i)
                 if(!Character.isDigit(text.charAt(i)))
                    return ;
          }
          if(top<0){
             tfRet.setText("栈顶溢出!");
             return ;
          }
          Point pt=stackBtn[top].getLocation();
          stackBtn[top].setText(text);
          tfRet.setText("进栈值" + text);
          stackPointerLabel.setBounds(0, pt.y, 50, 50);
          --top;
       }
      public void mouseDragged(MouseEvent e){}
      public void mouseEntered(MouseEvent e){}
      public void mouseExited(MouseEvent e){}
      public void mouseMoved(MouseEvent e){}
      public void mouseReleased(MouseEvent e){}
      public void mousePressed(MouseEvent e){}
   }

   //pop按钮监听器
   class popAction extends MouseAdapter{
       public void mouseClicked(MouseEvent e){
          String text;
          if(top>=9){
            tfRet.setText("栈底溢出!");
            return ;
          }
          ++top;
          Point pt=stackBtn[top].getLocation();
          text=stackBtn[top].getText();
          tfRet.setText("出栈值" + text);
          stackBtn[top].setText("   ");
          stackPointerLabel.setBounds(0, pt.y, 50, 50);
       }
   }
   
   public static void main(String args[]){
      stackDemo mySstackDemo = new stackDemo();
   }
}

目录
相关文章
|
4月前
|
存储 算法 Java
惊!Java程序员必看:JVM调优揭秘,堆溢出、栈溢出如何巧妙化解?
【8月更文挑战第29天】在Java领域,JVM是代码运行的基础,但需适当调优以发挥最佳性能。本文探讨了JVM中常见的堆溢出和栈溢出问题及其解决方法。堆溢出发生在堆空间不足时,可通过增加堆空间、优化代码及释放对象解决;栈溢出则因递归调用过深或线程过多引起,调整栈大小、优化算法和使用线程池可有效应对。通过合理配置和调优JVM,可确保Java应用稳定高效运行。
145 4
|
12天前
|
存储 算法 Java
Java 内存管理与优化:掌控堆与栈,雕琢高效代码
Java内存管理与优化是提升程序性能的关键。掌握堆与栈的运作机制,学习如何有效管理内存资源,雕琢出更加高效的代码,是每个Java开发者必备的技能。
41 5
|
1月前
|
存储 算法 Java
🧠Java零基础 - Java栈(Stack)详解
【10月更文挑战第17天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
30 2
|
5月前
|
存储 算法 Java
Java面试题:深入探究Java内存模型与垃圾回收机制,解释JVM中堆内存和栈内存的主要区别,谈谈对Java垃圾回收机制的理解,Java中的内存泄漏及其产生原因,如何检测和解决内存泄漏问题
Java面试题:深入探究Java内存模型与垃圾回收机制,解释JVM中堆内存和栈内存的主要区别,谈谈对Java垃圾回收机制的理解,Java中的内存泄漏及其产生原因,如何检测和解决内存泄漏问题
70 0
|
2月前
|
存储 安全 Java
【用Java学习数据结构系列】探索栈和队列的无尽秘密
【用Java学习数据结构系列】探索栈和队列的无尽秘密
33 2
|
4月前
|
Java 索引
java中的栈(利用数组实现栈)
这篇文章通过Java代码示例介绍了如何使用数组实现栈操作,包括栈的初始化、入栈、出栈、判断栈满和空以及遍历栈的方法。
java中的栈(利用数组实现栈)
|
5月前
|
Java 运维
开发与运维命令问题之使用jstack命令查看Java进程的线程栈如何解决
开发与运维命令问题之使用jstack命令查看Java进程的线程栈如何解决
69 2
|
5月前
|
存储 安全 Java
Java面试题:在JVM中,堆和栈有什么区别?请详细解释说明,要深入到底层知识
Java面试题:在JVM中,堆和栈有什么区别?请详细解释说明,要深入到底层知识
91 3
|
5月前
|
存储 缓存 监控
Java面试题:解释堆和栈的OutOfMemoryError通常在什么情况下会发生
Java面试题:解释堆和栈的OutOfMemoryError通常在什么情况下会发生
49 3
|
5月前
|
存储 Java
深入理解Java中的堆内存与栈内存分配
深入理解Java中的堆内存与栈内存分配