有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何区分两个同名的JButton

我正在开发一个swing应用程序,其中需要有删除按钮。根据单击的按钮,每个单击的删除按钮最终将从不同的文件中删除一行。问题是我不能按名称区分这两个按钮,因为它们都与“删除”同名。我不想给它们起不同的名字,因为我可能有很多这样的删除按钮。是否有其他属性,如ID或我可以分配给他们的东西


共 (3) 个答案

  1. # 1 楼答案

    如果坚持使用单个actionListener,则只需存储对按钮的引用,以便这些引用在action listener中可用:

     JButton button1 = new JButton("Delete");
     JButton button2 = new JButton("Delete");
    

    然后在action listener中:

       Object src = event.getSource();
       if ( src == button1 ) {
          // perform the action for button1
       } else if ( scr ==  button2 ) {
         // perform the action for button2
       }
    
  2. # 2 楼答案

    避免使用“交换机”侦听器,而是为每个JButton提供自己的操作对象,该对象是通过重写AbstractAction创建的。AbstractAction甚至可以是同一个类的对象,但它也有一个对感兴趣的文件或字符串集合的引用,以便对正确的项执行删除操作

    另一个选项是通过HashMap<JButton, ActionableType>将按钮与需要对其执行操作的对象相关联

    下面是两个合并到一个程序中的示例。右边的JPanel包含一行字对和一个delete JButton,JButton与包含字对的JLabel紧密相连,因为它们都保存在一个公共对象WordPairRow中。有一个ActionListener类被添加到每个delete JButton中,但它被传递唯一的WordPairRow和容器JPanel,容器JPanel包含所有组件:

    wpRow.addDeleteListener(new DeleteAction(container, wpRow));
    

    如果按下任何删除按钮,则该行单词和按钮将从容器中移除

    也许更好的解决方案是使用自定义表模型在JTable中显示单词对。在这个模型中,第三列布尔值显示为一个复选框。选中JTable下方的“删除选中行”按钮时,所有选中的行都将从JTable中删除。稍后,当您想要提取已更改的列表时,只需在表模型中迭代,提取剩余的单词

    import java.awt.BorderLayout;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.Insets;
    import java.awt.event.*;
    import java.io.InputStream;
    import java.util.Scanner;
    import java.util.Vector;
    
    import javax.swing.*;
    import javax.swing.table.DefaultTableModel;
    
    @SuppressWarnings("serial")
    public class WordPairTest extends JPanel {
        private static final String DATA_FILE_NAME = "WordPair.txt";
        private JPanel wordListPanel = new JPanel(new GridBagLayout());
        private WordPairTableModel tableModel = new WordPairTableModel();
        private JTable table = new JTable(tableModel);
    
        public WordPairTest(Scanner scanner) {
            int rowNumber = 0;
            while (scanner.hasNextLine()) {
                String line = scanner.nextLine();
                String[] tokens = line.split("\\s*,\\s*");
                if (tokens.length == 2) {
                    WordPairRow wpRow = new WordPairRow(tokens[0], tokens[1]);
                    addRowToList(rowNumber, wordListPanel, wpRow);
                    rowNumber++;
    
                    tableModel.addRow(tokens[0], tokens[1]);
                }
            }
    
            JPanel btnPanel = new JPanel();
            btnPanel.add(new JButton(new DeleteCheckedRowsAction(tableModel)));
    
            JPanel tablePanel = new JPanel(new BorderLayout());
            tablePanel.add(new JScrollPane(table));
            tablePanel.add(btnPanel, BorderLayout.PAGE_END);
    
            setLayout(new BoxLayout(this, BoxLayout.LINE_AXIS));
            add(wordListPanel);
            add(tablePanel);
        }
    
        private void addRowToList(int row, JPanel container, WordPairRow wpRow) {
            container.add(wpRow.getFirstWord(), createGbc(0, row));
            container.add(wpRow.getSecondWord(), createGbc(1, row));
            container.add(wpRow.getDeleteBtn(), createGbc(2, row));
    
            wpRow.addDeleteListener(new DeleteAction(container, wpRow));
        }
    
        private GridBagConstraints createGbc(int x, int y) {
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.insets = new Insets(5, 5, 5, 5);
            gbc.gridx = x;
            gbc.gridy = y;
            gbc.weightx = 1.0;
            gbc.weighty = 1.0;
            gbc.fill = GridBagConstraints.HORIZONTAL;
    
            return gbc;
        }
    
        private static void createAndShowGui() {
            InputStream resource = WordPairTest.class
                    .getResourceAsStream(DATA_FILE_NAME);
            Scanner scanner = new Scanner(resource);
    
            JFrame frame = new JFrame("WordPairTest");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.getContentPane().add(new WordPairTest(scanner));
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
            scanner.close();
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    createAndShowGui();
                }
            });
        }
    }
    
    class WordPairRow {
        private JLabel firstWord = new JLabel("");
        private JLabel secondWord = new JLabel("");
        private JButton deleteBtn = new JButton("Delete");
    
        public WordPairRow(String word1, String word2) {
            firstWord.setText(word1);
            secondWord.setText(word2);
        }
    
        public JLabel getFirstWord() {
            return firstWord;
        }
    
        public JLabel getSecondWord() {
            return secondWord;
        }
    
        public JButton getDeleteBtn() {
            return deleteBtn;
        }
    
        public void addDeleteListener(ActionListener listener) {
            deleteBtn.addActionListener(listener);
        }
    }
    
    class DeleteAction implements ActionListener {
        private JPanel container;
        private WordPairRow wpRow;
    
        public DeleteAction(JPanel container, WordPairRow wpRow) {
            this.container = container;
            this.wpRow = wpRow;
        }
    
        @Override
        public void actionPerformed(ActionEvent e) {
            container.remove(wpRow.getFirstWord());
            container.remove(wpRow.getSecondWord());
            container.remove(wpRow.getDeleteBtn());
            container.revalidate();
            container.repaint();
        }
    }
    
    @SuppressWarnings("serial")
    class WordPairTableModel extends DefaultTableModel {
        private static final String[] COLUMNS = { "First Word", "Second Word", "" };
    
        public WordPairTableModel() {
            super(COLUMNS, 0);
        }
    
        public void addRow(String word1, String word2) {
            Vector<Object> rowData = new Vector<>();
            rowData.add(word1);
            rowData.add(word2);
            rowData.add(Boolean.FALSE);
            super.addRow(rowData);
        }
    
        @Override
        public Class<?> getColumnClass(int columnIndex) {
            if (getRowCount() > 0) {
                Object item = getValueAt(0, columnIndex);
                if (item != null) {
                    return item.getClass();
                }
            }
            return super.getColumnClass(columnIndex);
        }
    
        @Override
        public boolean isCellEditable(int row, int column) {
            return column == 2;
        }
    }
    
    @SuppressWarnings("serial")
    class DeleteCheckedRowsAction extends AbstractAction {
        private WordPairTableModel tableModel;
    
        public DeleteCheckedRowsAction(WordPairTableModel tableModel) {
            super("Delete Checked Rows");
            this.tableModel = tableModel;
        }
    
        @Override
        public void actionPerformed(ActionEvent e) {
            for (int row = tableModel.getRowCount() - 1; row >= 0; row ) {
                Boolean check = (Boolean) tableModel.getValueAt(row, 2);
                if (check) {
                    tableModel.removeRow(row);
                }
            }
        }
    }
    

    数据文件:

    hello, goodbye
    hola, adiós
    shalom, shalom
    bonjour, au revoir 
    buongiorno, arrivederci 
    hyvaa paivaa, nakemiin 
    tere, nagemist 
    kuei, niaut 
    konnichiwa, sayonara 
    privet, dosvidanya 
    ahoj, cau
    cześć, do widzenia
    merhaba, elveda
    hallo, vaarwel
    saluton, adiaŭ
    

    GUI外观:

    enter image description here

  3. # 3 楼答案

    这个问题可以通过设置按钮的ActionCommand来解决。默认情况下,如果我们没有设置ActionCommand,那么按钮的名称将设置为action command。我做了以下几件事:

    JButton delete = new JButton("Delete");
     delete.setActionCommand("action1");'
    

    然后在ActionListener中,我可以检查

    event.getAactionCommand.equlas("action1")