第十一篇 Java GUI编程(下)- Swing篇

第十一篇 Java GUI编程(下)- Swing篇

一、Swing的基本组件(一)

​ 1️⃣JComboBox:下拉选择框,支持泛型
​ 2️⃣ButtonGroup:单选框(男or女)
​ 3️⃣JRadioButton:复选框(是否已婚)-- 其余都和awt相同,差别不大
​ 4️⃣实现下图的效果:
在这里插入图片描述

package com.swing.java;

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

public class SwingDemo1 {
    /* 声明所需的全部组件 */
    JFrame jf = new JFrame("测试swing基本组件");
    JTextField textField = new JTextField(35);
    JTextArea textArea = new JTextArea(15,40);
    JButton btn = new JButton("确认",new ImageIcon("E:\\MyCode\\JavaCode\\AllCodes\\JavaGUI\\src\\com\\swing\\java\\img.png"));

    JComboBox<String> colorSelect = new JComboBox<String>();
    ButtonGroup buttonGroup = new ButtonGroup();    //单选框,这里和awt稍微区别
    JRadioButton male = new JRadioButton("男",true);
    JRadioButton female = new JRadioButton("女",false);
    JRadioButton isMarried = new JRadioButton("是否已婚?");

    JMenuBar menuBar = new JMenuBar();
    JMenu file = new JMenu("文件");   //菜单
    JMenu edit = new JMenu("编辑");   //菜单项
    JMenuItem auto = new JMenuItem("自动换行");
    JMenuItem copy = new JMenuItem("复制",new ImageIcon("E:\\MyCode\\JavaCode\\AllCodes\\JavaGUI\\src\\com\\swing\\java\\img_1.png"));
    JMenuItem paste = new JMenuItem("粘贴",new ImageIcon("E:\\MyCode\\JavaCode\\AllCodes\\JavaGUI\\src\\com\\swing\\java\\img_2.png"));
    JMenu format = new JMenu("格式"); //子菜单
    JMenuItem comment = new JMenuItem("注释");    //子菜单项
    JMenuItem cancelcomment = new JMenuItem("取消注释");

    /* 右键菜单选项 */
    JMenuItem greenBackground = new JMenuItem("护眼模式");
    JMenuItem darkBackground = new JMenuItem("夜晚模式");
    JMenuItem lightBackground = new JMenuItem("默认模式");

    String[] name = {"张三","李四","王五"};   //列表选择框
    JList nameList = new JList(name);

    /* 在init()组装组件 */
    private void init(){
        /* JPanel组装底部 */
        JPanel bottomPanel = new JPanel();
        bottomPanel.add(textField);
        bottomPanel.add(btn);
        jf.add(bottomPanel,BorderLayout.SOUTH);

        /* JPanel组装选择框相关 */
        JPanel selectPanel = new JPanel();
        colorSelect.addItem("红色");
        colorSelect.addItem("黄色");
        colorSelect.addItem("绿色");
        buttonGroup.add(male);
        buttonGroup.add(female);
        selectPanel.add(colorSelect);
        selectPanel.add(male);
        selectPanel.add(female);
        selectPanel.add(isMarried);

        /* 组装菜单相关组件 */
        format.add(comment);
        format.add(cancelcomment);
        edit.add(auto);
        edit.addSeparator();
        edit.add(copy);
        edit.add(paste);
        edit.addSeparator();
        edit.add(format);
        menuBar.add(file);
        menuBar.add(edit);

        jf.setJMenuBar(menuBar);
        /* 用平行的Box组装文本域和列表选择框 */
        Box centerBox = new Box(BoxLayout.X_AXIS);
        centerBox.add(textArea);
        centerBox.add(nameList);

        /* 用垂直的Box组装窗口的中间部分 */
        Box verticalBox = Box.createVerticalBox();
        verticalBox.add(centerBox);
        verticalBox.add(selectPanel);
        jf.add(verticalBox,BorderLayout.CENTER);

        ButtonGroup popuMenu = new ButtonGroup();
        popuMenu.add(greenBackground);
        popuMenu.add(darkBackground);
        popuMenu.add(lightBackground);

        ActionListener popuMenuListen = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String actionCommand = e.getActionCommand();
                switch (actionCommand){
                    case "护眼模式":
                        textArea.setBackground(new Color(104, 225, 104));
                        break;
                    case "夜晚模式":
                        textArea.setBackground(new Color(35, 35, 37));
                        break;
                    case "默认模式":
                        textArea.setBackground(new Color(235, 241, 240));
                        break;
                }
            }
        };

        greenBackground.addActionListener(popuMenuListen);
        darkBackground.addActionListener(popuMenuListen);
        lightBackground.addActionListener(popuMenuListen);

        JPopupMenu jPopupMenu = new JPopupMenu();
        jPopupMenu.add(greenBackground);
        jPopupMenu.add(darkBackground);
        jPopupMenu.add(lightBackground);
        textArea.setComponentPopupMenu(jPopupMenu);

        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.pack();
        jf.setVisible(true);

    }
    public static void main(String[] args) {
        new SwingDemo1().init();
    }
}

