程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何将 ActionListener 添加到 JCheckBox? 问题当前解决方案大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决如何将 ActionListener 添加到 JcheckBox? 问题当前解决方案?

开发过程中遇到如何将 ActionListener 添加到 JcheckBox? 问题当前解决方案的问题如何解决?下面主要结合日常开发的经验,给出你关于如何将 ActionListener 添加到 JcheckBox? 问题当前解决方案的解决方法建议,希望对你解决如何将 ActionListener 添加到 JcheckBox? 问题当前解决方案有所启发或帮助;

问题

所以我的程序接收一个 .csv 文件并加载数据并显示它。加载数据后,它会为数据中的每个列标题创建一个新的 JcheckBox我如何添加 ActionListener便当用户勾选/取消勾选任何框时,它应该执行某个功能?

加载数据时,它通过代码更新JPanel

    public voID updatecheckListPanel(){

        checkListPanel.removeAll();
        checkListPanel.setLayout(new GrIDLayout(currentData.getcolumnnames().length,1,10,0));
        for (String columnname : currentData.getcolumnnames()){
            JcheckBox checkBox = new JcheckBox();
            checkBox.setText(columnName);
            checkListPanel.add(checkBoX);
        }
        checkListPanel.revalIDate();
        checkListPanel.repaint();
    }

我在底部还有以下内容:

    @OverrIDe
    public voID actionPerformed(ActionEvent E) {

        if (e.getsource() == newDataFrameItem){
            newfile();
            System.out.println("New DataFrame Loaded in");
        }
        if (e.getsource() == loadDataFrameItem){
            loadfile();
            System.out.println(".csv Data loaded into DataFrame.");
        }
        if (e.getsource() == saveDataFrameItem){
            System.out.println("Saved the data to a .csv file");
        }

    }

我想要做的是,当一个复选框没有被勾选时,它应该隐藏 Jtable 中的一列,当勾选时,它应该重新显示该列。

当前解决方案

我想出的解决方案是创建一个变量 allcolumnheaders,它是字符串的 ArrayList。然后我还有一个变量 showncolumnheaders,它是布尔值的 ArrayList。当用户想要显示/隐藏一列时,showcolumn(String columnName)hIDecolumn(String columnName)函数在allcolumnheaders中找到列name的索引,并在{{1}中设置索引的布尔值} 为真/假。

它继续创建一个新的表模型,其中仅当该列的布尔值为真时才添加列。然后它将表的模型设置为新的表模型。

以下代码如下所示:

showncolumnheaders

解决方法

简介

我花了一段时间,但我想出了以下 JTable GUI。这是开始显示。

如何将 ActionListener 添加到 JCheckBox?
      
    问题当前解决方案

这是我删除项目描述后的 GUI。

如何将 ActionListener 添加到 JCheckBox?
      
    问题当前解决方案

这是我删除商品价格后的 GUI。

如何将 ActionListener 添加到 JCheckBox?
      
    问题当前解决方案

这是我添加回列后的 GUI。

如何将 ActionListener 添加到 JCheckBox?
      
    问题当前解决方案

说明

我创建了一个 Item 类来保存一个项目。

我创建了一个 Inventory 类来保存 Item 实例的列表和列标题的 String 数组。

我创建了 JFrame 和两个 JPanels。一个 JPanel 持有 JTable,另一个持有 JcheckBoxes。我使用 Swing 布局管理器来创建 JPanels

到目前为止,很基本。创建 JTable 需要一些努力。我想将商品价格显示为货币,但这对于这个示例 GUI 来说并不重要。

我创建了一个 ActionListener 以在 JTable 中添加和删除列。我不得不做一些实验。 TablecolumnModel addcolumn 方法将列附加到表中。

我必须创建一个 DisplayTablecolumn 类来保存 Tablecolumn 和一个告诉我是否显示 Tablecolumn 的布尔值。我最终从 JTable 中删除了所有列并将所有列添加回 JTable便我可以保持列顺序。我可能运行了 100 次测试,然后才能让这段代码发挥作用。

代码

这是完整的可运行代码。

