This website uses cookies for visitor traffic analysis. By using the website, you agree with storing the cookies on your computer.More information

Fragen zur UITable

Allgemeine Fragen zur Entwicklung von und mit JVx.

Fragen zur UITable

Postby alladinbp » Tue Oct 18, 2011 12:33 pm

Hallo,

ich habe ein paar Fragen bzql. der UITable.

Frage 1)
Ist es möglich, in eine Tabellenzeile UIButtons o.ä. einzufügen? Die UITable bekommt ihr Model ja vom DataBook, weshalb das so wahrscheinlich nicht möglich ist. Ich bräuchte genau diese Funktion aber. Es müssten keine Buttons sein, klickbare Bilder, wo ich die Aktion dann bestimmen kann würden es auch tun.

Frage 2)
Ist es möglich Tabellenzeilen in ihrer höhe zu vergrößern? Ich dachte dass es vielleicht automatisch mit dem Text wächst, aber dem ist nicht so. Es würde auch reichen wenn man die Zeilenhöhe nur statisch anpassen kann.

Frage 3)
Ist es möglich bei der selektierten Zeile/Spalte den schwarzen Rahmen zu entfernen? Ich habe mit showGridLines und setShowSelection schon einiges ausgeblendet, aber dieser schwarze Rahmen bleibt.

Grüße
Benjamin
alladinbp
 
Posts: 39
Joined: Tue Oct 11, 2011 2:27 pm

Re: Fragen zur UITable

Postby Support@SIB » Tue Oct 18, 2011 1:04 pm

1) Von JVx bzw. der Swing UI werden keine Button Renderer zur Verfügung gestellt. Da es sich bei der Swing Implementierung um eine JTable handelt könnten Sie beliebige Renderer selbst erstellen.

Allerdings fixieren Sie Ihre Applikation dann auf die eingesetzte UI Implementierung!

Die Bilder-Lösung funktioniert problemlos: ON/OFF Bild mit ImageChoiceEditor auf eine Column setzen. Im valueChanged können Sie dann z.B einen Screen öffnen oder Werte ändern, .... Vergessen Sie nicht den Wert der Column wieder zurücksetzen, entweder in einem Thread oder mit invokeLater, damit der Klick Effekt auch sichtbar ist.

siehe UIComponent.invokeInThread() bzw. UIComponent.invokeLater()

Die Table hat ein eigenes Model das IDataBooks verarbeiten kann. Das Model kennt die View nicht!

2) Die ITable Definition besitzt keine Methode dafür. Hier müssten Sie direkt auf die Ressource (JTable) zugreifen. Aber Vorsicht, Swing unterstützt zwar grundsätzlich unterschiedliche Zeilenhöhen aber flackert auch recht gerne.

Es besteht auch die Möglichkeit mit eigenen Tabellen Implementierungen zu arbeiten und diese als custom component zu integrieren.

3) Der Fokus wird immer dargestellt, da der User wissen muss wo in der Tabelle er sich gerade befindet.
User avatar
Support@SIB
 
Posts: 353
Joined: Mon Sep 28, 2009 1:56 pm

Re: Fragen zur UITable

Postby alladinbp » Thu Oct 20, 2011 11:33 am

Danke für die Antwort.

Es wird mir nichts anderes übrig bleiben als auf die Swing Implementierung zurückzugreifen.
Ich würde am liebsten die TableModels/CellEditor/Renderer überschreiben, damit das DataBook funktioniert und ich aber trotzdem andere Komponenten in die Tabelle einfügen kann, die vom DataBook ignoriert werden.

Ich werde kurz das Beispiel mit dem ImageChoiceEditor probieren. Prinzipiell würden mir Icons in der Tabelle zum klicken reichen. Nur kann man diese klickbaren Bilder unabhängig vom DataBook gestalten?