二、Swing的基本组件(二)

1、边框组件 - Border

很多情况下,为了使界面的层次感更明显,我们会为其设置边框。swing中提供了Border对象来代表一个边框

(1)Border的继承体系

在这里插入图片描述

(2)特殊的Border

​ 1️⃣标题边框 - TitleBorder:为其它边框设置标题(创建该类时需要传入一个其他的Border对象,)
​ 2️⃣复合边框 - CompoundBorder:用来组合其它两个边框(创建时传入两个其他边框,内边框+外边框)
(PS:以上两种特殊边框创建时均依赖于其他边框)

(3)Border使用步骤

​ 1️⃣实例化Border对象:使用BorderFactory或者XxxBorder创建
​ 2️⃣调用Swing的setBorder( Border b )方法为组件设置边框
​ 3️⃣案例:实现下图界面效果
在这里插入图片描述

package com.swing.java;

import javax.swing.*;
import javax.swing.border.*;
import java.awt.*;

public class SwingDemo2{
    public static void main(String[] args) {
        JFrame jFrame = new JFrame("测试边框Border");
        jFrame.setLayout(new GridLayout(2,4));

        //创建BevelBorder斜面边框(类型:凸起、凹陷)
        BevelBorder bevelBorder = new BevelBorder(BevelBorder.RAISED,Color.RED,Color.GREEN,Color.BLUE,Color.GRAY);
        jFrame.add(getJPanelWithBorder(bevelBorder,"测试BevelBorder"));

        //创建LineBorder
        Border lineBorder = BorderFactory.createLineBorder(Color.YELLOW, 10);
        jFrame.add(getJPanelWithBorder(lineBorder,"测试LineBorder"));

        //创建EmptyBorder
        EmptyBorder emptyBorder = new EmptyBorder(10,5,20,30);
        jFrame.add(getJPanelWithBorder(emptyBorder,"测试EmptyBorder"));

        //创建EtchedBorder
        EtchedBorder etchedBorder = new EtchedBorder(EtchedBorder.RAISED,Color.RED,Color.GREEN);
        jFrame.add(getJPanelWithBorder(etchedBorder,"测试EtchedBorder"));

        //创建TitleBorder
        TitledBorder titledBorder = BorderFactory.createTitledBorder(new LineBorder(Color.YELLOW,5),"测试TitleBorder(1)");
        jFrame.add(getJPanelWithBorder(titledBorder,"测试TitleBorder(2)"));

        //创建MatteBorder
        MatteBorder matteBorder = BorderFactory.createMatteBorder(10,5,20,30,Color.GRAY);
        jFrame.add(getJPanelWithBorder(matteBorder,"测试MatteBorder"));

        //创建CompoundBorder
        CompoundBorder compoundBorder = new CompoundBorder(new LineBorder(Color.BLUE,10),lineBorder);
        jFrame.add(getJPanelWithBorder(compoundBorder,"测试CompoundBorder"));

        jFrame.setDefaultCloseOperation(jFrame.EXIT_ON_CLOSE);
        jFrame.pack();
        jFrame.setVisible(true);

    }