import java.awt.borderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.borderFactory;
import javax.swing.JcheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.Tablecolumn;
import javax.swing.table.TablecolumnModel;

public class JcheckBoxTableGUI implements Runnable {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new JcheckBoxTableGUI());
    }
    
    private final Inventory inventory;
    
    private final InventoryTableModel tableModel;
    
    private JFrame frame;
    
    private JTable table;
    
    public JcheckBoxTableGUI() {
        this.tableModel = new InventoryTableModel();
        this.inventory = new Inventory();
        
        String[] columns = inventory.getTableHeader();
        for (String column : columns) {
            tableModel.addcolumn(column);
        }
        
        List<Item> items = inventory.geTinventory();
        for (Item item : items) {
            Object[] object = new Object[5];
            object[0] = item.getItemnumber();
            object[1] = item.getItemname();
            object[2] = item.getItemDescription();
            object[3] = item.getItemQuantity();
            object[4] = item.getItemPrice();
            tableModel.addRow(object);
        }
    }

    @Override
    public void run() {
        frame = new JFrame("JcheckBox Table GUI");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        frame.add(createTablePanel(),BorderLayout.CENTER);
        frame.add(createSELEctionPanel(),BorderLayout.AFTER_LINE_ENDS);
        
        frame.pack();
        frame.setLOCATIOnByPlatform(true);
        frame.setVisible(true);
    }
    
    private JPanel createTablePanel() {
        JPanel panel = new JPanel(new BorderLayout());
        panel.setBorder(BorderFactory.createEmptyBorder(5,5,5));
        
        table = new JTable(tableModel);
        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        table.getcolumnModel().getcolumn(0).setPreferredWidth(100);
        table.getcolumnModel().getcolumn(1).setPreferredWidth(150);
        table.getcolumnModel().getcolumn(2).setPreferredWidth(150);
        table.getcolumnModel().getcolumn(3).setPreferredWidth(100);
        table.getcolumnModel().getcolumn(4).setPreferredWidth(100);
        JScrollPane scrollPane = new JScrollPane(tablE);
        scrollPane.setPreferredSize(new Dimension(620,300));
        panel.add(scrollPane,BorderLayout.CENTER);
        
        return panel;
    }
    
    private JPanel createSELEctionPanel() {
        JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEADING,0));
        panel.setBorder(BorderFactory.createEmptyBorder(5,5));
        
        JPanel innerPanel = new JPanel(new GridLayout(0,1,5));
        
        columnListener listener = new columnListener(this);
        String[] columns = inventory.getTableHeader();
        for (String column : columns) {
            JcheckBox checkBox = new JcheckBox("Display " +  column);
            checkBox.addActionListener(listener);
            checkBox.setActionCommand(column);
            checkBox.setSELEcted(true);
            innerPanel.add(checkBoX);
        }
        
        panel.add(innerPanel);
        
        return panel;
    }
    
    public JTable getTable() {
        return table;
    }
    
    public JFrame getFrame() {
        return frame;
    }
    
    public class columnListener implements ActionListener {
        
        private final JcheckBoxTableGUI frame;
        
        private final List<DisplayTablecolumn> displaycolumns;

        public columnListener(JcheckBoxTableGUI framE) {
            this.frame = frame;
            this.displaycolumns = new ArrayList<>();
            
            TablecolumnModel tcm = frame.getTable().getcolumnModel();
            for (int index = 0; index < tcm.getcolumnCount(); index++) {
                Tablecolumn tc = tcm.getcolumn(indeX);
                displaycolumns.add(new DisplayTablecolumn(tc,truE));
            }
        }

        @Override
        public void actionPerformed(ActionEvent event) {
            JcheckBox checkBox =  (JcheckBoX) event.getsource();
            String column = event.getActionCommand();
            TablecolumnModel tcm = frame.getTable().getcolumnModel();
            
            for (int index = 0; index < displaycolumns.size(); index++) {
                DisplayTablecolumn dtc = displaycolumns.get(indeX);
                if (dtc.isShowTablecolumn()) {
                    tcm.removecolumn(dtc.getTablecolumn());
                }
            }
            
            int columnIndex = getcolumnIndex(column);
            displaycolumns.get(columnIndeX).setShowTablecolumn(
                    checkBox.isSELEcted());
            
            for (int index = 0; index < displaycolumns.size(); index++) {
                DisplayTablecolumn dtc = displaycolumns.get(indeX);
                if (dtc.isShowTablecolumn()) {
                    tcm.addcolumn(dtc.getTablecolumn());
                }
            }
            
            frame.getFrame().pack();
        }
        
        privatE int getcolumnIndex(String column) {
            for (int index = 0; index < displaycolumns.size(); index++) {
                DisplayTablecolumn dtc = displaycolumns.get(indeX);
                if (column.equals(dtc.getTablecolumn().getHeaderValue())) {
                    return index;
                }
            }
            
            return -1;
        }
        
    }
    
    public class DisplayTablecolumn {
        
        private @R_616_8487@an showTablecolumn;
        
        private final Tablecolumn tablecolumn;

        public DisplayTablecolumn(Tablecolumn tablecolumn,@R_616_8487@an showTablecolumn) {
            this.tablecolumn = tablecolumn;
            this.showTablecolumn = showTablecolumn;
        }

        public @R_616_8487@an isShowTablecolumn() {
            return showTablecolumn;
        }

        public void setShowTablecolumn(@R_616_8487@an showTablecolumn) {
            this.showTablecolumn = showTablecolumn;
        }

        public Tablecolumn getTablecolumn() {
            return tablecolumn;
        }
        
    }
    
    public class InventoryTableModel extends DefaultTableModel {

        private static final long serialVersionUID = 1L;

        @Override
        public Class<?> getcolumnClass(int columnIndeX) {
            if (columnIndex <= 2) {
                return String.class;
            } else if (columnIndex == 3) {
                return Integer.class;
            } else {
                return Integer.class;
            }
        }

    }
    
    public class Inventory {
        
        private final List<Item> inventory;
        
        private final String[] tableHeader;
        
        public Inventory() {
            this.tableHeader = new String[] { "Item number","Item Name","Item Description","Item Quantity","Item Price" };
            
            this.inventory = new ArrayList<>();
            
            inventory.add(new Item("X101111","Samsung Camera"," ",20,69.99));
            inventory.add(new Item("X101112","Samsung Monitor",10,279.99));
            inventory.add(new Item("X101113","Samsung smartphone",110,599.99));
            inventory.add(new Item("X101114","Apple Watch",1259.99));
            inventory.add(new Item("X101115","Sony Playstation 5",399.99));
        }

        public String[] getTableHeader() {
            return tableHeader;
        }

        public List<Item> geTinventory() {
            return inventory;
        }
        
    }
    
    public class Item {
        
        privatE int itemPrice;
        privatE int itemQuantity;
        
        private final String itemnumber;
        private final String itemname;
        private final String itemDescription;
        
        public Item(String itemnumber,String itemname,String itemDescription,int itemQuantity,double itemPricE) {
            this.itemnumber = itemnumber;
            this.itemname = itemname;
            this.itemDescription = itemDescription;
            this.itemQuantity = itemQuantity;
            setItemPrice(itemPricE);
        }

        public int getItemPrice() {
            return itemPrice;
        }

        public void setItemPrice(double itemPricE) {
            this.itemPrice = (int) Math.round(itemPrice * 100.0);
        }

        public int getItemQuantity() {
            return itemQuantity;
        }

        public void setItemQuantity(int itemQuantity) {
            this.itemQuantity = itemQuantity;
        }

        public String getItemnumber() {
            return itemnumber;
        }

        public String getItemname() {
            return itemname;
        }

        public String getItemDescription() {
            return itemDescription;
        }
        
    }

}
,

