小言_互联网的博客

Java Swing 树组件与表格组件/将按钮绑定到键盘的步骤与细节(20.5.6)

396人阅读  评论(0)

树组件

JTree类的对象称为树组件,是比较常用的组件之一

DefaultMutableTreeNode 结点
//树组件都是由结点组成的

可以用DefaultMutableTreeNode类创建对象//因为实现了MutableTreeNode接口

  • DefaultMutableTreeNode(Object userObject)//默认可以有子结点,使用add()方法添加
  • DefaultMutableTreeNode(Object userObject,boolean allowChildren)//可以设置是否拥有子结点

树上的TreeSelectionEvent事件

  • addTreeSelectionListen(TreeSelectionListener listener)//树组件的监视器
  • public void getvalueChange(TreeSelectionEvent e)//接口中的方法

另外树可以调用getLastSelectedPathComponent()//获取选中的节点

例子
创建一个窗口自己做监视器

import javax.swing.*;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import java.awt.*;

public class myTreeWindow extends JFrame implements TreeSelectionListener {
    JTree jTree;
    JTextArea jTextArea;
    myTreeWindow(){
        setBounds(300,300,400,400);
        setTitle("树组件");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        init();
        validate();
    }
    void init(){
        DefaultMutableTreeNode root = new DefaultMutableTreeNode("产品");
        DefaultMutableTreeNode TV = new DefaultMutableTreeNode("电视机");
        DefaultMutableTreeNode tv1 = new DefaultMutableTreeNode(new product("小米电视机",2999.00));
        DefaultMutableTreeNode tv2 = new DefaultMutableTreeNode(new product("大米电视机",3999.00));
        DefaultMutableTreeNode PHONE = new DefaultMutableTreeNode("手机");
        DefaultMutableTreeNode phone1 = new DefaultMutableTreeNode(new product("iPhone 11",4999.00));
        DefaultMutableTreeNode phone2 = new DefaultMutableTreeNode(new product("iPhone SE",2999.00));
        TV.add(tv1);
        TV.add(tv2);
        PHONE.add(phone1);
        PHONE.add(phone2);
        root.add(TV);
        root.add(PHONE);
        setLayout(new GridLayout(1,2));   //一行两列的布局
        jTree = new JTree(root);    //将根放到树中
        jTree.addTreeSelectionListener(this);   //设置监视器
        add(new JScrollPane(jTree));
        jTextArea = new JTextArea();
        add(jTextArea);
    }
    @Override
    public void valueChanged(TreeSelectionEvent treeSelectionEvent) {
        DefaultMutableTreeNode node = (DefaultMutableTreeNode)jTree.getLastSelectedPathComponent();//获取树的组件
        if (node.isLeaf()){ //判断该结点是否为叶结点
            product product = (product) node.getUserObject();   //获取当前对象
            jTextArea.append(product.name + "," + product.price+"元"+"\n");
        }
    }
}

其中创建一个产品类

class product{  //产品对象
    String name;
    double price;
    product(){
    }
    product(String name,double price){
        this.name = name;
        this.price = price;
    }
    @Override
    public String toString() {  //必须要重写toString方法,不然返回的是对象的引用
        return name ;
    }
}

最后进行测试

public class Example10_16 {
    public static void main(String[] args) {
        myTreeWindow myTreeWindow = new myTreeWindow();
    }
}

运行效果图

表格组件

表格组件是最复杂的组件,功能比较强大
JTable有7个构造函数,以下是其中的3个

  • JTable()//创建默认的表格模型
  • JTable(int a ,int b)//创建a行b列的表格模型
  • JTable(Object data[ ][ ],Object columnName[ ])//第一个参数是二维数组,第二个参数是一维数组(表示标题)

另外表格可以调用repaint()方法 //刷新显示

通过简单的成绩单输入程序例子
首先创建窗口并且实现接口

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

