2015-11-01 2 views
1

Я застрял в течение двух дней на куске кода, ячейки моей таблицы не редактируются по умолчанию, и я хочу редактировать, когда я нажимаю кнопку редактирования, но я не могу запустить эту код. Заранее благодарю вас за помощь.Сделать ячейку редактируемой с помощью JButton

table = new JTable(model) { 
    public boolean isCellEditable(int row, int column) { 
     return false; 
    } 
}; 
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
sorter = new TableRowSorter <TableModel> (model); 
table.setPreferredScrollableViewportSize(new Dimension(560, 200)); 
JScrollPane scrollpane = new JScrollPane((table)); 
table.setRowSorter(sorter); 
add(ScrollPane); 
scrollPane.setBounds(10, 180, 560, 200); 
table.setRowHeight(28); 
table.setBackground(Color.DARK_GRAY); 
table.setForeground(Color.WHITE); 
modifier.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     if ((JButton) e.getSource() == change) { 
      boolean isCellEditable(int row, int column) { 
       return true; 
      } 
     } 
    } 
}); 

ответ

1

Put включена ячейка (строка, столбец) к набору и сделать ваше использование таблицы, которые устанавливают, чтобы проверить, если ячейка включена.

package javaapplication33; 

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import javax.swing.JFrame; 
import javax.swing.JButton; 
import javax.swing.JPanel; 
import javax.swing.JTable; 
import javax.swing.JLabel; 
import javax.swing.ListSelectionModel; 
import javax.swing.JScrollPane; 
import javax.swing.Action; 
import javax.swing.AbstractAction; 
import javax.swing.JTextField; 
import java.awt.Point; 
import java.awt.event.ActionEvent; 
import java.util.Set; 
import java.util.HashSet; 
import java.util.Collection; 
import java.awt.EventQueue; 
import javax.swing.Box; 
import java.awt.Color; 
import javax.swing.BoxLayout; 
import javax.swing.table.AbstractTableModel; 


public class JavaApplication33 
{  

    public static void main(String[] args) 
    { 

     Runnable r = new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       JFrame f = new JFrame(); 
       f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

       JPanel p = new JPanel(new BorderLayout());     
       p.setPreferredSize(new Dimension(300,300)); 

       final Set<Point> erc = new HashSet<>(); //this set contains (row,cell) pairs of editable cells 

       //put some data to the table 
       final JTable table = new JTable(new String[][] 
        {{"a", "aa"}, 
        {"b", "bb"}, 
        {"c", "cc"}}, 
         new String[]{"col1", "col2"}) //name columns 
       {      
        Collection<Point> editableRowsCells = erc; 
        Collection<Point> getEditableRowsCells() 
        { 
         return editableRowsCells; 
        }      
        public boolean isCellEditable(int row, int column) 
        { 
         return getEditableRowsCells() 
           .contains(new Point(row, column)); 
        } 
       }; 

       table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);     
       JScrollPane scrollpane = new JScrollPane(table); 

       p.add(scrollpane, BorderLayout.CENTER); 

       table.setRowHeight(28); 
       table.setBackground(Color.DARK_GRAY); 
       table.setForeground(Color.WHITE); 

       final JTextField xf = new JTextField(); 
       final JTextField yf = new JTextField(); 
       Action enableAction = new AbstractAction("Enable") 
       { 

        @Override 
        public void actionPerformed(ActionEvent e) 
        { 
         int row = Integer.valueOf(xf.getText()); 
         int col = Integer.valueOf(yf.getText()); 
         erc.add(new Point(row,col)); 
         ((AbstractTableModel) table.getModel()) 
           .fireTableCellUpdated(row, col); 
        } 
       }; 
       JButton enableButton = new JButton(); 
       enableButton.setAction(enableAction); 
       Box b = new Box(BoxLayout.X_AXIS); 
       b.add(new JLabel("Row")); 
       b.add(xf); 
       b.add(new JLabel("Col"));     
       b.add(yf); 
       b.add(enableButton); 

       p.add(b, BorderLayout.NORTH); 

       f.add(p); 
       f.pack(); 
       f.setVisible(true); 
      } 
     }; 
     EventQueue.invokeLater(r); 
    } 

} 

Это выход:

enter image description here

Update: , чтобы сделать все ячейки редактируемые

package javaapplication33; 

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import javax.swing.JFrame; 
import javax.swing.JButton; 
import javax.swing.JPanel; 
import javax.swing.JTable; 
import javax.swing.ListSelectionModel; 
import javax.swing.JScrollPane; 
import javax.swing.Action; 
import javax.swing.AbstractAction; 
import java.awt.event.ActionEvent; 
import java.awt.EventQueue; 
import java.awt.Color; 
import javax.swing.table.AbstractTableModel; 

public class JavaApplication33 
{ 

    public static class Toggle 
    { 
     Boolean val; 

     public Toggle(Boolean val) 
     { 
      this.val = val; 
     } 

     public void setVal(Boolean val) 
     { 
      this.val = val; 
     } 

     public Boolean getVal() 
     { 
      return val; 
     } 

     public void toggle() 
     { 
      setVal(!getVal()); 
     } 
    } 

    public static void main(String[] args) 
    { 
     Runnable r = new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       JFrame f = new JFrame(); 
       f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

       JPanel p = new JPanel(new BorderLayout()); 
       p.setPreferredSize(new Dimension(300, 300)); 

       final Toggle editable = new Toggle(false); 

       final JTable table = new JTable(
         new String[][]{ 
          {"a", "aa"}, 
          {"b", "bb"}, 
          {"c", "cc"}}, 
         new String[] {"col1", "col2"}) //name columns 
         {       
          public boolean isCellEditable(int row, int column) 
          { 
           return editable.getVal(); //request current value 
          } 
         }; 

       table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
       JScrollPane scrollpane = new JScrollPane(table); 

       p.add(scrollpane, BorderLayout.CENTER); 

       table.setRowHeight(28); 
       table.setBackground(Color.DARK_GRAY); 
       table.setForeground(Color.WHITE); 

       Action enableAction = new AbstractAction("Toggle editable") 
       { 
        @Override 
        public void actionPerformed(ActionEvent e) 
        { 
         editable.toggle(); //toggle current value 
         ((AbstractTableModel) table.getModel()).fireTableStructureChanged(); 
        } 
       }; 
       JButton enableButton = new JButton(); 
       enableButton.setAction(enableAction); 

       p.add(enableButton, BorderLayout.NORTH); 

       f.add(p); 
       f.pack(); 
       f.setVisible(true); 
      } 
     }; 
     EventQueue.invokeLater(r); 
    } 
} 

Выход:

enter image description here

+0

Но почему я буду вынужден проходить через JTextField, просто кнопку, которая помещает все редактируемые ячейки в редактируемые, потому что моя поправка будет сделана в базе данных. – Recay

+0

. Тогда еще проще сделать все ячейки доступными для редактирования. Это то, что вы хотите: сделать ** все ячейки редактируемыми **? – Willmore

+0

Аллилуйя спасибо вам большое спасибо Spooliecookie – Recay

0

Вот мой код:

table = new JTable(model){ 
       public boolean isCellEditable(int row, int column) { 

        return false; 
       } 

      }; 
       modifier.addActionListener(new ActionListener() 
      { 
       public void actionPerformed(ActionEvent e) 
       { 
        if ((JButton)e.getSource()== modifier) 
        { 
          public boolean isCellEditable(int row, int column) { 

           return true; 

          } 
         } 
       }  

      }); 
Смежные вопросы