这仅演示了如何创建一个基本的 MRE:

  1. csv 文件无关紧要。
  2. 模型中的数据不相关。
  3. 您的 loadFile、newFile 和 saveFile 按钮无关紧要。
  4. TableModel 无关

您的问题是关于将 ActionListener 添加到基于表的列动态创建的复选框。

所以您只需要一个包含一些列和结果复选框的表格。

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

public class MRE extends JPanel
{
    private static void createAndShowGUI()
    {
        JTable table = new JTable(5,7);
        table.setPreferredScrollableViewportSize(table.getPreferredSize());
        JScrollPane scrollPane = new JScrollPane( table );

        JPanel buttons = new JPanel( new GridLayout(0,1) );

        for (int i = 0; i < table.getcolumnCount(); i++)
        {
            String column = table.getcolumnName(i);
            JcheckBox checkBox = new JcheckBox("Display " + column);
            checkBox.setSELEcted( true );
            buttons.add( checkBox );
        }

        JPanel wrapper = new JPanel();
        wrapper.add( buttons );

        JFrame frame = new JFrame("MRE");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(scrollPane,BorderLayout.CENTER);
        frame.add(wrapper,BorderLayout.LINE_END);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLOCATIOnByPlatform( true );
        frame.setVisible( true );
    }

    public static void main(String[] args) throws Exception
    {
        SwingUtilities.invokeLater( () -> createAndShowGUI() );
    }
}

