为解决java JFrame边框老土问题

问题一:为解决java JFrame边框老土问题;

开始查找资料,首先找到的是一个IBM专家,也是SUNONE之一,他重写了JFrame类得到IFrameJar包,但是其效果还是不是特别理想;

自己思考,其实自己可以把JFrame的边框去掉,自己在重写一个JPanel,然后把标题框当做组件,并且重绘背景,就可以得到和QQ游戏相似的界面。

问题二:这就涉及到窗体操作问题,比如如何关闭窗口,缩小窗口。

通过查JavaAPI的源代码,发现我们通常设置的默认关闭行为,其实SUN是这样实现的。

 

if (e.getID() == WindowEvent.WINDOW_CLOSING) {

            switch(defaultCloseOperation) {

              case HIDE_ON_CLOSE:

                 setVisible(false);

                 break;

              case DISPOSE_ON_CLOSE:

                 dispose();

                 break;

              case DO_NOTHING_ON_CLOSE:

                 default:

                 break;

               case EXIT_ON_CLOSE:

                  // This needs to match the checkExit call in

                  // setDefaultCloseOperation

                   System.exit(0);

                   break;

            }

也就是说我们通常设置的默认关闭行为EXIT_ON_CLOSE,其实就是简单的调用系统的System.exit(0);窗体关闭问题解决。

 

至于窗口拖动等,网上找到下面一篇日志:

在使用Jframe的时候,普遍都会有标题栏,还有最小化,最大化,关闭按纽的,还要实现拖动窗体的功能。

这样的话,对我们实现自定义样式的窗体是很有影响的,

1)     要去掉标题栏:

jFrame.setUndecorated(true);

// 这样就可以去掉Jframe中对window的装饰了,

 

2)     去掉标题栏,我们就有可能要给程序写代码提供最小化,最大化,关闭的操作,如何实现?

只要给按纽添加MouseListener,

mouseClick中的调用

 

jFrame.setExtendedState(jFrame.ICONIFIED); //最小化

 

if(jFrame.getExtendedState() != jFrame.MAXIMIZED_BOTH)

jFrame.setExtendedState(jFrame.MAXIMIZED_BOTH);

else

jFrame.setExtendedState(jFrame.NORMAL);

// 最大化或正常状态

 

System.exit(0);

// 关闭,退出程序

 

3)     要拖动窗体的功能:

只要给窗体中的某个组件添加如下代码就行了:

 

Point loc = null;

    Point tmp = null;

    boolean isDragged = false;

    private void setDragable() {

        this.addMouseListener(new java.awt.event.MouseAdapter() {

            public void mouseReleased(java.awt.event.MouseEvent e) {

               isDragged = false;

               jFrame.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));

            }

            public void mousePressed(java.awt.event.MouseEvent e) {

               tmp = new Point(e.getX(), e.getY());

               isDragged = true;

               jFrame.setCursor(new Cursor(Cursor.MOVE_CURSOR));

            }

        });

        this.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {

            public void mouseDragged(java.awt.event.MouseEvent e) {

               if(isDragged) {

                   loc = new Point(jFrame.getLocation().x + e.getX() - tmp.x,

                     jFrame.getLocation().y + e.getY() - tmp.y);

                   jFrame.setLocation(loc);

               }

            }

        });

 }

  在初始化该组件的时候调用 setDragable() 就可以使组件具体拖放窗体的功能了。因为可能有

背景图,可能会重写paint方法,不能在paint方法中调用setDragable()

 

问题四:当我们在试图在JPanel上添加JPanel时,上面的JPanel由于其背景会覆盖下面一层的JPanel

解决方法,设置上一层面板的背景为透明; setOpaque(false);

问题五:找棋子图片,因为希望不遮挡方形区域。

PNG格式棋子

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值