public class myTable extends JFrame implements ActionListener {
    JTable jTable;
    Object data[][];
    Object name[] = {"姓名","英语成绩","数学成绩","总成绩"};
    JLabel jLabel;
    JButton jButton,jButton2;
    myTable(){
        setTitle("表格组件");
        setBounds(300,300,400,400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        init();
        validate();
    }
    void init(){
        data = new Object[8][4];  //创建8行4列的数组
        for (int i = 0; i < 8 ; i++) {
            for (int j = 0; j < 4 ; j++) {
                if(j != 0){ //除了第一列其他列都设为0
                    data[i][j] = "0";
                }
                else{
                    data[i][j] = "姓名";
                }
            }
        }
        jTable = new JTable(data,name);
        add(new JScrollPane(jTable), BorderLayout.CENTER);    //将表格添加到默认布局的中心,不加滑动框显示不了表头
        //jLabel = new JLabel("按回车确认修改值");
        //add(jLabel,BorderLayout.SOUTH);
        jButton = new JButton("按回车计算总成绩");
        jButton2 =  new JButton("清空");
        jButton2.addActionListener(this);
        jButton.addActionListener(this);
        JPanel jPanel = new JPanel();
        jPanel.add(jButton);
        jPanel.add(jButton2);
        add(jPanel,BorderLayout.SOUTH);
    }
    @Override
    public void actionPerformed(ActionEvent actionEvent) {
        if (actionEvent.getSource() == jButton2){
            for (int i = 0; i < 8 ; i++) {
                for (int j = 0; j < 4 ; j++) {
                    if(j != 0){ //除了第一列其他列都设为0
                        data[i][j] = "0";
                    }
                    else{
                        data[i][j] = "姓名";
                    }
                }
            }
        }
        for (int i = 0; i < 8 ; i++) {
            double sum = 0 ;    //总数
            boolean boo = true;
            for (int j = 1; j <= 2 ; j++) { //计算每行中的1,2
                try{
                    sum = sum + Double.parseDouble(data[i][j].toString()); //获取值然后求和
                }
                catch(Exception e){
                    boo = false;    //当出现异常时修改布尔值
                    jTable.repaint();   //刷新
                }
                if (boo == true){
                    data[i][3] = sum + "" ;//执行并运行
                    jTable.repaint();   //刷新表格
                }
            }
        }
    }
}

最后直接进行测试

public class Example10_17 {
    public static void main(String[] args) {
        myTable myTable = new myTable();
    }
}

运行效果图

将按钮绑定到键盘

通过键盘上的某一个键来实现对界面按钮的操作那么就需要用到将按钮绑定到键盘上

  • AbstractAction类与特殊的监视器//
    Java对监视按钮的键盘操作的监视器有更加严格的要求,要求创建监视器的类必须实现ActionListener接口的子类接口Action

  • 指定监视器的步骤

  1. 获取输入映射
    按钮首先调用public final InputMap getInputMap(int condition)
    其中参数condition取Jcondition类的static常量
    WHEN_FOCUSED//仅在击键发生,同时组件具有焦点是才调用操作
    WHEN_IN_FOCUSED_WINDOW//当击键发生,同时组件具有焦点时,或者组件处于具有焦点的窗口中是调用操作(用的最多)
    WHEN_ANCESTOR_OF_FOCUSED_COMPONENT//当击键发生,同时组件具有焦点时,或者该组件是具有焦点的组件的祖先时调用该操作
 InputMap inputMap = button.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
  1. 绑定按钮的键盘操作
    步骤1返回的输入映射首先调用方法
    public void put(KeyStroke keystroke,Object actionMapKey)//keystroke是指定键盘的那个键,actionMapKey是映射关键字
inputmap.put(KeyStroke.getKeyStroke("A"),"DOG");
  1. 为按钮的键盘操作指定监视器

按钮调用方法
public final ActionMap getActionMap()//返回一个ActionMap对象

ActionMap actionmap = button.getActionMap();

然后对象调用方法
public void put(Object key,Action action)//key就是原先的映射关键字,action是指实现Action接口类的监视器

actionmap.put("DOG",listener);

通过键盘按钮实现移动的例子

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

public class myWindow extends JFrame {
    JButton jButton;
    police listener;
    myWindow(){
        setTitle("按钮绑定到键盘");
        setBounds(300,300,400,400);
        Container con = this.getContentPane();
        con.setBackground(new Color(0x366728));
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new FlowLayout());
        setVisible(true);
        init();
        validate();
    }
    void init(){
        jButton = new JButton("点击或者按A键可以移动我");
        listener = new police();
        jButton.addActionListener(listener);
        InputMap inputMap = jButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); //焦点在窗口时(关键)
        inputMap.put(KeyStroke.getKeyStroke("A"),"right");  //关键字为right(关键)
        ActionMap actionmap = jButton.getActionMap();//(关键)
        actionmap.put("right",listener);    //设置监视器(关键)
        add(jButton);
    }
    class police extends AbstractAction{    //内部类
        @Override
        public void actionPerformed(ActionEvent actionEvent) {
            JButton b = (JButton)actionEvent.getSource();   //获取当前的对象
            int x = b.getX() - 10;  //向左移动
            int y = b.getY();
            b.setLocation(x,y); //设置按钮的位置
        }
    }
}

最后进行测试

public class Example10_18 {
    public static void main(String[] args) {
        myWindow myWindow = new myWindow();
    }
}

运行结果图


注意事项

  1. 如果想单纯通过键盘移动按钮的话可以将addActionListner()方法进行删除
  2. 要区分按钮绑定方法和按钮调用方法是两个不同的概念
button.setMnemonic('B');//按钮设置了快捷键Alt+B就可以代替鼠标点击按钮

关键的4步

  • 按钮获取获取输入映射返回一个对象
  • 对象调用方法put设置键盘的某个键一家以及映射关键字
  • 为按钮的操作指定监视器返回一个对象
  • 对象设置映射关键字并添加监视器

CSS

CSS 伪类 (Pseudo-classes)
CSS 伪元素 (Pseudo-elements)

JavaScript

Browser BOM

CET4P167

severe
variety
rifle
election
skim
conquest
dive
expert
various
stake
improve


转载:https://blog.csdn.net/ouqianbei/article/details/105949733
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场