    private static JPanel getJPanelWithBorder(Border border,String content) {
        JPanel jPanel = new JPanel();
        jPanel.add(new JLabel(content));
        jPanel.setBorder(border);
        return jPanel;
    }
}

3、工具条组件 - JToolBar

1️⃣JToolBar( String name,int orientation ):创建名字为name,方向为orientation的工具条对象。
orientation可传SwingConstants.HORIZONTAL(水平)、SwingConstants.VERTICAL(垂直)
2️⃣JButton add( Action a ):为JToolBar添加工具按钮。
3️⃣addSeparator( Dimensize size ):为JToolBar添加分隔
4️⃣setFloatable( boolean b ):设置工具条是否能拖动
5️⃣setMargin( Insets m ):设置工具条与按钮的边距
6️⃣setOrientation( ):设置工具条的反向(同上面的构造方法)
7️⃣案例:实现下图界面的效果
在这里插入图片描述

package com.swing.java;

import javax.swing.*;
import javax.swing.border.Border;
import java.awt.*;
import java.awt.event.ActionEvent;

public class JToolBarTest{
    JFrame jFrame = new JFrame("测试JToolBar");
    TextArea ta = new TextArea(10,40);

    JToolBar jToolBar = new JToolBar("播放工具条",SwingConstants.HORIZONTAL);

    Action pre = new AbstractAction("上一曲",new ImageIcon("JavaGUI\\上一曲.png")) {
        @Override
        public void actionPerformed(ActionEvent e) {
            ta.append("上一曲\n");
        }
    };

    Action next = new AbstractAction("下一曲",new ImageIcon("JavaGUI\\下一曲.png")) {
        @Override
        public void actionPerformed(ActionEvent e) {
            ta.append("下一曲\n");
        }
    };

    Action pause = new AbstractAction("暂停",new ImageIcon("JavaGUI\\暂停.png")) {
        @Override
        public void actionPerformed(ActionEvent e) {
            ta.append("暂停\n");
        }
    };

    JButton preBtn = new JButton(pre);
    JButton pauseBtn = new JButton(pause);
    JButton nextBtn = new JButton(next);

    public void init(){
        jToolBar.add(preBtn);
        jToolBar.addSeparator();
        jToolBar.add(pauseBtn);
        jToolBar.addSeparator();
        jToolBar.add(nextBtn);
        jToolBar.setFloatable(true); //可拖动
        jFrame.add(jToolBar, BorderLayout.NORTH);

        JScrollPane jScrollPane = new JScrollPane(ta);
        jFrame.add(jScrollPane, BorderLayout.SOUTH);
        jFrame.setDefaultCloseOperation(jFrame.EXIT_ON_CLOSE);
        jFrame.pack();
        jFrame.setVisible(true);
    }

    public static void main(String[] args) {
        new JToolBarTest().init();
    }
}

4、选择对话框的使用

(1)颜色选择对话框 - JColorChooser

​ 1️⃣JColorChooser用于创建颜色选择对话框,该类提供了静态方法showDialog( )用于快速生成一个颜色选择对话框。
​ 2️⃣public static Color showDialog( Componet componet,String title,Color initColor )
​ 3️⃣案例:实现下图的效果(点击按钮弹出颜色选择对话框,根据选择的颜色改变文本域的背景色)

在这里插入图片描述

package com.swing.java;

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

public class ColorChooserTest {
    JFrame jFrame = new JFrame("测试颜色选择对话框");
    TextArea textArea = new TextArea(15,55);
    public void init(){
        jFrame.add(textArea,BorderLayout.NORTH);
        JButton button = new JButton(new AbstractAction("打开颜色选择框") {
            @Override
            public void actionPerformed(ActionEvent e) {
                Color chooseColor = JColorChooser.showDialog(jFrame, "颜色选择", Color.ORANGE);
                textArea.setBackground(chooseColor);
            }
        });

        jFrame.add(button,BorderLayout.SOUTH);
        jFrame.pack();
        jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        jFrame.setVisible(true);
    }
    public static void main(String[] args) {
        new ColorChooserTest().init();
    }
}
(2)文件选择对话框 - JFileChooser

