簡體   English   中英

在JTable中禁用JButton

[英]Disabling JButton Inside JTable

我試圖制作一個應用程序,它將從數據庫中檢索一些數據並將數據填充到JTable中。 在表中將有2個按鈕,它們將更新數據庫列的狀態字段(這是該行的模型的自定義對象)。

完成此操作后,該行/對象的第一個按鈕將被禁用,第二個按鈕將被啟用。

我嘗試使用JButtonColumn作為測試,但是問題是當我單擊2個不同的按鈕時,它們之間的其他按鈕也被禁用。 到目前為止,這是我嘗試過的:

import java.awt.event.ActionEvent;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;

public class JavaApplication1 extends JFrame {

    private static final long serialVersionUID = 1L;
    private JTable table;
    private MyTableModel myModel = new MyTableModel();

    public JavaApplication1() {


        table = new JTable(myModel);
        addTableDatas();
        table.setPreferredScrollableViewportSize(table.getPreferredSize());
        JScrollPane scrollPane = new JScrollPane(table);
        add(scrollPane);
        ButtonColumn buttonColumn = new ButtonColumn(table, delete, 3);
        buttonColumn.setMnemonic(KeyEvent.VK_D);
    }

    public static void main(String[] args) {
        JavaApplication1 frame = new JavaApplication1();
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }

    private void addTableDatas() {
        Vector<String> columnNameS = new Vector<String>();
        columnNameS.add("Date");
        columnNameS.add("String");
        columnNameS.add("Decimal");
        columnNameS.add("Remove");
        myModel.setColumnNames(columnNameS);

        Vector<Object> row1 = new Vector<Object>();
        row1.add(new Date());
        row1.add("A");
        row1.add(new Double(5.1));
        row1.add("Remove");
        myModel.addRow(row1);

        row1 = new Vector<Object>();
        row1.add(new Date());
        row1.add("B");
        row1.add(new Double(6.2));
        row1.add("Remove");
        myModel.addRow(row1);

        row1 = new Vector<Object>();
        row1.add(new Date());
        row1.add("B");
        row1.add(new Double(8.4));
        row1.add("Remove");
        myModel.addRow(row1);

        row1 = new Vector<Object>();
        row1.add(new Date());
        row1.add("B");
        row1.add(new Double(5.1));
        row1.add("Remove");
        myModel.addRow(row1);

        row1 = new Vector<Object>();
        row1.add(new Date());
        row1.add("B");
        row1.add(new Double(6.2));
        row1.add("Remove");
        myModel.addRow(row1);
    }

    private class MyTableModel extends AbstractTableModel {

        private static final long serialVersionUID = 1L;
        private Vector<Vector<Object>> data;
        private Vector<String> colNames;
        private boolean[] _columnsVisible = {true, true, true, true};

        public MyTableModel() {
            this.colNames = new Vector<String>();
            this.data = new Vector<Vector<Object>>();
        }

        public MyTableModel(Vector<String> colnames) {
            this.colNames = colnames;
            this.data = new Vector<Vector<Object>>();
        }

        public void resetTable() {
            this.colNames.removeAllElements();
            this.data.removeAllElements();
        }

        public void setColumnNames(Vector<String> colNames) {
            this.colNames = colNames;
            this.fireTableStructureChanged();
        }

        public void addRow(Vector<Object> data) {
            this.data.add(data);
            this.fireTableRowsInserted(data.size() - 1, data.size() - 1);
        }

        public void removeRowAt(int row) {
            this.data.removeElementAt(row);
            this.fireTableRowsDeleted(row - 1, data.size() - 1);
        }

        @Override
        public int getColumnCount() {
            return this.colNames.size();
        }

        @Override
        public Class<?> getColumnClass(int colNum) {
            switch (colNum) {
                case 0:
                    return Date.class;
                case 2:
                    return Double.class;
                default:
                    return String.class;
            }
        }

        @Override
        public boolean isCellEditable(int row, int colNum) {
            switch (colNum) {
                default:
                    return true;
            }
        }

        @Override
        public String getColumnName(int colNum) {
            return this.colNames.get(colNum);
        }

        @Override
        public int getRowCount() {
            return this.data.size();
        }

        @Override
        public Object getValueAt(int row, int col) {
            Vector<Object> value = this.data.get(row);
            return value.get(col);
        }

        @Override
        public void setValueAt(Object newVal, int row, int col) {
            Vector<Object> aRow = data.elementAt(row);
            aRow.remove(col);
            aRow.insertElementAt(newVal, col);
            fireTableCellUpdated(row, col);
        }