Zu 2)
Ich würde die Frage gern etwas verändern. Und zwar, wie kann ich JVx dazu veranlassen in der Tabellenzeile umzubrechen, damit sich längerer Text in einer nicht so breiten Tabelle auch ausgeht?

Zu 3)
Ich wollte eine Tabelle nur zur Anzeige von Daten verwenden. Hier stört der Fokus dann, immerhin kann der User in der Tabelle nichts ändern.
alladinbp
 
Posts: 39
Joined: Tue Oct 11, 2011 2:27 pm

Re: Fragen zur UITable

Postby Development@SIB » Thu Oct 20, 2011 2:20 pm

1)
Die Images von Choice Editoren sind frei wählbar. Sie haben damit alle erdenklichen Möglichkeiten.

Wenn Sie einen Button anzeigen wollen, ist der Aufwand sehr gering. Sie können auf den DataType einer Column einen ICellRenderer und ICellEditor setzen. Ein Beispiel-Renderer für Swing wäre:

Code: Select all
public class JTableButtonRenderer implements ICellRenderer<JComponent>
{
   JButton button = new JButton();

   public JComponent getCellRendererComponent(JComponent pParentComponent,
                                              IDataPage pDataPage,
                                              int pRowNumber, IDataRow pDataRow,
                                              String pColumnName, boolean pIsSelected,
                                              boolean pHasFocus)
   {
      try
      {
         button.setText(pDataRow.getValueAsString(pColumnName));
      }
      catch (ModelException me)
      {
         return button;
      }

      if (pIsSelected)
      {
         button.setForeground(((JTable)pParentComponent).getSelectionForeground());
         button.setBackground(((JTable)pParentComponent).getSelectionBackground());
      }
      else
      {
         button.setForeground(((JTable)pParentComponent).getForeground());
         button.setBackground(UIManager.getColor("Button.background"));
      }
      
      return button;
   }
}

Natürlich brauchen Sie für den Klick auch noch einen ICellEditor. Dieser ist ebenfalls mit wenigen Handgriffen erstellt, analog zum Renderer. Die Methode cancelEditing des ICellEditorHandler interfaces kann für Klicks genutzt werden.

2)
Swing ermöglicht Multi-Line Darstellungen z.B. mit <html>Line1<br/>Line2</html>. Allerdings wertet die JTable die preferred size nicht sauber aus. Sie können zwar die Zeilenhöhe einer JTable mit setRowHeight(int, int) verändern doch dabei handelt es sich um fixe Werte und Zeilen.

Die JVx Table setzt eigene Zeilenhöhen, da ansonsten bei Sortierungs-Änderung oder Reload Events die falschen Zeilenhöhen sichtbar wären. Die Table verwendet ebenfalls nicht die preferred size da es aufgrund der JTable unschöne Flacker Effekte gibt.

JVx Swing UI verwendet Standard Swing Komponenten und es wird versucht die Probleme so gut als möglich bereits in der UI Implementierung zu beheben, damit der Entwickler nicht immer die selben technischen Probleme lösen muss. Grundsätzliche Design-Probleme wären nur durch neue Komponenten behebbar. Aber selbst das ist mit JVx jederzeit möglich.

Was ev. helfen könnte: eine setzbare Höhe für alle Zeilen.

3)
Der Fokus ist auch bei readonly/disabled Tabellen hilfreich, da JVx auch die Möglichkeit bietet bei Column Wechsel unterschiedliche Details anzuzeigen. Und wenn pro Column unterschiedliche Details sichtbar sind z.B in Editoren, dann ist der Fokus schon ganz wichtig.

Aber für einfaches navigieren in einer Tabelle muss der Fokus nicht unbedingt sein... Wir haben einen Feature Request erfasst - siehe Support System.
User avatar
Development@SIB
 
Posts: 325
Joined: Mon Sep 28, 2009 1:54 pm

Re: Fragen zur UITable

Postby alladinbp » Thu Oct 20, 2011 6:51 pm

