皮皮网
皮皮网

【jsp 签到系统源码】【redox 源码分析】【树枝计费源码】swing框架源码_swing 框架

来源:跑风麻将源码 发表时间:2024-12-27 19:33:40

1.如何用SwingBuilder使用自定义的swing组件
2.java课程设计源代码(急!框框架!架源!框框架!架源)
3.求一个简单又有趣的框框架JAVA小游戏代码

swing框架源码_swing 框架

如何用SwingBuilder使用自定义的swing组件

       groovy已经在SwingBuilder里为我们预设了很多swing组件,以使我们可以用下面这样的快捷形式来构建界面:

       swingBuilder.frame(

       //属性集

       ){

       //子组件

       }

       å¯¹äºŽä»…仅使用swing的原生组件,这没有任何问题,但在实际开发中可能会遇到需要使用对原生组件扩展后的自定义组件(如一个继承了JPanel的MyPanel类)的情况,而这个类明显不可能出现在SwingBuilder的预设列表里,那这种情况下是不是就意味着不可以使用groovy为我们提供的便利,只能用回传统的java形式去构建界面呢?

       ç­”案是否定的。SwingBuilder虽然不会预设用户自定义的组件,但它提供了几个接口可以让用户把自定义的组件设置进去,这样就依然可以用groovy的快捷形式来构建界面了。这几个接口分别是:

       public void registerFactory(String name, Factory factory)

       public void registerBeanFactory(String theName, Class beanClass)

       registerFactory()

       registerFactory方法可以注册一个自定义组件,name指定了通过swingBuilder构建组件的名称,如JFrame在swingBuilder里预设的name是"frame",这就使得我们可以通过swingBuilder.frame()构建一个JFrame。

       ç¬¬äºŒä¸ªå‚数接收一个实现了Factory接口的类,这个类需指明(实现)如何实例化自定义组件(newInstance),如何处理add进来的子组件(setChild)等一系列策略。通常并不需要直接实现Factory接口,groovy为我们提供了一个抽象类(AbstractFactory),我们应优先继承这个类,然后再按需挑相应的方法进行重写。下面来看一个如何使用这个接口的例子:

       /

**

       * 自定义了一个可以显示背景图片的面板

       * @author keenlight

       

*

       */

       class ImagePanel extends JPanel{

       /

**

       

*

       */

       private static final long serialVersionUID = 1L

       private BufferedImage image

       public ImagePanel(BufferedImage image){

       super()

       this.image = image

       }

       public ImagePanel(BufferedImage image, LayoutManager layout) {

       super(layout)

       this.image = image

       }

       public void paintComponent(Graphics g)

       {

       super.paintComponent(g)

       if(image != null){

       g.drawImage(image, 0, 0, this)

       }

       }

       }

       /

**

       * ImagePanel的Factory

       * @author keenlight

       */

       class ImagePanelFactory extends AbstractFactory{

       private BufferedImage image

       ImagePanelFactory(BufferedImage image){

       this.image = image

       }

       @Override

       public Object newInstance(FactoryBuilderSupport builder, Object name, Object value, Map properties) throws InstantiationException, IllegalAccessException {

       def layout = properties.remove("layout")

       new ImagePanel(image, layout)

       }

       public void setChild(FactoryBuilderSupport builder, Object parent, Object child) {

       if (!(child instanceof Component) || (child instanceof Window)) {

       return

       }

       parent = parent as ImagePanel

       try {

       def constraints = builder.context.constraints

       if (constraints != null) {

       parent.add(child, constraints)

       if (child instanceof JComponent) {

       child.putClientProperty(LayoutFactory.DEFAULT_DELEGATE_PROPERTY_CONSTRAINT, constraints)

       }

       builder.context.remove('constraints')

       } else {

       parent.add(child)

       }

       } catch (MissingPropertyException mpe) {

       parent.add(child)

       }

       }

       }

       å®šä¹‰å¥½è¿™äº›ç±»åŽå¦‚何使其生效?只需一步:

       def bgImage = ImageIO.read(new File(image_path))

       swingBuilder.registerFactory("imagePanel", new ImagePanelFactory(bgImage))

       æ³¨å†Œå¥½ä¹‹åŽï¼ŒImagePanel组件便可像其他原生组件一样使用了(如上文的JFrame一样)。

       registerBeanFactory()

       registerBeanFactory是registerFactory的一种便利形式,调用此接口无需提供Factory,只需提供自定义类的类名即可。比如原生组件里的JPanel就是用这个接口注册的,SwingBuilder类中注册JPanel的源码如下:

       registerBeanFactory("panel", JPanel)

       è¿™æ ·å°±å¯ä»¥æŠŠJPanel注册为"panel"来使用了。其实registerBeanFactory这个方法里面一样也实例化了一个继承了AbstractFactory类,它会把调用这个方法注册的组件当做一个javaBean(方法名已经很明显了),所以它在继承AbstractFactory类时重写的newInstance方法里是直接返回调用class.newInstance()的实例化结果,class由第二个入参提供。所以对于那些在实例化时调用默认构造器就足够的组件,用registerBeanFactory()方法来注册会更为便利。当然,对于我上面定义的ImagePanel来说就不行了,因为ImagePanel类在实例化时需要接受一个图片对象,所以必须使用略麻烦一点的registerFactory()。