​ 🔐JFileChooser的功能与AWT中的FIleDialog基本相似,都可以用于生成"打开文件"和"保存文件"的对话框,与AWT的FileDialog不同的是,JFileChooser无需依赖本地平台的GUI,它有Java实现,在所有平台上具有完全一致的行为,也就是所有平台都具有相同的外观风格。

​ 1️⃣JFileChooser的使用步骤:
​ 🛰实例化JFileChooser对象
​ 🛰调用JFileChooser的方法,进行初始化(默认选择的文件、是否允许多选、设置可选内容等)
​ 🛰显示对话框:showOpenDialog( )、showSaveDialog( )
​ 🛰获取用户选择的结果:File getSelectedFile( )、File[ ] getSelectedFiles( )
​ 2️⃣案例:实现下图效果(打开图片将图片显示出来、保存显示出来的到电脑中)

在这里插入图片描述

package com.swing.java;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class FileChooserTest {
    JMenuBar menuBar = new JMenuBar();
    JMenu file = new JMenu("文件");

    MyCanvas myCanvas = new MyCanvas();
    BufferedImage image = null;
    private class MyCanvas extends JPanel{
        @Override
        public void paint(Graphics g) {
            g.drawImage(image,0,0,null);
        }
    }

    JMenuItem openFile = new JMenuItem(new AbstractAction("打开") {
        @Override
        public void actionPerformed(ActionEvent e) {
            JFileChooser fileOpenDialog = new JFileChooser("\\C:");
            fileOpenDialog.showOpenDialog(jFrame);
            File selectedOpenFile = fileOpenDialog.getSelectedFile();

            try {
                image = ImageIO.read(selectedOpenFile);
                myCanvas.setPreferredSize(new Dimension(image.getWidth(),image.getHeight()));
                jFrame.pack();
                myCanvas.repaint();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    });

    JMenuItem saveFile = new JMenuItem(new AbstractAction("另存为") {
        @Override
        public void actionPerformed(ActionEvent e) {
            JFileChooser fileSaveDialog = new JFileChooser(".");
            fileSaveDialog.showSaveDialog(jFrame);
            File selectedFile = fileSaveDialog.getSelectedFile();

            try {
                ImageIO.write(image,"jpg",selectedFile);
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    });
    JFrame jFrame = new JFrame("测试文件选择对话框");

    public void init(){

        file.add(openFile);
        file.add(saveFile);
        menuBar.add(file);
        jFrame.setJMenuBar(menuBar);

        myCanvas.setPreferredSize(new Dimension(400,200));
        jFrame.add(myCanvas);

        jFrame.pack();
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jFrame.setVisible(true);
    }

    public static void main(String[] args) {
        new FileChooserTest().init();
    }
}

5、其他对话框 - JOptionPane的使用

☑️:JOptionPane提供了创建一些简单对话框(消息、确认、输入和选项对话框)的方法,Swing已经为这些对话框添加了对应的组件,无需我们手动添加便可以使用。

方法方法功能
showMessageDialog( )消息对话框,告知用户事件发生,用户只能单击确认。
showConfirmDialog( )确认对话框,向用户确认某个事件,用户可以单击yes、no或cancel
showInputDialog( )输入对话框,提示用户输入某些信息
showOptionDialog( )自定义选项对话框,允许自定义选项,可以取代确认对话框,只是比较复杂

☑️:上表的方法带有很多的重载,各种参数解释如下:
🛰Component parentComponent - 当前对话框显示的父组件
🛰Object message - 对话框上显示的信息(可以是字符串、组件或者图片等)
🛰String title - 对话框的标题
🛰int optionType - 对话框显示的按钮类型。
(DEFAULT_OPTION、YES_NO_OPTION、YES_MP_CANCEL_OPTION、OK_CANCEL_OPTION)

三、Swing的特殊容器 - JSplitPane

四、Swing的其他组件

1、进度条 - JProgressBar

2、列表框 - JList、JComboBox

3、树 - JTree

4、表格 - JTable

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
对于Java GUI编程实现计算器,你可以使用Swing和AWT这两种Java GUI工具包之一。 以下是一个简单的Java GUI计算器的实现示例: ```java import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Calculator extends JFrame implements ActionListener { private JButton[] numberButtons; private JButton[] operatorButtons; private JButton clearButton, equalsButton, decimalButton; private JTextField textField; private double num1 = 0, num2 = 0, result = 0; private char operator; public Calculator() { setTitle("Calculator"); // Create the number buttons numberButtons = new JButton[10]; for (int i = 0; i < 10; i++) { numberButtons[i] = new JButton(String.valueOf(i)); } // Create the operator buttons operatorButtons = new JButton[4]; operatorButtons[0] = new JButton("+"); operatorButtons[1] = new JButton("-"); operatorButtons[2] = new JButton("*"); operatorButtons[3] = new JButton("/"); // Create the clear, equals, and decimal buttons clearButton = new JButton("C"); equalsButton = new JButton("="); decimalButton = new JButton("."); // Create the text field textField = new JTextField(10); textField.setEditable(false); // Set the layout manager and add the components setLayout(new GridBagLayout()); GridBagConstraints gc = new GridBagConstraints(); gc.gridx = 0; gc.gridy = 0; gc.gridwidth = 4; add(textField, gc); gc.gridwidth = 1; gc.gridy = 1; for (int i = 0; i < 10; i++) { gc.gridx = i % 3; gc.gridy = i / 3 + 2; add(numberButtons[i], gc); numberButtons[i].addActionListener(this); } gc.gridx = 0; gc.gridy = 5; add(operatorButtons[0], gc); operatorButtons[0].addActionListener(this); gc.gridx = 1; add(operatorButtons[1], gc); operatorButtons[1].addActionListener(this); gc.gridx = 2; add(operatorButtons[2], gc); operatorButtons[2].addActionListener(this); gc.gridx = 3; add(operatorButtons[3], gc); operatorButtons[3].addActionListener(this); gc.gridx = 0; gc.gridy = 6; add(clearButton, gc); clearButton.addActionListener(this); gc.gridx = 1; add(equalsButton, gc); equalsButton.addActionListener(this); gc.gridx = 2; add(decimalButton, gc); decimalButton.addActionListener(this); setSize(200, 200); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); } public void actionPerformed(ActionEvent e) { for (int i = 0; i < 10; i++) { if (e.getSource() == numberButtons[i]) { textField.setText(textField.getText() + i); } } if (e.getSource() == decimalButton) { textField.setText(textField.getText() + "."); } if (e.getSource() == clearButton) { textField.setText(""); num1 = 0; num2 = 0; result = 0; operator = ' '; } if (e.getSource() == operatorButtons[0]) { num1 = Double.parseDouble(textField.getText()); operator = '+'; textField.setText(""); } if (e.getSource() == operatorButtons[1]) { num1 = Double.parseDouble(textField.getText()); operator = '-'; textField.setText(""); } if (e.getSource() == operatorButtons[2]) { num1 = Double.parseDouble(textField.getText()); operator = '*'; textField.setText(""); } if (e.getSource() == operatorButtons[3]) { num1 = Double.parseDouble(textField.getText()); operator = '/'; textField.setText(""); } if (e.getSource() == equalsButton) { num2 = Double.parseDouble(textField.getText()); switch (operator) { case '+': result = num1 + num2; break; case '-': result = num1 - num2; break; case '*': result = num1 * num2; break; case '/': result = num1 / num2; break; } textField.setText(Double.toString(result)); } } public static void main(String[] args) { new Calculator(); } } ``` 这个示例应该可以实现一个简单的Java GUI计算器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AF_INET6

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值