Ich habe das mit dem Button gerade probiert. Prinzipiell wird der Button auch angezeigt. Allerdings kann man erst darauf klicken, nachdem sich die Spalte/Zeile im Editing Modus befindet. Gibt es vielleicht eine Möglichkeit wie man eine Spalte immer in den "editing" modus versetzen kann?

Bzw. beim ChoiceCellEditor funktioniert es so wie ich es mir vorstelle. Auch wenn man gerade eine ganz andere Zeile/Spalte angeklickt hat passiert beim Klick auf die EU Flagge sofort etwas. Ist dafür eine spezielle Implementierung notwendig?

Zu 2)
Das hört sich nicht gut an. Hier muss ich wohl selbst eine Komponente schreiben die mit TextAreas arbeitet.

Zu 3)
Danke fürs Eintragen!
alladinbp
 
Posts: 39
Joined: Tue Oct 11, 2011 2:27 pm

Re: Fragen zur UITable

Postby Development@SIB » Fri Oct 21, 2011 11:14 am

Der ICellEditor hat die Methode:

Code: Select all
public boolean isDirectCellEditor()

Wenn diese Methode true liefert, reagiert der Editor auf den ersten "Klick".
User avatar
Development@SIB
 
Posts: 325
Joined: Mon Sep 28, 2009 1:54 pm

Re: Fragen zur UITable

Postby alladinbp » Fri Oct 21, 2011 11:49 am

Das hab ich mir auch gedacht, allerdings passiert dann garnichts. Der Button wird zwar noch angezeigt, wirft aber keine Events.
Code hilft ihnen wahrscheinlich besser:

Code: Select all
class JTableButtonCellEditor extends JVxStyledCellEditor implements ITextCellEditor, ICellRenderer<JComponent> {

   /** the content type. */
   private String contentType;
   
   public JTableButtonCellEditor()
   {
      this(null);
   }
   
   /**
    * Constructs a new JVxTextCellEditor with the given content type.
    * @param pContentType the content type.
    */
   public JTableButtonCellEditor(String pContentType)
   {
      setContentType(pContentType);
   }
   
   @Override
   public ICellEditorHandler createCellEditorHandler(ICellEditorListener pCellEditorListener, IDataRow pDataRow, String pColumnName) {
      return new CellEditorHandler(this, (ICellFormatterEditorListener)pCellEditorListener, pDataRow, pColumnName);
   }

   @Override
   public boolean isDirectCellEditor() {
      return true;
   }

   @Override
   public JComponent getCellRendererComponent(JComponent pParentComponent, IDataPage pDataPage, int pRowNumber, IDataRow pDataRow, String pColumnName, boolean pIsSelected, boolean pHasFocus) {

      //System.out.println(pParentComponent);
      
      JButton b = new JButton("cl");
      
      b.addActionListener(new ActionListener() {

         @Override
         public void actionPerformed(ActionEvent e) {
            System.out.println("bbbbbbbbbbbb");
         }
      });
      
      return b;
   }

   @Override
   public String getContentType() {
      return contentType;
   }

   @Override
   public void setContentType(String pContentType) {
      if (pContentType == null) {
         contentType = TEXT_PLAIN_SINGLELINE;
      } else {
         contentType = pContentType.intern();
      }
   }
   
   public static class CellEditorHandler implements ICellEditorHandler<JComponent>, ActionListener {
      
      /** The CellEditor, that created this handler. */
      private JTableButtonCellEditor cellEditor;
      
      /** The CellEditorListener to inform, if editing is started or completed. */
      private ICellFormatterEditorListener cellEditorListener;
      
      /** The data row that is edited. */
      private IDataRow dataRow;
      
      /** The column name of the edited column. */
      private String columnName;
      
      /** The physical text editor. */
      private JButton buttonComponent;

