Hallo,
ich arbeite zur Zeit an einem Dienstplaner, bei dem man die einzelnen Dienste aus einer Legende per Drag and Drop in den Dienstplan ziehen können soll. Der Dienstplan wird in einer JTable dargestellt, in die ich dann versch. vorgefertige Panels einfüge und somit den Plan zusammensetze. Auf den Panels liegen JLabel die dann den jew. Dienst mit Kürzel und einer definierten Farbe darstellen.
Das Problem ist, dass das Drag and Drop von der Legende zu den Labels im Dienstplan nur funktioniert, wenn die jew. Zelle zuvor angeklickt wurde. Außerhalb der Tabelle funktioniert das Drag and Drop dagegen wunderbar.
Ich hab schon auf versch. wegen versucht den Focus auf das Label bzw. Panel in der Tabelle zu setzen, über dem sich der Mauszeiger befindet, aber Nichts hat funktioniert.
Hier mal eine stark vereinfachte Variante:
Das Panel, was in die Tabelle eingefügt wird:
Und die von JTable abgeleitete ComponentTable mit CellEditor und CellRenderer
(von Zafir Anjum: www.codeguru.com/java/articles/162.shtml )
Hat irgend jemand eine Idee wie man das Drag and Drop zum Laufen bekommt bzw. den Focus auf das Panel in der Tabelle legt, ohne das man vorher die jew. Zelle anklickt?
Als Entwicklungsumgebung nutze ich Nebteans 5.5 mit JDK 1.6.
ich arbeite zur Zeit an einem Dienstplaner, bei dem man die einzelnen Dienste aus einer Legende per Drag and Drop in den Dienstplan ziehen können soll. Der Dienstplan wird in einer JTable dargestellt, in die ich dann versch. vorgefertige Panels einfüge und somit den Plan zusammensetze. Auf den Panels liegen JLabel die dann den jew. Dienst mit Kürzel und einer definierten Farbe darstellen.
Das Problem ist, dass das Drag and Drop von der Legende zu den Labels im Dienstplan nur funktioniert, wenn die jew. Zelle zuvor angeklickt wurde. Außerhalb der Tabelle funktioniert das Drag and Drop dagegen wunderbar.
Ich hab schon auf versch. wegen versucht den Focus auf das Label bzw. Panel in der Tabelle zu setzen, über dem sich der Mauszeiger befindet, aber Nichts hat funktioniert.
Hier mal eine stark vereinfachte Variante:
Code:
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JComponent;
import javax.swing.TransferHandler;
public class MainFrame extends javax.swing.JFrame {
/** Creates new form MainFrame */
public MainFrame() {
initComponents();
jLabel1.setTransferHandler(new TransferHandler("text"));
jLabel1.addMouseListener(new MouseAdapter(){
public void mousePressed(MouseEvent e){
JComponent c = (JComponent)e.getSource();
TransferHandler transferHandler = c.getTransferHandler();
transferHandler.exportAsDrag(c,e,TransferHandler.COPY);
}
});
jLabel2.setTransferHandler(new TransferHandler("text"));
jLabel2.addMouseListener(new MouseAdapter(){
public void mousePressed(MouseEvent e){
JComponent c = (JComponent)e.getSource();
TransferHandler transferHandler = c.getTransferHandler();
transferHandler.exportAsDrag(c,e,TransferHandler.COPY);
}
});
for (int i = 0; i < 3; i++) {
tableTest.setValueAt(new PanelTest(),0,i);
}
tableTest.setRowHeight(0,30);
}
private void initComponents() {
jLabel1 = new javax.swing.JLabel();
jLabel2 = new javax.swing.JLabel();
scrollPaneTest = new javax.swing.JScrollPane();
tableTest = new ComponentTable();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jLabel1.setBackground(new java.awt.Color(255, 255, 51));
jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
jLabel1.setText("A");
jLabel1.setOpaque(true);
jLabel2.setBackground(new java.awt.Color(153, 255, 153));
jLabel2.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
jLabel2.setText("B");
jLabel2.setOpaque(true);
tableTest.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
{null, null, null}
},
new String [] {
"Title 1", "Title 2", "Title 3"
}
));
scrollPaneTest.setViewportView(tableTest);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(scrollPaneTest, javax.swing.GroupLayout.DEFAULT_SIZE, 209, Short.MAX_VALUE)
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(scrollPaneTest, javax.swing.GroupLayout.PREFERRED_SIZE, 242, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
pack();
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new MainFrame().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JScrollPane scrollPaneTest;
private ComponentTable tableTest;
// End of variables declaration
Das Panel, was in die Tabelle eingefügt wird:
Code:
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JComponent;
import javax.swing.TransferHandler;
public class PanelTest extends javax.swing.JPanel {
/** Creates new form PanelTest */
public PanelTest() {
initComponents();
jLabel1.setTransferHandler(new TransferHandler("text"));
jLabel1.addMouseListener(new MouseAdapter(){
public void mousePressed(MouseEvent e){
JComponent c = (JComponent)e.getSource();
TransferHandler transferHandler = c.getTransferHandler();
transferHandler.exportAsDrag(c,e,TransferHandler.COPY);
}
});
jLabel2.setTransferHandler(new TransferHandler("text"));
jLabel2.addMouseListener(new MouseAdapter(){
public void mousePressed(MouseEvent e){
JComponent c = (JComponent)e.getSource();
TransferHandler transferHandler = c.getTransferHandler();
transferHandler.exportAsDrag(c,e,TransferHandler.COPY);
}
});
}
private void initComponents() {
jLabel1 = new javax.swing.JLabel();
jLabel2 = new javax.swing.JLabel();
setLayout(new java.awt.GridLayout(2, 1));
jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
jLabel1.setText("1");
jLabel1.setPreferredSize(new java.awt.Dimension(30, 30));
add(jLabel1);
jLabel2.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
jLabel2.setText("2");
jLabel2.setPreferredSize(new java.awt.Dimension(30, 30));
add(jLabel2);
}
// Variables declaration - do not modify
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
// End of variables declaration
Und die von JTable abgeleitete ComponentTable mit CellEditor und CellRenderer
(von Zafir Anjum: www.codeguru.com/java/articles/162.shtml )
Code:
import javax.swing.JComponent;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.event.ChangeEvent;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
import javax.swing.table.TableModel;
/**
* Diese Klasse überschreibt die Methoden getCellRenderer und getCellEditor der Klasse JTable
*/
public class ComponentTable extends JTable {
/**
* Creates a new instance of ComponentTable
*/
public ComponentTable() {
super();
initComponentTable();
}
public ComponentTable(int numRows, int numColumns){
super(numRows,numColumns);
initComponentTable();
}
public ComponentTable(TableModel tm)
{
super(tm);
initComponentTable();
}
public ComponentTable(TableModel tm, TableColumnModel cm)
{
super(tm,cm);
initComponentTable();
}
public ComponentTable(TableModel tm, TableColumnModel cm, ListSelectionModel sm){
super(tm,cm,sm);
initComponentTable();
}
private void initComponentTable(){
setDefaultRenderer(JComponent.class, new ComponentCellRenderer());
setDefaultEditor(JComponent.class, new ComponentCellEditor());
}
public TableCellRenderer getCellRenderer(int row, int column) {
TableColumn tableColumn = getColumnModel().getColumn(column);
TableCellRenderer renderer = tableColumn.getCellRenderer();
if (renderer == null) {
Class c = getColumnClass(column);
if( c.equals(Object.class) ) {
Object o = getValueAt(row,column);
if( o != null )
c = getValueAt(row,column).getClass();
}
renderer = getDefaultRenderer(c);
}
return renderer;
}
public TableCellEditor getCellEditor(int row, int column) {
TableColumn tableColumn = getColumnModel().getColumn(column);
TableCellEditor editor = tableColumn.getCellEditor();
if (editor == null) {
Class c = getColumnClass(column);
if( c.equals(Object.class) ) {
Object o = getValueAt(row,column);
if( o != null )
c = getValueAt(row,column).getClass();
}
editor = getDefaultEditor(c);
}
return editor;
}
}
Code:
import java.awt.Component;
import javax.swing.JComponent;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;
/**
*
* @author Zafir Anjum
*/
public class ComponentCellRenderer implements TableCellRenderer
{
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
return (JComponent)value;
}
}
Code:
/**
*
* @author Zafir Anjum
*/
import java.awt.Component;
import java.awt.event.*;
import java.awt.AWTEvent;
import java.lang.Boolean;
import javax.swing.table.*;
import javax.swing.event.*;
import java.util.EventObject;
import javax.swing.tree.*;
import java.io.Serializable;
import javax.swing.*;
public class ComponentCellEditor implements TableCellEditor, Serializable {
protected EventListenerList listenerList = new EventListenerList();
transient protected ChangeEvent changeEvent = null;
protected JComponent editorComponent = null;
protected JComponent container = null; // Can be tree or table
public Component getComponent() {
return editorComponent;
}
public Object getCellEditorValue() {
return editorComponent;
}
public boolean isCellEditable(EventObject anEvent) {
return true;
}
public boolean shouldSelectCell(EventObject anEvent) {
if( editorComponent != null && anEvent instanceof MouseEvent
&& ((MouseEvent)anEvent).getID() == MouseEvent.MOUSE_PRESSED ) {
Component dispatchComponent = SwingUtilities.getDeepestComponentAt(editorComponent, 3, 3 );
MouseEvent e = (MouseEvent)anEvent;
MouseEvent e2 = new MouseEvent( dispatchComponent, MouseEvent.MOUSE_RELEASED,
e.getWhen() + 100000, e.getModifiers(), 3, 3, e.getClickCount(),
e.isPopupTrigger() );
dispatchComponent.dispatchEvent(e2);
e2 = new MouseEvent( dispatchComponent, MouseEvent.MOUSE_CLICKED,
e.getWhen() + 100001, e.getModifiers(), 3, 3, 1,
e.isPopupTrigger() );
dispatchComponent.dispatchEvent(e2);
}
return false;
}
public boolean stopCellEditing() {
fireEditingStopped();
return true;
}
public void cancelCellEditing() {
fireEditingCanceled();
}
public void addCellEditorListener(CellEditorListener l) {
listenerList.add(CellEditorListener.class, l);
}
public void removeCellEditorListener(CellEditorListener l) {
listenerList.remove(CellEditorListener.class, l);
}
protected void fireEditingStopped() {
Object[] listeners = listenerList.getListenerList();
// Process the listeners last to first, notifying
// those that are interested in this event
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i]==CellEditorListener.class) {
// Lazily create the event:
if (changeEvent == null)
changeEvent = new ChangeEvent(this);
((CellEditorListener)listeners[i+1]).editingStopped(changeEvent);
}
}
}
protected void fireEditingCanceled() {
// Guaranteed to return a non-null array
Object[] listeners = listenerList.getListenerList();
// Process the listeners last to first, notifying
// those that are interested in this event
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i]==CellEditorListener.class) {
// Lazily create the event:
if (changeEvent == null)
changeEvent = new ChangeEvent(this);
((CellEditorListener)listeners[i+1]).editingCanceled(changeEvent);
}
}
}
// implements javax.swing.table.TableCellEditor
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected, int row, int column) {
editorComponent = (JComponent)value;
container = table;
return editorComponent;
}
}
Hat irgend jemand eine Idee wie man das Drag and Drop zum Laufen bekommt bzw. den Focus auf das Panel in der Tabelle legt, ohne das man vorher die jew. Zelle anklickt?
Als Entwicklungsumgebung nutze ich Nebteans 5.5 mit JDK 1.6.