JTable mit Buttons in Tabellenzellen: Unterschied zwischen den Versionen

Aus Byte-Welt Wiki
Zur Navigation springenZur Suche springen
K
K
Zeile 1: Zeile 1:
 +
Dieses Beispiel zeigt, wie man Buttons innerhalb von Zellen einer JTable benutzen kann.
 +
 
<code=java>
 
<code=java>
 
import java.awt.*;
 
import java.awt.*;
Zeile 7: Zeile 9:
  
 
/**
 
/**
* The ButtonHandler class handles JTable buttons. Usage example:
 
* <p>
 
* <pre>
 
* class MyTable extends JTable {
 
*
 
*    private ButtonHandler btHandler;
 
*
 
*    MyTable() {
 
*        super(10, 4);
 
*        String[] butonNames = {"Button1", "Button2", "Button3"};
 
*        Object[] buttonPositions = new Object[]{new int[]{0, 0}, new int[]{0, 1}, new int[]{0, 2}};
 
*        for (int i = 0; i < buttonPositions.length; i++) {
 
*            int[] pos = (int[]) buttonPositions[i];
 
*            setValueAt(butonNames[i], pos[0], pos[1]);
 
*        }
 
*        Action action = new AbstractAction() {
 
*            public void actionPerformed(final ActionEvent e) {
 
*                String[] buttonPosition = e.getActionCommand().split(",");
 
*                int row = Integer.parseInt(buttonPosition[0]);
 
*                int column = Integer.parseInt(buttonPosition[1]);
 
*                System.out.println("row = " + row + ", column = " + column);
 
*            }
 
*        };
 
*        btHandler = new ButtonHandler(this, action, buttonPositions);
 
*    }
 
*    public TableCellRenderer getCellRenderer(final int row, final int column) {
 
*        return btHandler.getRenderer(row, column);
 
*    }
 
*    public TableCellEditor getCellEditor(final int row, final int column) {
 
*        return btHandler.getEditor(row, column);
 
*    }
 
* }
 
* </pre>
 
* <p>
 
 
  * @author André Uhres
 
  * @author André Uhres
 
  */
 
  */
Zeile 206: Zeile 174:
 
}
 
}
  
 +
</code=java>
 +
 +
<code=java>
 +
import java.awt.event.*;
 +
import javax.swing.*;
 +
import javax.swing.table.*;
 +
 +
/**
 +
* A JTable type, drawing JButtons.
 +
* @author André Uhres
 +
*/
 +
 +
class MyTable extends JTable {
 +
 
 +
    private ButtonHandler btHandler;
 +
 
 +
    MyTable() {
 +
        super(10, 4);
 +
        String[] buttonNames = {"Button1", "Button2", "Button3"};
 +
        Object[] buttonPositions = new Object[]{new int[]{0, 0}, new int[]{0, 1}, new int[]{0, 2}};
 +
        for (int i = 0; i < buttonPositions.length; i++) {
 +
            int[] pos = (int[]) buttonPositions[i];
 +
            setValueAt(buttonNames[i], pos[0], pos[1]);
 +
        }
 +
        Action action = new AbstractAction() {
 +
            public void actionPerformed(final ActionEvent e) {
 +
                String[] buttonPosition = e.getActionCommand().split(",");
 +
                int row = Integer.parseInt(buttonPosition[0]);
 +
                int column = Integer.parseInt(buttonPosition[1]);
 +
                System.out.println("row = " + row + ", column = " + column);
 +
            }
 +
        };
 +
        btHandler = new ButtonHandler(this, action, buttonPositions);
 +
    }
 +
 +
    public TableCellRenderer getCellRenderer(final int row, final int column) {
 +
        return btHandler.getRenderer(row, column);
 +
    }
 +
 +
    public TableCellEditor getCellEditor(final int row, final int column) {
 +
        return btHandler.getEditor(row, column);
 +
    }
 +
}
 +
</code=java>
 +
 +
<code=java>
 +
import javax.swing.*;
 +
 +
/**
 +
* A Main-Class, starting the demo-application
 +
* @author: L-ectron-X
 +
*/
 +
public class Main {
 +
  private static void createAndShowGUI() {
 +
      JFrame f = new JFrame("ButtonHandler");
 +
      f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 +
      f.add(new JScrollPane(new MyTable()));
 +
      f.pack();
 +
      f.setLocationRelativeTo(null);
 +
      f.setVisible(true);
 +
  }
 +
 
 +
  public static void main(String[] args) throws Exception {
 +
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
 +
     
 +
      SwingUtilities.invokeLater(new Runnable() {
 +
        public void run() {
 +
            createAndShowGUI();
 +
        }
 +
      });
 +
  }
 +
}
 
</code=java>
 
</code=java>
 
[[Kategorie:Java]]
 
[[Kategorie:Java]]

Version vom 8. Mai 2014, 09:42 Uhr

Dieses Beispiel zeigt, wie man Buttons innerhalb von Zellen einer JTable benutzen kann.

<code=java> import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; import javax.swing.table.*;

/**

* @author André Uhres
*/

class ButtonHandler {

