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实现简单学生信息管理系统

    Java实现简单学生信息管理系统攻略 一、项目背景 随着教育信息化的发展,学生信息管理系统已经成为了中小学校管理工作不可或缺的一部分。Java是一门广泛应用于企业级开发的编程语言,具有高效性、安全性、跨平台性等特点。本篇攻略将介绍如何用Java语言实现一个简单的学生信息管理系统。 二、系统功能设计 该学生信息管理系统的主要功能包括:- 添加学生信息- 删除学…

    Java 2023年5月19日
    00
  • Gson解析空字符串发生异常的处理方法

    当使用Gson解析空字符串时,可能会抛出JsonSyntaxException异常,下面是解析空字符串时发生异常的原因:- Gson对空字符串进行反序列化时会出现语法异常,无法将空字符串转换成相应的数据类型;- Gson对于无法反序列化的字符串会抛出JsonSyntaxException异常。 在处理Gson解析空字符串异常时,我们可以考虑以下方法: 方法1…

    Java 2023年5月26日
    00
  • 史上最全MyBatis面试题及答案

    史上最全MyBatis面试题及答案攻略 什么是MyBatis?它的作用是什么? MyBatis是一个持久层框架,用于简化Java应用程序中的数据库交互。它使用XML或注解来描述对象映射器,从而实现将Java对象映射为数据库表中的数据。MyBatis的主要作用是:简化数据库交互代码的编写,防止SQL注入攻击,提高代码的可维护性和可读性。 MyBatis中的Ma…

    Java 2023年5月20日
    00
  • IntelliJ IDEA中新建Java class的解决方案

    当在IntelliJ IDEA中需要新建一个Java class时,可以按照以下步骤进行操作: 在IntelliJ IDEA的菜单栏中,选择File -> New -> Java Class,或者使用快捷键Alt+Insert(MacOS中为Command+N)。 在弹出的对话框中,输入class的名称,选择class所在的包名,也可以选择一个已…

    Java 2023年5月26日
    00
  • Vue集成Iframe页面的方法示例

    关于Vue集成Iframe页面的方法示例,以下是我整理的详细攻略: 步骤一:在Vue项目中安装Vue-iframe插件 在Vue项目中集成Iframe页面首先需要安装Vue-iframe插件。Vue-iframe插件是专门用于在Vue项目中嵌入Iframe页面的插件,可以快速简单地实现Iframe页面的嵌入。在终端中执行以下命令即可完成Vue-iframe插…

    Java 2023年6月15日
    00
  • Java Springboot全局异常处理

    Java Spring Boot 是一个快速开发框架,可以帮助我们快速构建稳定高效的应用程序。在开发应用程序时,往往需要处理一些在运行期间可能发生的异常错误。为了使应用程序更加健壮与可靠,我们需要进行全局异常处理。 一、为什么需要全局异常处理 全局异常处理在应用中非常重要,主要有以下几个原因: 增强用户体验:当应用程序出现异常时,我们可以通过全局异常处理机制…

    Java 2023年5月19日
    00
  • Spring一步到位精通拦截器

    Spring一步到位精通拦截器攻略 Spring 框架提供了拦截器(Interceptor)来拦截和处理请求,使用拦截器可以方便的实现通用的功能,比如权限验证、日志记录、事务管理等,从而减少重复代码的编写,提高了代码的可重用性和可维护性。 本文将详细介绍 Spring 拦截器的知识和使用方法,内容涵盖以下方面: Spring 拦截器介绍 Spring 拦截器…

    Java 2023年5月19日
    00
  • springboot项目整合mybatis并配置mybatis中间件的实现

    SpringBoot项目整合MyBatis并配置MyBatis中间件的实现 在SpringBoot中,我们可以使用MyBatis来实现持久化操作。本文将详细讲解SpringBoot项目整合MyBatis并配置MyBatis中间件的实现的完整攻略,并提供两个示例。 1. 整合MyBatis 以下是整合MyBatis的基本流程: 在pom.xml文件中添加以下依…

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