[Java Swing 大富翁] swing下使用JPanel 模拟 按钮实现。

按钮点击需要让jpanel实现鼠标点击事件。跟随着效果的切换,即可实现按钮的效果。

举个例子:

有一个"购买"按钮,images如下

normal: 

mouseOver:

disabled:

pressed:

代码如下:

public class ShopButton extends JPanel implements MouseListener {

    private Shop shopUI;

    private Image[] img;

    private Image normalImage;
    private Image rolloverImage;
    private Image pressedImage;
    private Image disabledImage;

    private Image currentImage;

    private boolean enabled = true;

    private String name = null;

    private Control control;

    public ShopButton(Shop shopUI,String name, int x, int y,Control control) {
        this.shopUI = shopUI;
        this.name = name;//设置名称
        this.control = control;
        this.img = this.shopUI.createCardImg(name);//这里就是使用工厂模式获取img资源
        this.normalImage = this.img[0];
        this.rolloverImage = this.img[1];
        this.pressedImage =this.img[2];
        this.disabledImage = this.img[3];
        this.currentImage = normalImage;
        this.setBounds(x, y, this.img[0].getWidth(null), this.img[0].getHeight(null));
        this.addMouseListener(this);
    }

    public boolean isEnabled() {
        return enabled;
    }

    public void setEnabled(boolean enabled) {
        this.enabled = enabled;
    }

    public void paint(Graphics g) {
        this.setOpaque(false); // 背景透明
        if (enabled){
            g.drawImage(currentImage, this.getX(), this.getY(), this.getWidth(),
                    this.getHeight(), this);
        } else if (!(name.equals("buy") || name.equals("cancel"))){
            g.drawImage(disabledImage, this.getX(), this.getY(), this.getWidth(),
                    this.getHeight(), this);
        }
    }

    @Override
    public void mouseClicked(MouseEvent e) {

    }

    @Override
    public void mousePressed(MouseEvent e) {
            currentImage = pressedImage;
            if(enabled){
                if (this.name.equals("close")){//退出商店
                    this.shopUI.moveToBack();
                    this.control.exitShop();
                } else if (this.name.equals("cancel")){//取消当前选择
                    this.shopUI.setChooseCard(null);
                } else if (this.name.equals("buy")){//购买当前选择
                    this.control.buyCard(this.shopUI.getShop());
                } else {
                    this.shopUI.setChooseCard(this);
                }
            }
    }

    @Override
    public void mouseReleased(MouseEvent e) {
            currentImage = rolloverImage;
    }

    @Override
    public void mouseEntered(MouseEvent e) {
            currentImage = rolloverImage;
    }

    @Override
    public void mouseExited(MouseEvent e) {
            currentImage = normalImage;
    }
}

适当的扩展可以做成通用类,能够模拟各类按钮类。

以下是 mini大富翁内的商店界面:红框内是扩展实现

时间: 2024-08-30 16:03:12

[Java Swing 大富翁] swing下使用JPanel 模拟 按钮实现。的相关文章

Java实验--基于Swing的简单的歌曲信息管理系统(四)

原创不易,转载请注明出处. 上一篇<Java实验--基于Swing的简单的歌曲信息管理系统(三) >中,我们绘制了登录.注册和管理员主界面,本片主要讲解歌曲管理界面.第一次涉及到对表格的操作,参见的教材上的代码,具体代码如下: package test.swing; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.

java基础学习——Swing图形化用户界面编程

原文链接:https://blog.csdn.net/yiziweiyang/article/details/52317240 链接有详细解释,也有例子,以下是个人参照例子实验的代码. package gui; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.a

Swing 将显示好的JPanel保存为一张图片

在JFrame中添加如下代码 //自己的JPanel DrawPanel drawPanel = new DrawPanel(list, width, height, start, end); // 必须要有大小 drawPanel.setSize(width, height); BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics2D g2 = image.cre

JAVA 图形界面swing 创建按钮、文本域

package org.rui.swin; import java.awt.FlowLayout; import javax.swing.JButton; import javax.swing.JFrame; import org.rui.utils.SwingConsole; public class Button1 extends JFrame{ private JButton button1=new JButton("button1"), button2=new JButton(

Swing窗口Linux下不支持最大化问题

Swing窗口Linux下不支持最大化问题 摘自:https://www.linuxidc.com/Linux/2009-06/20519.htm [日期:2009-06-17] 来源:www.quanlei.com  作者:quanlei [字体:大 中 小] 由于最近一直在Linux下工作,今天遇到了Swing窗口不能最大化的问题,刚开始始终不得其解,最后在同事Windows平台下测试才发现原来是我用Linux的原因. 我们设置Swing窗口最大化一般有三种方法 方法一:JFrame fra

java GUI编程(swing)之一 swing简单介绍

swing 是由sun公司开发的一个gui框架,一开始sun是开发了awt框架.但是awt框架 存在lcd问题.因此sun在awt的基础上继续开发出了swing. swing是继承了awt的类 swing 常用组件: text 文本组件 menus 菜单组件 widgets 小控件组件 top-level-windows顶层窗口管理 sub-windows 子窗口 原文地址:https://www.cnblogs.com/SunshineLittleCat/p/8279905.html

第12章-Swing编程 --- Swing概述

(一)Swing概述 将Swing组件按功能来分: ->顶层容器: JFrame.JApplet.JDialog和JWindow ->中间容器: JPanel.JScrollPane.JSplitPane.JToolBar等 ->特殊容器:在用户界面上具有特殊作用的中间容器,如JInternalFrame.JRootPane.JLayeredPane和JDestopPane等 ->基本组件:实现人机交互的组件,如JButton.JComboBox.JList.JMenu.JSlid

第12章-Swing编程 --- Swing中的特殊容器--JSplitPane

(一)使用JSplitPane JSplitPane用于创建一个分割板,它可以将一个组件(通常是一个容器)分割成两个部分,并提供一个分割条.用户可以拖动该分隔条来调整两个部分的大小.分隔面板的实质是一个特殊容器,该容器只能容纳两个组件,而且分割面板又分为上下分割.左右分割两种情形. 创建分割面板的代码如下: new JSplitPane(方向,左/上组件,右/下组件); JSplitPane分割面板提供了如下几个方法: (1)setDividerLocation(double proportio

Java应用集群下的定时任务处理方案(mysql)

今天来说一个Java多机部署下定时任务的处理方案. 需求: 有两台服务器同时部署了同一套代码, 代码中写有spring自带的定时任务,但是每次执行定时任务时只需要一台机器去执行. 当拿到这个需求时我脑子中立马出现了两个简单的解决方案: 利用ip进行判断, 两台机器ip肯定不一样, 指定某一台机器的ip运行. 只在一台机器上部署定时任务的代码. 最后两个方案又都被自己否决了. 第一条,如果指定ip的机器出现了问题怎么办? 例如说宕机了, 那么该制定ip的机器上的定时任务是不是就无法运行了?如果以后