java课程设计源代码(急!!架源jsp 签到系统源码!框框架!架源)

       import java.awt.Color;

       import java.awt.Font;

       import java.awt.event.ActionEvent;

       import java.awt.event.ActionListener;

       import javax.swing.JButton;

       import javax.swing.JFrame;

       import javax.swing.JLabel;

       import javax.swing.JOptionPane;

       import javax.swing.SwingConstants;

       import javax.swing.border.LineBorder;

       public class game extends JFrame {

        private JLabel label_2;

        private int number;

        private int sum;

        final JLabel label = new JLabel();

        final JLabel label_1 = new JLabel();

        public static void main(String[] args) {

        new game();

        }

        public game() {

        super("点?!框框架");

        getContentPane().setLayout(null);

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        final JButton button = new JButton();

        button.addActionListener(new ActionListener() {

        public void actionPerformed(final ActionEvent arg0) {

        onClick();

        }

        });

        button.setText("出牌");

        button.setBounds(,架源 , , );

        getContentPane().add(button);

        label.setBorder(new LineBorder(Color.black, 1, false));

        label.setHorizontalAlignment(SwingConstants.CENTER);

        label.setFont(new Font("", Font.BOLD, ));

        label.setText("背面");

        label.setBounds(, , , );

        getContentPane().add(label);

        label_1.setText("你已经拥有的牌:");

        label_1.setBounds(, , , );

        getContentPane().add(label_1);

        this.setBounds(, , , );

        this.setVisible(true);

        getContentPane().add(getLabel_2());

        }

        public int randNumber() {

        try {

        Thread.sleep();

        } catch (InterruptedException e) {

        e.printStackTrace();

        }

        return (int) (Math.random() * + 1);

        }

        public void onClick() {

        number = this.randNumber();

        this.sum += number;

        label.setText("" + number);

        String strTemp = this.label_1.getText();

        strTemp += "" + number + " ";

        label_1.setText(strTemp);

        String temp = "合计:" + sum;

        label_2.setText(temp);

        isWin();

        }

        public void isWin() {

        if (sum > ) {

        JOptionPane.showMessageDialog(this, "你输了");

        clear();

        return;

        } else if (sum == ) {

        JOptionPane.showMessageDialog(this, "你赢了");

        clear();

        return;

        } else {

        int i = JOptionPane.showOptionDialog(this, "是否继续?", "提示",

        JOptionPane.OK_CANCEL_OPTION,

        JOptionPane.INFORMATION_MESSAGE, null, null, null);

        if (i == JOptionPane.OK_OPTION) {

        onClick();

        } else

        return;

        }

        }

        private void clear() {

        label_2.setText("合计:");

        sum = 0;

        number = 0;

        label_1.setText("你已经拥有的牌:");

        }

        /

**

        * @return

        */

        protected JLabel getLabel_2() {

        if (label_2 == null) {

        label_2 = new JLabel();

        label_2.setText("合计:");

        label_2.setBounds(, , , );

        }

        return label_2;

        }

       }

       真好无聊中。。框框架

求一个简单又有趣的架源JAVA小游戏代码

       以下是根据您的要求对文本内容进行修改和润色后的结果:

       1. 游戏名称:连连看

       2. 源代码简介:

       本程序采用Java Swing库设计开发,创建了一个连连看游戏框架。框框架redox 源码分析游戏界面包含6行5列共个宝石按钮,架源以及三个功能按钮(退出、框框架重置、重新开始),并有一个显示分数的标签。

       3. 游戏逻辑:

       - 宝石按钮的树枝计费源码位置坐标被存储在一个二维数组中。

       - 定义了两个变量来记录被选中的按钮。

       - 有一个静态变量来判断是否有按钮被选中。

       - 游戏通过检测两个被选中的按钮是否符合连连看的消除规则来执行消除操作。

       4. 代码说明:

       - 变量和方法的命名应遵循Java编程规范,例如将“diamondsButton”更改为“diamondsButtons”。

       - “grid”数组的Topology源码分析声明应改为私有,因为它是类的成员变量。

       - 类名“lianliankan”应与文件名一致。

       - 应删除不相关的代码段,例如关于代码页的解释。

       - 需要添加缺失的分号、括号和引号。qtwebengineCore源码下载

       - 为避免混淆,变量名“i, j, k, n”应更具描述性。

       5. 界面与交互:

       - 界面布局需要使用专业的UI设计原则。

       - 功能按钮和分数标签应该有适当的位置和大小。

       - 游戏按钮应该具有统一的样式和大小。

       6. 游戏玩法:

       - 玩家需要点击并连接两个相同的宝石按钮以消除它们。

       - 被消除的按钮会从界面上消失,并更新分数。

       - 游戏的目标是在限定的时间内尽可能多地消除宝石。

       7. 错误修正:

       - 应修正打字错误,例如将“蔽岩扮”更正为“编撰”,“宏灶”更正为“宏量”。

       - 确保所有的类、方法和变量定义都符合Java语法规则。

       8. 性能优化:

       - 考虑使用更有效的数据结构来存储和管理宝石按钮的位置。

       - 优化消除逻辑,确保游戏运行流畅。

       通过以上修改,不仅提升了代码的可读性和可维护性,也确保了游戏的逻辑清晰、界面友好。

相关栏目:知识