如果您可以修改它以演示如何使用“可重用类”来管理列可见性,那么我将更新上面的代码以使用我的可重用类以及 4 行额外代码。

编辑:

对代码的改进建议:

  1. 使代码可重用且自包含
  2. 不要使用静态方法
  3. 不要更改数据。

您最初的问题是:

How do I add an ActionListener to a JcheckBox?

所以要做到这一点,你需要一个类:

  1. 实现一个 ActionListener
  2. 自包含以实现您需要的功能。

所以基本结构可能如下所示:

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

public class SomeFunction implements ActionListener
{
    private JTable table;

    public SomeFunction(JTable tablE)
    {
        this.table = table;
    }

    @Override
    public void actionPerformed(ActionEvent E)
    {
        if (e.getsource() instanceof AbstractButton)
        {
            String command = e.getActionCommand();
            AbstractButton button = (AbstractButton)e.getsource();

            if (button.isSELEcted())
                doSELEcted( command );
            else
                doUnSELEcted( command );
        }
    }

    private void doSELEcted(String command)
    {
        System.out.println(command + " SELEcted");
    }

    private void doUnSELEcted(String command)
    {
        System.out.println(command + " unSELEcted");
    }

    private static void createAndShowGUI()
    {
        JTable table = new JTable(5,1) );
        SomeFunction listener = new SomeFunction( table ); // added
//      TablecolumnManager listener = new TablecolumnManager(table,falsE);
//      columnListener listener = new columnListener();

        for (int i = 0; i < table.getcolumnCount(); i++)
        {
            String column = table.getcolumnName(i);
            JcheckBox checkBox = new JcheckBox("Display " + column);
            checkBox.setSELEcted( true );
            checkBox.setActionCommand( column ); // added
            checkBox.addActionListener( listener ); // added
            buttons.add( checkBox );
        }

        JPanel wrapper = new JPanel();
        wrapper.add( buttons );

        JFrame frame = new JFrame("MRE");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(scrollPane,BorderLayout.LINE_END);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLOCATIOnByPlatform( true );
        frame.setVisible( true );
    }

    public static void main(String[] args) throws Exception
    {
        SwingUtilities.invokeLater( () -> createAndShowGUI() );
    }
}

无论你的函数做什么,它只需要知道它应该执行的表。

因此尝试将您的代码重组为可重用的类。

如果您想使用 Gilberts 代码,那么您需要将 columnListener 类重组为一个单独的可重用自包含类。

最后你也可以试试我的可重用类。查看 Table column Manager 以下载课程。

无论您决定使用什么可重用类,您只需更改上述示例中的一行代码(一旦您的功能包含在可重用类中)。

注意静态方法不会成为最终类的一部分。它们只是为了简化 MRE 在单个类文件中的测试和发布。

希望这有助于未来的设计虑。

大佬总结

以上是大佬教程为你收集整理的如何将 ActionListener 添加到 JCheckBox? 问题当前解决方案全部内容,希望文章能够帮你解决如何将 ActionListener 添加到 JCheckBox? 问题当前解决方案所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。