        public void setColumnVisible(int index, boolean visible) {
            this._columnsVisible[index] = visible;
            this.fireTableStructureChanged();
        }
    }
    //
    private Action delete = new AbstractAction() {

        private static final long serialVersionUID = 1L;

        public void actionPerformed(ActionEvent e)
        {
            JTable table = (JTable) e.getSource();
            int modelRow = Integer.valueOf(e.getActionCommand());
            //(MyTableModel) table.getModel()).removeRowAt(modelRow);

            //table.clearSelection();
        }
    };
}

JButtonColumn.Java:

  import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; import javax.swing.table.*; public class ButtonColumn extends AbstractCellEditor implements TableCellRenderer, TableCellEditor, ActionListener,MouseListener { private JTable table; private Action action; private int mnemonic; private Border originalBorder; private Border focusBorder; private JButton renderButton; private JButton editButton; private Object editorValue; private boolean isButtonColumnEditor; public ButtonColumn(JTable table, Action action, int column) { this.table = table; this.action = action; renderButton = new JButton(); editButton = new JButton(); editButton.setFocusPainted( false ); editButton.addActionListener( this ); originalBorder = editButton.getBorder(); setFocusBorder( new LineBorder(Color.BLUE) ); TableColumnModel columnModel = table.getColumnModel(); columnModel.getColumn(column).setCellRenderer( this ); columnModel.getColumn(column).setCellEditor( this ); table.addMouseListener( this ); } public Border getFocusBorder() { return focusBorder; } public void setFocusBorder(Border focusBorder) { this.focusBorder = focusBorder; editButton.setBorder( focusBorder ); } public int getMnemonic() { return mnemonic; } public void setMnemonic(int mnemonic) { this.mnemonic = mnemonic; renderButton.setMnemonic(mnemonic); editButton.setMnemonic(mnemonic); } @Override public Component getTableCellEditorComponent(JTable table, Object value,boolean isSelected, int row, int column) { if (value == null) { editButton.setText( "" ); editButton.setIcon( null ); } else if (value instanceof Icon) { editButton.setText( "" ); editButton.setIcon( (Icon)value ); } else { editButton.setText( value.toString() ); editButton.setIcon( null ); } this.editorValue = value; return editButton; } @Override public Object getCellEditorValue() { return editorValue; } public Component getTableCellRendererComponent( JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if (isSelected) { renderButton.setForeground(table.getSelectionForeground()); renderButton.setBackground(table.getSelectionBackground()); } else { renderButton.setForeground(table.getForeground()); renderButton.setBackground(UIManager.getColor("Button.background")); } if (hasFocus) { renderButton.setBorder( focusBorder ); } else { renderButton.setBorder( originalBorder ); } if (value == null) { renderButton.setText( "" ); renderButton.setIcon( null ); } else if (value instanceof Icon) { renderButton.setText( "" ); renderButton.setIcon( (Icon)value ); } else { renderButton.setText( value.toString() ); renderButton.setIcon( null ); } return renderButton; } public void actionPerformed(ActionEvent e) { int row = table.convertRowIndexToModel( table.getEditingRow() ); fireEditingStopped(); // Invoke the Action ActionEvent event = new ActionEvent( table, ActionEvent.ACTION_PERFORMED, "" + row); action.actionPerformed(event); } public void mousePressed(MouseEvent e) { if (table.isEditing() && table.getCellEditor() == this) isButtonColumnEditor = true; } public void mouseReleased(MouseEvent e) { if (isButtonColumnEditor && table.isEditing()) table.getCellEditor().stopCellEditing(); //Disabling the button here renderButton.setEnabled(false); System.out.println("ROW CLICKED"); isButtonColumnEditor = false; } public void mouseClicked(MouseEvent e) {} public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {} } 

該類是ButtonColumn 請參閱: 表格按鈕列

您不能只禁用編輯器中的按鈕。 該按鈕由表中的所有行共享。 這是所有渲染器/編輯器工作的方式。

您將需要自定義渲染器/編輯器代碼。 也就是說,您將需要重寫TableModel的isCellEditable(...) ,以根據表中的數據確定何時可編輯單元格:

  1. 如果尚未更新數據庫狀態,那么button1將是可編輯的,而button2將是不可編輯的
  2. 如果您已更新數據庫狀態,則button1將不可編輯,而button2將可編輯

然后,您可以自定義渲染器中按鈕的禁用狀態:

  1. 如果單元格可編輯,則按鈕狀態為啟用
  2. 如果單元格不可編輯,則按鈕狀態為禁用。

閱讀Swing教程中有關如何使用表的部分, 獲取有關渲染器/編輯器和isCellEditable()方法的更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM