Java Swing程序设计实战

Java Swing程序设计实战攻略

Java Swing程序设计实战是Java界面开发的重要书籍,其中讲解了Swing界面组件的使用、事件处理、布局管理器等内容,并有大量的编程实例。攻略分为以下几个部分:

程序设计实践

  • 掌握Swing组件的使用,如JLabel、JTextField、JComboBox等;
  • 学会处理Swing组件的事件,如ActionEvent、ItemEvent等;
  • 了解布局管理器的使用,如Flowlayout、Borderlayout、Gridlayout等;
  • 学习如何创建对话框,并利用对话框完成用户输入;
  • 学会使用JFileChooser创建文件选择对话框;
  • 掌握Swing多线程的编程方法。

案例实例一

需求说明:

实现一个简单的计算器应用,支持整数四则运算和求幂操作,带有可视化界面。

解决方案:

  1. 创建一个JFrame并设置程序标题;
  2. 使用GridLayout布局管理器创建按钮面板;
  3. 创建计算器文本框和按钮,并将它们添加到面板中;
  4. 为按钮添加事件侦听器,处理按钮事件,计算运算结果,并将结果显示在计算器文本框中;
  5. 运行程序,测试功能是否正常。

下面是代码示例:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Calculator extends JFrame implements ActionListener {
    private JTextField textField;

    public static void main(String[] args) {
        Calculator calculator = new Calculator();
        calculator.setVisible(true);
    }

    public Calculator() {
        setTitle("Calculator");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setResizable(false);

        // 计算器文本框
        textField = new JTextField();
        textField.setHorizontalAlignment(JTextField.RIGHT);
        textField.setEditable(false);

        // 按钮面板
        JPanel buttonPanel = new JPanel(new GridLayout(5, 4));

        // 创建按钮
        String[] buttonNames = {"7", "8", "9", "/", "4", "5", "6", "*", "1", "2", "3", "-", "0", ".", "=", "+"};
        for (String buttonName : buttonNames) {
            JButton button = new JButton(buttonName);
            button.addActionListener(this);
            buttonPanel.add(button);
        }

        // 添加文本框和按钮面板
        add(textField, BorderLayout.NORTH);
        add(buttonPanel, BorderLayout.CENTER);

        // 设置窗口大小
        pack();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        String command = e.getActionCommand();
        if (command.equals("=")) {
            String expression = textField.getText();
            try {
                Double result = CalculatorUtils.evaluate(expression);
                textField.setText(result.toString());
            } catch (Exception ex) {
                textField.setText("Error");
            }
        } else {
            textField.setText(textField.getText() + command);
        }
    }
}

class CalculatorUtils {
    private static final String OPERATORS = "+-*/^";

    public static double evaluate(String expression) {
        String[] tokens = expression.split(" ");

        // 记录上一个运算符和操作数
        String operator = "";
        double operand = 0.0;
        double result = 0.0;

        for (String token : tokens) {
            if (token.length() == 0) {
                continue;
            }

            if (OPERATORS.contains(token)) {
                operator = token;
            } else {
                double value = Double.parseDouble(token);

                if (operator.equals("+")) {
                    result += value;
                } else if (operator.equals("-")) {
                    result -= value;
                } else if (operator.equals("*")) {
                    result *= value;
                } else if (operator.equals("/")) {
                    result /= value;
                } else if (operator.equals("^")) {
                    result = Math.pow(result, value);
                } else {
                    result = value;
                }

                operator = "";
            }
        }

        return result;
    }
}

案例实例二

需求说明:

实现一个简单的文件管理器应用,支持浏览文件夹、创建文件夹、新建文件、删除文件等操作,并带有可视化界面。

解决方案:

  1. 创建一个JFrame并设置程序标题;
  2. 创建一个JFileChooser组件并设置为只浏览文件夹;
  3. 创建一个JTree组件并显示当前文件夹中的所有文件和文件夹;
  4. 为JTree组件添加事件侦听器,处理节点选择事件,并更新当前文件夹的内容;
  5. 创建一个菜单栏和菜单项,实现创建文件夹、新建文件、删除文件等操作;
  6. 运行程序,测试功能是否正常。