   private JTable table;
   private Action action;
   private Border originalBorder;
   private Border focusBorder;
   private final Editor buttonEditor;
   private final Renderer buttonRenderer;
   private final Object[] buttonPositions;
   /**
    * Creates a ButtonHandler for the JTable passed as parameter.
    * @param table
    * @param action the action to be performed by the buttons
    * @param buttonPositions an array of int[] row-column pairs representing the button positions
    */
   ButtonHandler(final JTable table, final Action action, final Object[] buttonPositions) {
       this.table = table;
       this.action = action;
       buttonRenderer = new Renderer();
       buttonEditor = new Editor();
       this.buttonPositions = buttonPositions;
   }


   /**
    * @param row
    * @param column
    * @return the TableCellEditor for the cell at row-column
    */
   public TableCellEditor getEditor(final int row, final int column) {
       TableColumn tableColumn = table.getColumnModel().getColumn(column);
       TableCellEditor editor = tableColumn.getCellEditor();
       if (editor == null) {
           for (int i = 0; i < buttonPositions.length; i++) {
               int[] pos = (int[]) buttonPositions[i];
               if (pos[0] == row && pos[1] == column) {
                   return buttonEditor;
               }
           }
           Class c = table.getColumnClass(column);
           if (c.equals(Object.class)) {
               Object o = table.getValueAt(row, column);
               if (o != null) {
                   c = table.getValueAt(row, column).getClass();
               }
           }
           editor = table.getDefaultEditor(c);
       }
       return editor;
   }
   /**
    * @param row
    * @param column
    * @return the TableCellRenderer for the cell at row-column
    */
   public TableCellRenderer getRenderer(final int row, final int column) {
       TableColumn tableColumn = table.getColumnModel().getColumn(column);
       TableCellRenderer renderer = tableColumn.getCellRenderer();
       if (renderer == null) {
           for (int i = 0; i < buttonPositions.length; i++) {
               int[] pos = (int[]) buttonPositions[i];
               if (pos[0] == row && pos[1] == column) {
                   return buttonRenderer;
               }
           }
           Class c = table.getColumnClass(column);
           if (c.equals(Object.class)) {
               Object o = table.getValueAt(row, column);
               if (o != null) {
                   c = table.getValueAt(row, column).getClass();
               }
           }
           renderer = table.getDefaultRenderer(c);
       }
       return renderer;
   }
   private class Renderer implements TableCellRenderer {
       private JButton renderButton = new JButton();
       @Override
       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;
       }
   }
   private class Editor extends AbstractCellEditor implements TableCellEditor {
       private JButton editButton;
       private Object editorValue;
       private Editor() {
           editButton = new JButton();
           editButton.setFocusPainted(false);
           editButton.addActionListener(new ActionListener() {
               @Override
               public void actionPerformed(final ActionEvent e) {
                   int row = table.convertRowIndexToModel(table.getEditingRow());
                   int column = table.convertColumnIndexToModel(table.getEditingColumn());
                   buttonEditor.stopCellEditing();
                   ActionEvent event = new ActionEvent(table,
                           ActionEvent.ACTION_PERFORMED,
                           row + "," + column);
                   action.actionPerformed(event);
               }
           });
           originalBorder = editButton.getBorder();
           focusBorder = new LineBorder(Color.BLUE);
           editButton.setBorder(focusBorder);
       }
       @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;
       }
   }

}

</code=java>

<code=java> import java.awt.event.*; import javax.swing.*; import javax.swing.table.*;

/**

* A JTable type, drawing JButtons.
* @author André Uhres
*/

class MyTable extends JTable {

   private ButtonHandler btHandler;
 
   MyTable() {
       super(10, 4);
       String[] buttonNames = {"Button1", "Button2", "Button3"};
       Object[] buttonPositions = new Object[]{new int[]{0, 0}, new int[]{0, 1}, new int[]{0, 2}};
       for (int i = 0; i < buttonPositions.length; i++) {
           int[] pos = (int[]) buttonPositions[i];
           setValueAt(buttonNames[i], pos[0], pos[1]);
       }
       Action action = new AbstractAction() {
           public void actionPerformed(final ActionEvent e) {
               String[] buttonPosition = e.getActionCommand().split(",");
               int row = Integer.parseInt(buttonPosition[0]);
               int column = Integer.parseInt(buttonPosition[1]);
               System.out.println("row = " + row + ", column = " + column);
           }
       };
       btHandler = new ButtonHandler(this, action, buttonPositions);
   }
   public TableCellRenderer getCellRenderer(final int row, final int column) {
       return btHandler.getRenderer(row, column);
   }
   public TableCellEditor getCellEditor(final int row, final int column) {
       return btHandler.getEditor(row, column);
   }

} </code=java>

<code=java> import javax.swing.*;

/**

* A Main-Class, starting the demo-application
* @author: L-ectron-X
*/

public class Main {

  private static void createAndShowGUI() {
     JFrame f = new JFrame("ButtonHandler");
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     f.add(new JScrollPane(new MyTable()));
     f.pack();
     f.setLocationRelativeTo(null);
     f.setVisible(true);
  }
  
  public static void main(String[] args) throws Exception {
     UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
     
     SwingUtilities.invokeLater(new Runnable() {
        public void run() {
           createAndShowGUI();
        }
     });
  }

} </code=java>