一、背景分析
运用java的基本组件JFrame、JPanel和JButton配置模块,图形界面的变化及显示派生于JPanel的CirclePanel类,用于专门提供变化和显示的方法,按键设置监听模块派生于KeyAdapter的KeyListener类。
界面展示如下图:
按键意义:左侧主键盘区,点击按键E使左方圆半径增大,点击按键S使右方圆半径减小;右侧小键盘区,点击向上键使右方圆半径增大,点击向下键使左方圆半径减小。
二、代码实现
import java.awt.*;
import java.awt.event.*;
import javax.swing.*; //包含头文件
public class ControlCircle extends JFrame{ //定义类ControlCircle,并继承于JFrame
protected JButton start;
protected CirclePanel cpnl1;
protected CirclePanel cpnl2;
public ControlCircle(){ //参数表为空的构造方法
start=new JButton("Start(Left E:enlarge,S:shrink ; Right ↑:enlarge,↓:shrink)");
cpnl1 = new CirclePanel();
cpnl2 = new CirclePanel();
JPanel pnl = new JPanel();
pnl.add(start); //将JButton放入JPanel容器中
JPanel temp=new JPanel(new GridLayout(1,2));
temp.add(cpnl1);
temp.add(cpnl2); //分别将两个圆圈放入JPanel容器中
this.add( pnl, BorderLayout.SOUTH );
this.add( temp, BorderLayout.CENTER );
start.addKeyListener( new keyListener() ); //调用键盘监听器方法
}
public void getUsername(){
cpnl1.getUsername("left");
cpnl2.getUsername("right");
}
class keyListener extends KeyAdapter{ //内部类,继承于KeyAdapter,对监听器进行设置
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_E) { //方法对监听到的事件进行处理
cpnl1.enlarge();
System.out.println("circle1 enlarge");
}
else if(e.getKeyCode() == KeyEvent.VK_S){
cpnl2.shrink();
System.out.println("circle2 shrink"); //方便查看运行结果
}
else if(e.getKeyCode() == KeyEvent.VK_UP){
cpnl2.enlarge();
System.out.println("circle2 enlarge");
}
else if(e.getKeyCode() == KeyEvent.VK_DOWN){
cpnl1.shrink();
System.out.println("circle1 shrink");
}
if(cpnl1.judge()){ //设置对两个圆的半径进行判断,使得程序结束
JOptionPane.showMessageDialog(start,cpnl1.userName+" is winner");
System.exit(0);
}
else if(cpnl2.judge()){
JOptionPane.showMessageDialog(start,cpnl2.userName+" is winner");
System.exit(0);
}
}
}
class CirclePanel extends JPanel{ //内部类,实现对两个圆圈的展示和半径控制
public String userName;
private int radius = 1;
protected void paintComponent( Graphics g ){
super.paintComponent( g );
g.drawOval( getWidth() / 2 - radius, getHeight() / 2 - radius, 2 * radius, 2 * radius );
}
public void enlarge(){
radius++;
repaint();
}
public void shrink(){
if( radius > 0 )
radius--;
repaint();
}
public void getUsername(String loc){
userName=JOptionPane.showInputDialog("Enter the "+loc+" circle's userName:");
}
public boolean judge(){
if(radius>=50){return true;}
return false;
}
}
public static void main( String[] args ){ //主函数,实例化对象frame
JFrame frame = new ControlCircle();
frame.setTitle( "ControlCircleClient" );
frame.setSize( 400, 300 );
frame.setLocationRelativeTo( null );
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
frame.setVisible( true );
((ControlCircle)frame).getUsername();
}
}
当KeyListener监听到按键事件KeyEvent.VK_E,调用cpnl1的enlarge()方法;监听到按键事件KeyEvent.VK_S,调用cpnl2的shrink()方法;up和down键盘区同理。
每次KeyListener被触发,都要调用两个圆形的judge()方法,用于判断是否有圆达成判断条件。若if成立,则执行System.exit(0);,并弹出提示对话框。
三、程序运行测试
四、总结
关于Java的图形用户界面,首先要了解两个包AWT和Swing,最为重要的是掌握包中的多种组件,其次是掌握容器与组件的关系,所有的组件必须包含在某个容器中,最后通过各个组件的不同特点完成布局。