下面是代码示例:

import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;

public class FileManager extends JFrame implements ActionListener {
    private JTree tree;
    private DefaultTreeModel treeModel;
    private JFileChooser fileChooser;
    private File currentFolder;

    public static void main(String[] args) {
        FileManager fileManager = new FileManager();
        fileManager.setVisible(true);
    }

    public FileManager() {
        setTitle("File Manager");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setResizable(false);

        // JFileChooser
        fileChooser = new JFileChooser();
        fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        fileChooser.setAcceptAllFileFilterUsed(false);

        // 右键菜单
        JPopupMenu popupMenu = new JPopupMenu();
        JMenuItem createFolderMenu = new JMenuItem("Create Folder");
        JMenuItem createFileMenu = new JMenuItem("Create File");
        JMenuItem deleteMenu = new JMenuItem("Delete");
        createFolderMenu.addActionListener(this);
        createFileMenu.addActionListener(this);
        deleteMenu.addActionListener(this);
        popupMenu.add(createFolderMenu);
        popupMenu.add(createFileMenu);
        popupMenu.add(deleteMenu);
        tree = new JTree(new DefaultMutableTreeNode("My Computer"));
        tree.setComponentPopupMenu(popupMenu);

        // 开始选择文件夹
        int result = fileChooser.showOpenDialog(this);
        if (result == JFileChooser.APPROVE_OPTION) {
            currentFolder = fileChooser.getSelectedFile();
            updateTree();
        } else {
            System.exit(0);
        }

        // 布局
        JScrollPane scrollPane = new JScrollPane(tree);
        scrollPane.setPreferredSize(new Dimension(400, 500));
        add(scrollPane, BorderLayout.CENTER);

        pack();
    }

    private void updateTree() {
        DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode(currentFolder.getAbsolutePath());
        addChildren(rootNode, currentFolder);
        treeModel = new DefaultTreeModel(rootNode);
        tree.setModel(treeModel);
    }

    private void addChildren(DefaultMutableTreeNode parentNode, File parentFile) {
        if (parentFile.isDirectory() && parentFile.listFiles() != null) {
            for (File file : parentFile.listFiles()) {
                if (file.isDirectory()) {
                    DefaultMutableTreeNode folderNode = new DefaultMutableTreeNode(file.getName());
                    parentNode.add(folderNode);
                    addChildren(folderNode, file);
                } else {
                    DefaultMutableTreeNode fileNode = new DefaultMutableTreeNode(file.getName());
                    parentNode.add(fileNode);
                }
            }
        }
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        String command = e.getActionCommand();
        TreePath selectedPath = tree.getSelectionPath();

        if (command.equals("Create Folder")) {
            String folderName = JOptionPane.showInputDialog(this, "请输入文件夹名称:");
            if (folderName != null && folderName.length() > 0) {
                File folder = new File(currentFolder.getAbsolutePath() + File.separator + folderName);
                if (folder.mkdir()) {
                    DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode) selectedPath.getLastPathComponent();
                    DefaultMutableTreeNode folderNode = new DefaultMutableTreeNode(folder.getName());
                    parentNode.add(folderNode);
                    treeModel.reload(parentNode);
                }
            }
        } else if (command.equals("Create File")) {
            String fileName = JOptionPane.showInputDialog(this, "请输入文件名称:");
            if (fileName != null && fileName.length() > 0) {
                File file = new File(currentFolder.getAbsolutePath() + File.separator + fileName);
                try {
                    if (file.createNewFile()) {
                        DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode) selectedPath.getLastPathComponent();
                        DefaultMutableTreeNode fileNode = new DefaultMutableTreeNode(file.getName());
                        parentNode.add(fileNode);
                        treeModel.reload(parentNode);
                    }
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        } else if (command.equals("Delete")) {
            DefaultMutableTreeNode node = (DefaultMutableTreeNode) selectedPath.getLastPathComponent();
            File file = new File(currentFolder.getAbsolutePath() + File.separator + node.getUserObject().toString());
            if (node.isLeaf() && file.delete()) {
                DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode) node.getParent();
                parentNode.remove(node);
                treeModel.reload(parentNode);
            }
        }
    }
}

