Java by API/javax.swing.table/TableCellEditor

Материал из Java эксперт
Перейти к: навигация, поиск

implements TableCellEditor

   <source lang="java">

import java.awt.BorderLayout; import java.awt.Color; import java.awt.ruponent; import java.awt.GridLayout; import java.awt.Point; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.EventObject; import java.util.Vector; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSlider; import javax.swing.JTable; import javax.swing.JWindow; import javax.swing.SwingConstants; import javax.swing.event.CellEditorListener; import javax.swing.event.ChangeEvent; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableCellEditor; import javax.swing.table.TableCellRenderer; public class MainClass extends JFrame {

 public MainClass() {
   super("Customer Editor Test");
   setSize(600, 160);
   setDefaultCloseOperation(EXIT_ON_CLOSE);
   MixerModel test = new MixerModel();
   JTable jt = new JTable(test);
   jt.setDefaultRenderer(Volume.class, new VolumeRenderer());
   jt.setDefaultEditor(Volume.class, new VolumeEditor());
   JScrollPane jsp = new JScrollPane(jt);
   getContentPane().add(jsp, BorderLayout.CENTER);
 }
 public static void main(String args[]) {
   MainClass mt = new MainClass();
   mt.setVisible(true);
 }

} class MixerModel extends AbstractTableModel {

 String headers[] = { "Track", "Start", "Stop", "Left Volume", "Right Volume" };
 Class columnClasses[] = { String.class, String.class, String.class, Volume.class, Volume.class };
 Object data[][] = { { "Bass", "0:00:000", "1:00:000", new Volume(56), new Volume(56) },
     { "Strings", "0:00:000", "0:52:010", new Volume(72), new Volume(52) },
     { "Brass", "0:08:000", "1:00:000", new Volume(99), new Volume(0) },
     { "Wind", "0:08:000", "1:00:000", new Volume(0), new Volume(99) }, };
 public int getRowCount() {
   return data.length;
 }
 public int getColumnCount() {
   return headers.length;
 }
 public Class getColumnClass(int c) {
   return columnClasses[c];
 }
 public String getColumnName(int c) {
   return headers[c];
 }
 public boolean isCellEditable(int r, int c) {
   return true;
 }
 public Object getValueAt(int r, int c) {
   return data[r][c];
 }
 public void setValueAt(Object value, int r, int c) {
   if (c >= 3) {
     ((Volume) data[r][c]).setVolume(value);
   } else {
     data[r][c] = value;
   }
 }

} class Volume {

 private int volume;
 public Volume(int v) {
   setVolume(v);
 }
 public Volume() {
   this(50);
 }
 public void setVolume(int v) {
   volume = (v < 0 ? 0 : v > 100 ? 100 : v);
 }
 public void setVolume(Object v) {
   if (v instanceof String) {
     setVolume(Integer.parseInt((String) v));
   } else if (v instanceof Number) {
     setVolume(((Number) v).intValue());
   } else if (v instanceof Volume) {
     setVolume(((Volume) v).getVolume());
   }
 }
 public int getVolume() {
   return volume;
 }
 public String toString() {
   return String.valueOf(volume);
 }

} class VolumeEditor extends JSlider implements TableCellEditor {

 public OkCancel helper = new OkCancel();
 protected transient Vector listeners;
 protected transient int originalValue;
 protected transient boolean editing;
 public VolumeEditor() {
   super(SwingConstants.HORIZONTAL);
   listeners = new Vector();
 }
 public class OkCancel extends JWindow {
   private JButton okB = new JButton("accept.gif");
   private JButton cancelB = new JButton("decline.gif");
   private int w = 50;
   private int h = 24;
   public OkCancel() {
     setSize(w, h);
     setBackground(Color.yellow);
     JPanel p = new JPanel(new GridLayout(0, 2));
     p.add(okB);
     p.add(cancelB);
     setContentPane(p);
     okB.addActionListener(new ActionListener() {
       public void actionPerformed(ActionEvent ae) {
         stopCellEditing();
       }
     });
     cancelB.addActionListener(new ActionListener() {
       public void actionPerformed(ActionEvent ae) {
         cancelCellEditing();
       }
     });
   }
 }
 public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected,
     int row, int column) {
   if (value == null) {
     return this;
   }
   if (value instanceof Volume) {
     setValue(((Volume) value).getVolume());
   } else {
     setValue(0);
   }
   table.setRowSelectionInterval(row, row);
   table.setColumnSelectionInterval(column, column);
   originalValue = getValue();
   editing = true;
   Point p = table.getLocationOnScreen();
   Rectangle r = table.getCellRect(row, column, true);
   helper.setLocation(r.x + p.x + getWidth() - 50, r.y + p.y + getHeight());
   helper.setVisible(true);
   return this;
 }
 public void cancelCellEditing() {
   fireEditingCanceled();
   editing = false;
   helper.setVisible(false);
 }
 public Object getCellEditorValue() {
   return new Integer(getValue());
 }
 public boolean isCellEditable(EventObject eo) {
   return true;
 }
 public boolean shouldSelectCell(EventObject eo) {
   return true;
 }
 public boolean stopCellEditing() {
   fireEditingStopped();
   editing = false;
   helper.setVisible(false);
   return true;
 }
 public void addCellEditorListener(CellEditorListener cel) {
   listeners.addElement(cel);
 }
 public void removeCellEditorListener(CellEditorListener cel) {
   listeners.removeElement(cel);
 }
 protected void fireEditingCanceled() {
   setValue(originalValue);
   ChangeEvent ce = new ChangeEvent(this);
   for (int i = listeners.size() - 1; i >= 0; i--) {
     ((CellEditorListener) listeners.elementAt(i)).editingCanceled(ce);
   }
 }
 protected void fireEditingStopped() {
   ChangeEvent ce = new ChangeEvent(this);
   for (int i = listeners.size() - 1; i >= 0; i--) {
     ((CellEditorListener) listeners.elementAt(i)).editingStopped(ce);
   }
 }

} class VolumeRenderer extends JSlider implements TableCellRenderer {

 public VolumeRenderer() {
   super(SwingConstants.HORIZONTAL);
   setSize(115, 15);
 }
 public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
     boolean hasFocus, int row, int column) {
   if (value == null) {
     return this;
   }
   if (value instanceof Volume) {
     setValue(((Volume) value).getVolume());
   } else {
     setValue(0);
   }
   return this;
 }

}

      </source>