      public CellEditorHandler(JTableButtonCellEditor jTableButtonCellEditor, ICellFormatterEditorListener pCellEditorListener, IDataRow pDataRow, String pColumnName) {
         cellEditor = jTableButtonCellEditor;
          cellEditorListener = pCellEditorListener;
          dataRow = pDataRow;
          columnName = pColumnName;
          
          buttonComponent = new JButton("click me");
          buttonComponent.addActionListener(this);
       
      }
      
      @Override
      public void uninstallEditor() {
         buttonComponent.removeActionListener(this);
      }

      @Override
      public void updateEditor() { }

      @Override
      public ICellEditor getCellEditor() {
         return cellEditor;
      }

      @Override
      public ICellEditorListener getCellEditorListener() {
         return cellEditorListener;
      }

      @Override
      public IDataRow getDataRow() {
         return dataRow;
      }

      @Override
      public String getColumnName() {
         return columnName;
      }

      @Override
      public JComponent getCellEditorComponent() {
         return buttonComponent; //cellEditorComponent;
      }

      @Override
      public void saveEditing() throws ModelException { }

      @Override
      public void cancelEditing() throws ModelException { }

      @Override
      public void actionPerformed(ActionEvent arg0) {
         System.out.println("button clicked");
      }
   }

}

alladinbp
 
Posts: 39
Joined: Tue Oct 11, 2011 2:27 pm

Re: Fragen zur UITable

Postby Development@SIB » Fri Oct 21, 2011 11:58 am

Es ist einfacher wenn Sie nicht gleich zu komplex beginnen. In einem früheren Post wurde der Hinweis auf cancelEditing gegeben!

Einen Beispiel Editor finden sie nachfolgend, aber beachten Sie das es sich dabei um keine vollständige Implementierung handelt.

Code: Select all
public class JTableButtonEditor implements ICellEditor
{

   @Override
   public ICellEditorHandler createCellEditorHandler(ICellEditorListener pCellEditorListener, IDataRow pDataRow, String pColumnName)
   {
      return new ButtonEditor(this, pCellEditorListener, pDataRow, pColumnName);
   }

   @Override
   public boolean isDirectCellEditor()
   {
      return true;
   }
   
   private class ButtonEditor implements ICellEditorHandler
   {
      private JButton button = new JButton();
      
      ICellEditor cellEditor;
      ICellEditorListener cellEditorListener;
      IDataRow dataRow;
      String columnName;
      
      public ButtonEditor(ICellEditor pCellEditor, ICellEditorListener pCellEditorListener, IDataRow pDataRow, String pColumnName)
      {
         cellEditor = pCellEditor;
         cellEditorListener = pCellEditorListener;
         dataRow = pDataRow;
         columnName = pColumnName;
      }
      
      @Override
      public void cancelEditing() throws ModelException
      {
         System.out.println("Welcome");
      }

      @Override
      public ICellEditor getCellEditor()
      {
         return cellEditor;
      }

      @Override
      public Object getCellEditorComponent()
      {
         return button;
      }

      @Override
      public ICellEditorListener getCellEditorListener()
      {
         return cellEditorListener;
      }

      @Override
      public String getColumnName()
      {
         return columnName;
      }

      @Override
      public IDataRow getDataRow()
      {
         return dataRow;
      }

      @Override
      public void saveEditing() throws ModelException
      {
      }

      @Override
      public void uninstallEditor()
      {
      }

      @Override
      public void updateEditor()
      {
      }
   }

}
User avatar
Development@SIB
 
Posts: 325
Joined: Mon Sep 28, 2009 1:54 pm

Re: Fragen zur UITable

Postby alladinbp » Fri Oct 21, 2011 1:06 pm

Die Methode cancelEditing des ICellEditorHandler interfaces kann für Klicks genutzt werden.


Oh Entschuldigung, das habe ich komplett überlesen. Danke!
alladinbp
 
Posts: 39
Joined: Tue Oct 11, 2011 2:27 pm


Return to Development (DE)