以上即为Java Swing程序设计实战的攻略,包含了实践和案例实例,希望对Java界面开发工程师们有所启发。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java Swing程序设计实战 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • java实现装饰器模式(Decorator Pattern)

    Java实现装饰器模式 装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许我们动态地将行为添加到某个对象中,而不是通过继承来实现。它是在保持类方法签名不变的情况下增加功能,实现类的功能扩展。 角色介绍 Component:抽象组件,定义装饰者和被装饰者的最基本的接口和规范。 ConcreteComponent:具体组件,也是被装饰器…

    Java 2023年5月19日
    00
  • 手撸一个 spring-boot-starter的全过程

    首先,手撸一个spring-boot-starter的全过程可以分为以下几个步骤: 创建一个Maven项目,命名为my-spring-boot-starter。 在my-spring-boot-starter项目的src/main/java目录下,创建一个Java类,例如MySpringBootStarter.java,用于定义starter的核心功能。 在…

    Java 2023年5月15日
    00
  • javascript实现留言板功能

    下面是“JavaScript实现留言板功能”的完整攻略。首先,需要进行以下几个步骤: 步骤一:创建HTML页面 首先需要创建一个基本的HTML页面结构。在该页面中需要设置一个textarea、一个提交按钮和一个显示留言的区域。代码示例如下: <!DOCTYPE html> <html lang="en"> <…

    Java 2023年6月15日
    00
  • spring boot打jar包发布的方法

    强烈建议在开始发布jar包之前先确保项目的可运行性,即进行单元测试和集成测试。 一、添加Maven插件 在pom.xml文件中添加如下代码,以添加Maven插件: <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId&g…

    Java 2023年5月15日
    00
  • 常见的原子操作有哪些?

    常见的原子操作是指直接在硬件层面上实现的原子性操作。这些操作,在多线程并发的环境下非常有用,可以保证对数据的操作是完整和一致的。常见的原子操作包括实现加减操作和内存屏障操作。 实现加减操作 在 Python 中,有一个标准的模块 threading,提供了多线程编程所需要的相关方法和类。这个模块提供了 Lock() 锁的类,用于互斥访问共享资源。其中,RLo…

    Java 2023年5月10日
    00
  • 使用java实现猜拳小游戏

    使用Java实现猜拳小游戏 概述 在本篇攻略中,我们将使用Java编写一个猜拳小游戏,让玩家与计算机进行猜拳对抗。猜拳规则如下: 剪刀(scissors)败给石头(rock),胜过布(paper) 石头(rock)胜过剪刀(scissors),败给布(paper) 布(paper)胜过石头(rock),败给剪刀(scissors) 游戏结束后,将统计双方获胜…

    Java 2023年5月19日
    00
  • ManyToMany单向、双向:@JoinTable的使用

    ManyToMany 单向使用 @JoinTable 的完整攻略 ManyToMany 单向关系适用于两个实体之间是互相独立的,例如学生可以选择多个课程,而课程也可以被多个学生选择。我们可以使用 @ManyToMany 注解来映射这样的关系。当两个实体之间是互相依赖的,例如 Order 和 Product,我们就需要使用双向 ManyToMany,可以参考第…

    Java 2023年5月20日
    00
  • 什么是 JVM?

    以下是关于JVM的完整使用攻略: 什么是JVM? JVM(Java Virtual Machine)是Java虚拟机的缩写,它是Java程序的行环境。JVM可以在不同的操作系统上运行Java程序,它将Java程序编译后的字节码解释成机器码并执行JVM还提供了垃圾回收、内存管理、安全性等功能,使Java程序更加安全、稳定和高效。 使用JVM运行Java程序 使…

    Java 2023年5月12日
    00
合作推广
合作推广
分享本页
返回顶部