# Teile von Text in einer tabellenspalte farbig machen



## Nuke (22. Aug 2007)

Hallo,

ich trage text in eine jtable ein z.B. "Hallo" und makiere die Zeichen "all" danach möchte ich auf einen button drücken, der eine methode aufruft die bestimmt welche Zeichen in der spalte selektiert sind und diese dann farbig darstellt z.B.

Kennt jemand ein Tutorial dazu?


----------



## André Uhres (22. Aug 2007)

```
package table;
/*
 * TableTextColorDemo.java
 */
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.text.*;
public class TableTextColorDemo extends JFrame implements ActionListener{
    private JButton btColor, btReset, btReset1;
    private JTable table;
    private JToolBar toolbar;
    private Map<String, String> colormap = new HashMap<String, String>();
    private Color selColor = new JTextField().getSelectionColor();
    public TableTextColorDemo() {
        super("TableTextColorDemo");
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setSize(400,300);
        setLocationRelativeTo(null);
        toolbar = new JToolBar();
        btColor = new JButton();
        btReset = new JButton();
        btReset1 = new JButton();
        table = new JTable(){
            public Component prepareRenderer(final TableCellRenderer renderer, final int row, final int column) {
                JLabel label = (JLabel)super.prepareRenderer(renderer, row, column);
                String key = String.valueOf(row)+";"+String.valueOf(column);
                String range = (String) colormap.get(key);
                if(range != null){
                    String text = label.getText();
                    int start = Integer.parseInt(range.split(";")[0]);
                    int end = Integer.parseInt(range.split(";")[1]);
                    String color = range.split(";")[2];
                    label.setText("<html>"+text.substring(0, start)+"<font color=" +color+ ">"
                            +text.substring(start, end)+"</font>"+text.substring(end));
                }
                return label;
            }
        };
        table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
        btColor.setText("Färben");
        btColor.addActionListener(this);
        toolbar.add(btColor);
        btReset.setText("Reset");
        btReset.addActionListener(this);
        toolbar.add(btReset);
        btReset1.setText("Reset Selections");
        btReset1.addActionListener(this);
        toolbar.add(btReset1);
        getContentPane().add(toolbar, BorderLayout.NORTH);
        table.setModel(new DefaultTableModel(
                new Object [][] {
                    {"Hallo", "Hallo"},
                    {"Hallo", "Hallo"},
                    {"Hallo", "Hallo"},
                    {"Hallo", "Hallo"}
        },
                new String [] {
            "Title 1", "Title 2"
        }
        ) {
            Class[] types = new Class [] {
                String.class, String.class
            };
            public Class getColumnClass(final int columnIndex) {
                return types [columnIndex];
            }
        });
        table.addMouseMotionListener(new MouseMotionAdapter() {
            public void mouseMoved(final MouseEvent evt) {
                Point p = evt.getPoint();
                int row = table.rowAtPoint(p);
                int column = table.columnAtPoint(p);
                table.editCellAt(row, column);
            }
        });
        getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
        table.setDefaultEditor(String.class, new TableEditor());
    }
    public static void main(final String args[]) {new TableTextColorDemo().setVisible(true);}
    public void actionPerformed(final ActionEvent e) {
        Object source = e.getSource();
        if(source == btReset1){
            Iterator it = colormap.keySet().iterator();
            while(it.hasNext()){
                String key = (String) it.next();
                String value = colormap.get(key);
                if(value.split(";")[2].equalsIgnoreCase("blue")){
                    it.remove();
                }
            }
            table.updateUI();
        }else if (source == btReset){
            colormap.clear();
            table.updateUI();
        }else{
            for (String key : colormap.keySet()) {
                String value = colormap.get(key);
                if(value.split(";")[2].equalsIgnoreCase("blue")){
                    value = value.substring(0, value.lastIndexOf(";"))+";red";
                    colormap.put(key, value);
                }
            }
            table.updateUI();
        }
    }
    class TableEditor extends DefaultCellEditor{
        private int rowE;
        private int colE;
        public TableEditor(){
            super(new JTextField());
            ((JTextField)editorComponent).addMouseListener(new MouseAdapter() {
                public void mousePressed(MouseEvent e) {
                    removeHighlights((JTextComponent) editorComponent);
                }
            });
        }
        public boolean stopCellEditing() {
            boolean retValue;
            JTextField field = (JTextField)editorComponent;
            int start = field.getSelectionStart();
            int end = field.getSelectionEnd();
            String sel = field.getSelectedText();
            if(sel != null && !sel.equals("")){
                TableTextColorDemo.this.colormap.put(rowE+";"+colE, start+";"+end+";blue") ;
            }
            retValue = super.stopCellEditing();
            return retValue;
        }
        public Component getTableCellEditorComponent(final JTable table, final Object value,
                final boolean isSelected, final int row, final int column) {
            JTextField field = (JTextField)super.getTableCellEditorComponent(table, value, isSelected, row, column);
            String key = String.valueOf(row)+";"+String.valueOf(column);
            String range = (String) colormap.get(key);
            if(range != null){
                int start = Integer.parseInt(range.split(";")[0]);
                int end = Integer.parseInt(range.split(";")[1]);
                String color = range.split(";")[2];
                highlight(field, start, end);
            }
            rowE = row;
            colE = column;
            return field;
        }
    }
    // Creates highlights around all occurrences of pattern in textComp
    public void highlight(final JTextComponent textComp, final int start, final int end) {
        // First remove all old highlights
        removeHighlights(textComp);
        try {
            Highlighter hilite = textComp.getHighlighter();
            Document doc = textComp.getDocument();
            String text = doc.getText(0, doc.getLength());
            // Add highlight using private painter
            hilite.addHighlight(start, end, textPainter);
        } catch (BadLocationException e) {
        }
    }
    // Removes only our private highlights
    public void removeHighlights(final JTextComponent textComp) {
        Highlighter hilite = textComp.getHighlighter();
        Highlighter.Highlight[] hilites = hilite.getHighlights();
        for (int i=0; i<hilites.length; i++) {
            if (hilites[i].getPainter() instanceof TextPainter) {
                hilite.removeHighlight(hilites[i]);
            }
        }
    }
    // An instance of the private subclass of the default highlight painter
    private Highlighter.HighlightPainter textPainter = new TextPainter(selColor);
    // A private subclass of the default highlight painter
    class TextPainter extends DefaultHighlighter.DefaultHighlightPainter {
        public TextPainter(final Color color) {
            super(color);
        }
    }
}
```


----------



## Nuke (22. Aug 2007)

Danke für den Code. Ich probierte das sofort und

1. Manchmal kommt rot oder blau

2. der text wird in echtzeit eingefärbt

3. wenn ich mehre zellen selektiere und danach in eine zelle klicke um sie zu deselektieren geht das nicht?


Sind diese 3 Punkte von dir Absicht oder meinst du ich soll es so abändern wie ich es brauche?


Wie auch immer danke schön ich schaue mir den Code an


----------



## André Uhres (23. Aug 2007)

Da eine Selektion mitten im Text einer Zelle nur im Edit Modus möglich ist, 
markiere ich den Text im Renderer erstmal blau, damit man weiss, was selektiert wurde.
Um die so selektierten Textfragmente zu deselektieren, brauchst du nur den Button "Reset selections"
zu drücken.


----------



## Nuke (23. Aug 2007)

ok danke dir nochmals herzlich!


----------



## Nuke (30. Aug 2007)

```
table.setModel(new DefaultTableModel(
                new Object [][] {
                    {"Hallo", "Hallo"},
                    {"Hallo", "Hallo"},
                    {"Hallo", "Hallo"},
                    {"Hallo", "Hallo"}
        },
                new String [] {
            "Title 1", "Title 2"
        }
        ) {
            Class[] types = new Class [] {
                String.class, String.class
            };
            public Class getColumnClass(final int columnIndex) {
                return types [columnIndex];
            }
        });
```

normalerweise instanziiere ich von der Klasse DefaultTableModel so:

```
dim = new DefaultTableModel (rowData,header);
```

wo ist bei deinem Beispiel die dim-instanz? du hast zwar mit new DefaultTableModel eine gemacht glaube anonymes Objekt nennt man das nur wie greife ich nun darauf zu z.B. um der Tabelle einen Wert zuzuweisen ala 
	
	
	
	





```
dim.setValue("bla",1,1); ??
```


----------



## merlin2 (30. Aug 2007)

Bei mir wird das nicht mal compiliert:


> D:\Eigene Dateien\MERLIN\Java>javac TableTextColordemo.java
> TableTextColordemo.java:11: <identifier> expected
> private Map<String, String> colormap = new HashMap<String, String>();
> ^
> ...


----------



## André Uhres (31. Aug 2007)

Bei mir kompiliert's.



			
				Nuke hat gesagt.:
			
		

> ..wo ist bei deinem Beispiel die dim-instanz? ..




```
dim = (DefaultTableModel)table.getModel();
```


----------



## merlin2 (31. Aug 2007)

Hast du eine Idee, warum es bei mir nicht compiliert wird?
Java-Version ist ja aktuell.


----------



## Nuke (31. Aug 2007)

André Uhres hat gesagt.:
			
		

> Bei mir kompiliert's.
> 
> 
> 
> ...



hm ich blicks net warum hast du so komische KOnstrukte ?? ich meine ich hab auch ne tabelle mit daten etc... doch ich habe nicht so ein Konstrukt:

table.setModel(new DefaultTableModel(
                new Object [][] {
                    {"Hallo", "Hallo"},
                    {"Hallo", "Hallo"},
                    {"Hallo", "Hallo"},
                    {"Hallo", "Hallo"}
        },
                new String [] {
            "Title 1", "Title 2"
        }
        ) {
            Class[] types = new Class [] {
                String.class, String.class
            };
            public Class getColumnClass(final int columnIndex) {
                return types [columnIndex];
            }
        });  

nach dem komma oben kommt ein stray array und daran hängt ne klasse, was ist denn das für ein Konstrukt? Noch nie sowas gesehen... Ist das Swing typisch?





> dim = (DefaultTableModel)table.getModel();



ich habe auch ein dim object nur übergebe ich diesem meine zeilen und spalten werte und du übergibst...nichts... du holst dir das Model der Tabelle, aha ich versteh nix  :lol:


----------



## André Uhres (31. Aug 2007)

Nuke hat gesagt.:
			
		

> ..aha ich versteh nix  :lol:


Doch, das kommt eigentlich alles auf dasselbe hinaus. Es gibt halt verschiedenen Wege zum Ziel:

```
data = new Object [][] {{"Hallo", "Hallo"},{"Hallo", "Hallo"},{"Hallo", "Hallo"},{"Hallo", "Hallo"}};
        columns = new String [] {"Title 1", "Title 2"};
        dim = new DefaultTableModel(data, columns) {
            public Class getColumnClass(final int columnIndex) {
                return String.class;
            }
        };
        table.setModel(dim);
```
Wenn du nun in den Methodenaufrufen die Variablen dim, data und columns schrittweise durch das ersetzt,
was ihnen zugeordnet wird, dann kommst du auf mein "Konstrukt" :wink:

Was oben hinter dim = new DefaultTableModel(data, columns)  in {...} steht ist eine anonyme Erweiterung 
der Klasse DefaultTableModel, um die Methode getColumnClass überschreiben zu können.
Man kann dafür natürlich auch eine Klasse mit Namen definieren:

```
class MyModel extends DefaultTableModel{
    public Class getColumnClass(final int columnIndex) {
        return String.class;
    }
}
```
Dann könnte man kürzer schreiben:

```
dim = new MyModel(data, columns);
```
Ich hoffe, das ist jetzt etwas klarer ausgedrückt.


----------



## Nuke (31. Aug 2007)

wenn ich dein code allein laufen lassen gehts, wenn ich ihn einbaue geht die tabelle etc... wenn ich den code von dir einbaue mit den farben etc geht nix mehr:

*
MainWindow.java*


```
import java.awt.Color;
import javax.swing.*;

public class MainWindow extends JFrame
{    
   static final long serialVersionUID = 1L;
    
   
   public MainWindow()
   {
	   super(""); 
	  // setIconImage(new ImageIcon("images/Dir.gif").getImage()); 
      UIManager.put("ProgressBar.selectionBackground", Color.black);
      
      ImageListePanel  IL = new ImageListePanel();
      SettingsPanel SP = new SettingsPanel();
      Renderer RR = new Renderer();
                
      IL.setSP(SP);       
      SP.setIL(IL); 
      
      JTabbedPane jtp = new JTabbedPane();     
      
      jtp.addTab("<html><font size=5>Image-Liste</font size></html>", IL);
      jtp.addTab("<html><font size=5>Image-Verwaltung</font size></html>", SP);           
          
      add(jtp);
            
   } 
   
   public static void main(String args[])
   {
     
      
      try				
      {    	        
       Color  defForeground = new Color(0,140,222);             
       UIManager.put("Label.foreground",defForeground);       
     
       JFrame.setDefaultLookAndFeelDecorated(true);
      }
      catch (Exception e)
      {
        e.printStackTrace();
      }

      MainWindow Fenster = new MainWindow();
      Fenster.setSize(1000,720);
      Fenster.setLocationRelativeTo(null);
      Fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      Fenster.setResizable(false);
      Fenster.setVisible(true);    
   }
}
```

*
ImageListePanel.class*


```
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.Insets; 
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; 
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date; 
import java.util.HashMap;
import java.util.Map;
import javax.swing.DefaultListModel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox; 
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultHighlighter;
import javax.swing.text.Highlighter;
import javax.swing.text.JTextComponent;
import javax.swing.text.html.HTMLDocument.Iterator;

import com.sun.xml.internal.txw2.Document;

public class ImageListePanel extends JPanel implements ActionListener , ListSelectionListener
{
	static final long serialVersionUID = 1L;
	private SettingsPanel settings; 
    private  JTextField homepageTF    = new JTextField("    Imagename    ");  
    private  JComboBox rlsSourceDirectoryCB = new JComboBox();    
       
    private  JButton btReset   = new JButton("Html importieren");
    private  JButton btReset1 = new JButton("Liste laden");
    private  JButton saveBT  = new JButton("Liste speichern");
    private  JButton pasteUrlBT    = new JButton();   
    private  JButton refreshBT     = new JButton();

	private DefaultListModel listModel = new DefaultListModel();
	private JList liste = new JList(listModel);
	private JScrollPane listbereich = new JScrollPane(liste);   
    
    private String[] spaltennamen = {"Status" , "Gruppe" , "Programm" , "Aufgabe" , "Datenträger" };
    private String[][] tabellendaten = new String [700][5];
    
    DefaultTableModel dm;
    JTable tabelle;  
       
    private  DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy"); // Format für 24-Stunden-Anzeige
    private  String str = dateFormat.format(new Date());     
    private Map<String, String> colormap = new HashMap<String, String>();
    
	public ImageListePanel()
	{		
		 setLayout(null);
        
         add(homepageTF);
         add(btReset);
         add(btReset1);
         add(saveBT);        
         add(rlsSourceDirectoryCB);           
         add(pasteUrlBT); 
         add(refreshBT);
         add(listbereich);        
       
        homepageTF.setBounds(826,440,159,30);       
        listbereich.setBounds(826,0,160,440); 
        btReset.setBounds(826,468,158,60);
        btReset1.setBounds(826,529,158,60);
        saveBT.setBounds(826,590,158,60); 
      
        btReset.setIcon(new ImageIcon("images/pasteurl.png"));      
        btReset1.setIcon(new ImageIcon("images/refresh.png"));
        saveBT.setIcon(new ImageIcon("images/dir.png"));
        
        homepageTF.setMargin(new Insets(1, 3, 1, 1));
       
        btReset.setForeground(new Color(0,0,0));
        btReset1.setForeground(new Color(0,0,0));
        saveBT.setForeground(new Color(0,0,0));        
        
        btReset.setFont(new Font("Arial",Font.BOLD, 12));
        btReset1.setFont(new Font("Arial",Font.BOLD, 12));
        saveBT.setFont(new Font("Arial",Font.BOLD, 12));
      
        rlsSourceDirectoryCB.setFont(new Font("Arial",Font.BOLD, 12));
                 
        dm = new DefaultTableModel (tabellendaten,spaltennamen);         
		
        tabelle = new JTable( dm ){
      	/**
			 * 
			 */
			private static final long serialVersionUID = 1L;  

		public Component prepareRenderer(final TableCellRenderer renderer, final int row, final int column) {
                JLabel label = (JLabel)super.prepareRenderer(renderer, row, column);
                String key = String.valueOf(row)+";"+String.valueOf(column);
                String range = (String) colormap.get(key);
                if(range != null){
                    String text = label.getText();
                    int start = Integer.parseInt(range.split(";")[0]);
                    int end = Integer.parseInt(range.split(";")[1]);
                    String color = range.split(";")[2];
                    label.setText("<html>"+text.substring(0, start)+"<font color=" +color+ ">"
                            +text.substring(start, end)+"</font>"+text.substring(end));
                }
                return label;
            }
        };
        
        
        
        tabelle.setModel(new DefaultTableModel(new Object [700][5], spaltennamen)
           {
            private static final long serialVersionUID = 1L;
			Class[] types = new Class [] {
                String.class, String.class , String.class, String.class , String.class
            };
            public Class<?> getColumnClass(final int columnIndex) {
                return types [columnIndex];
            }
        });  
        
        tabelle.addMouseMotionListener(new MouseMotionAdapter() {
            public void mouseMoved(final MouseEvent evt) {
                Point p = evt.getPoint();
                int row = tabelle.rowAtPoint(p);
                int column = tabelle.columnAtPoint(p);
                tabelle.editCellAt(row, column);
            }
        });
        
        
        
        tabelle.setDefaultEditor(String.class, new TableEditor()); 
        
        dm.setValueAt("ddd", 0, 0);
        //tabelle.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        tabelle.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
		tabelle.setPreferredScrollableViewportSize(tabelle.getPreferredSize());
		JScrollPane scrollPane = new JScrollPane( tabelle );
		add(scrollPane); 
		scrollPane.setBounds(0,0,826,650); 
		tabelle.setRowHeight(25);
        tabelle.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
        scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); 
        
        tabelle.setAutoCreateRowSorter(true);  
        
        btReset.addActionListener(this);
        btReset1.addActionListener(this);        
        saveBT.addActionListener(this);
        pasteUrlBT.addActionListener(this);
        refreshBT.addActionListener(this);
        
        liste.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
	    liste.setVisibleRowCount(1);
	    liste.addListSelectionListener((ListSelectionListener) this); 
	    
	    listbereich.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        listbereich.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        
        liste.setCellRenderer(new Renderer());    
        
        listModel.addElement("MPG Lehrer 125");
        listModel.addElement("AEG Schüler xp");
        listModel.addElement("MPG Lehrer 125");
        listModel.addElement("AEG Schüler xp");
        listModel.addElement("MPG Lehrer 125");
        listModel.addElement("MPG Lehrer 125");
        listModel.addElement("MPG Lehrer 125");
        listModel.addElement("MPG Lehrer 125");      
        listModel.addElement("MPG Lehrer 125");
        listModel.addElement("AEG Schüler xp");
        listModel.addElement("MPG Lehrer 125");
        listModel.addElement("AEG Schüler xp");
        listModel.addElement("MPG Lehrer 125");
        listModel.addElement("MPG Lehrer 125");
        listModel.addElement("MPG Lehrer 125");
        listModel.addElement("MPG Lehrer 125"); 
        listModel.addElement("MPG Lehrer 125");
        listModel.addElement("AEG Schüler xp");
        listModel.addElement("MPG Lehrer 125");
        listModel.addElement("AEG Schüler xp");
        listModel.addElement("MPG Lehrer 125");
        listModel.addElement("MPG Lehrer 125");
        listModel.addElement("MPG Lehrer 125");
        listModel.addElement("MPG Lehrer 125"); 
        setColumnWidth();	
     }	
	
	
	

	public void setSP(SettingsPanel object)
	{
	    this.settings = object;
	}
	 	 
	 public void valueChanged( ListSelectionEvent e )
	 {           
	         
        if(!e.getValueIsAdjusting())
        {                
           homepageTF.setText(listModel.getElementAt(0).toString());           
        }       
	 }
	 
	 public void setColumnWidth()
	 {
     	  tabelle.getColumnModel().getColumn(0).setPreferredWidth(40);
          tabelle.getColumnModel().getColumn(1).setPreferredWidth(50);
          tabelle.getColumnModel().getColumn(2).setPreferredWidth(100);
          tabelle.getColumnModel().getColumn(3).setPreferredWidth(500);
          tabelle.getColumnModel().getColumn(4).setPreferredWidth(100);
	 }    
     
     
     public void actionPerformed(final ActionEvent e)
     {
         
    	 if(e.getSource().equals(saveBT))  
	      {	 
	    	
	 	   	 //saveBT.setEnabled(false);
	      } 
    	 
    	 Object source = e.getSource();
         
    	 if(source == btReset1)
    	 {
             Iterator it = (Iterator) colormap.keySet().iterator();
             while(it.hasNext())
             {
                 String key = (String) it.next();
                 String value = colormap.get(key);
                 
                 if(value.split(";")[2].equalsIgnoreCase("blue"))
                 {
                     it.remove();
                 }
             }
             tabelle.updateUI();
         }else if (source == btReset)
         {
             colormap.clear(); 
             tabelle.updateUI();
         }else
         {
             for (String key : colormap.keySet())
             {
                 String value = colormap.get(key);
                 if(value.split(";")[2].equalsIgnoreCase("blue"))
                 {
                     value = value.substring(0, value.lastIndexOf(";"))+";red";
                     colormap.put(key, value);
                 }
             }
            tabelle.updateUI();
         }
     } 
     
     
  // Creates highlights around all occurrences of pattern in textComp
     public void highlight(final JTextComponent textComp, final int start, final int end)
     {
         // First remove all old highlights
         removeHighlights(textComp);
         try {
             Highlighter hilite = textComp.getHighlighter();
             Document doc = textComp.getDocument();
             String text = doc.getText(0, doc.getLength());
             // Add highlight using private painter
             hilite.addHighlight(start, end, textPainter);
         } catch (BadLocationException e) {
         }
     }
     // Removes only our private highlights
     public void removeHighlights(final JTextComponent textComp)
     {
         Highlighter hilite = textComp.getHighlighter();
         Highlighter.Highlight[] hilites = hilite.getHighlights();
         for (int i=0; i<hilites.length; i++) {
             if (hilites[i].getPainter() instanceof TextPainter) {
                 hilite.removeHighlight(hilites[i]);
             }
         }
     }
     // An instance of the private subclass of the default highlight painter
     private Highlighter.HighlightPainter textPainter = new TextPainter(selColor);
     // A private subclass of the default highlight painter
     class TextPainter extends DefaultHighlighter.DefaultHighlightPainter {
         public TextPainter(final Color color) {
             super(color);
         }
     } 
     
     
     
     
}
```

*
TabeleEditor.class*




```
import java.awt.Component;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.DefaultCellEditor;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.text.JTextComponent;

class TableEditor extends DefaultCellEditor
{
        private int rowE;
        private int colE;
        
        public TableEditor()
        {
            super(new JTextField());
            ((JTextField)editorComponent).addMouseListener(new MouseAdapter() {
                public void mousePressed(MouseEvent e) {
                    removeHighlights((JTextComponent) editorComponent);
                }
            });
        }
        public boolean stopCellEditing()
        {
            boolean retValue;
            JTextField field = (JTextField)editorComponent;
            int start = field.getSelectionStart();
            int end = field.getSelectionEnd();
            String sel = field.getSelectedText();
            if(sel != null && !sel.equals(""))
            {
                ImageListePanel.this.colormap.put(rowE+";"+colE, start+";"+end+";blue") ;
            }
            retValue = super.stopCellEditing();
            return retValue;
        }
        public Component getTableCellEditorComponent(final JTable table, final Object value,final boolean isSelected, final int row, final int column)
        {
            JTextField field = (JTextField)super.getTableCellEditorComponent(table, value, isSelected, row, column);
           
            String key = String.valueOf(row)+";"+String.valueOf(column);
            String range = (String) colormap.get(key);
            
            if(range != null){
                int start = Integer.parseInt(range.split(";")[0]);
                int end = Integer.parseInt(range.split(";")[1]);
                String color = range.split(";")[2];
                highlight(field, start, end);
            }
            rowE = row;
            colE = column;
            return field;
        }
    }
```


*Fehlermeldungen:*


```
Severity and Description	Path	Resource	Location	Creation Time	Id
Cannot cast from void to String	rembo	ImageListePanel.java	line 249	1188594420297	18159
selColor cannot be resolved	rembo	ImageListePanel.java	line 304	1188594420297	18163
The method getLength() is undefined for the type Document	rembo	ImageListePanel.java	line 286	1188594420297	18162
The method hasNext() is undefined for the type HTMLDocument.Iterator	rembo	ImageListePanel.java	line 247	1188594420297	18158
The method remove() is undefined for the type HTMLDocument.Iterator	rembo	ImageListePanel.java	line 254	1188594420297	18160
Type mismatch: cannot convert from Document to Document	rembo	ImageListePanel.java	line 285	1188594420297	18161
colormap cannot be resolved	rembo	TableEditor.java	line 43	1188594204109	18127
No enclosing instance of the type ImageListePanel is accessible in scope	rembo	TableEditor.java	line 33	1188594204109	18125
The field ImageListePanel.colormap is not visible	rembo	TableEditor.java	line 33	1188594204109	18126
The method highlight(JTextField, int, int) is undefined for the type TableEditor	rembo	TableEditor.java	line 49	1188594204109	18128
The method removeHighlights(JTextComponent) is undefined for the type new MouseAdapter(){}	rembo	TableEditor.java	line 20	1188594204109	18124
```


Also die Fehlermeldungen vor allem dass manches nicht konvertiert werden kann ist schon komisch, habe jdk 6.02 und mit dem Eclipse habe ich alle möglichen fehlermeldungen "quick gefixt" sprich obige Fehler sind noch übrig und bekomme ich net weg...

Kannst du mir helfen, muss ja irgendwie auch an DEINEM Code liegen!  :wink:


----------



## André Uhres (1. Sep 2007)

Eclipse von NetBeans korrigiert  
http://www.java-forum.org/de/userfiles/user3690/Fragmente.jar

http://www.java-forum.org/de/userfiles/user3690/TableEditor.java
http://www.java-forum.org/de/userfiles/user3690/MainWindow.java
http://www.java-forum.org/de/userfiles/user3690/ImageListePanel.java


----------



## Nuke (1. Sep 2007)

> Eclipse von NetBeans korrigiert



Danke dir, obigen Satz verstehe ich jetzt net.´Wieso ist Eclipse von Netbeans hä? Du meinst wenn man meinen "falschen" code in netbeans läd kann ich dort quickfix machen und es geht ??? Wenn ja ein grund mehr auf die kommende NB 6 final umzusteigen...


----------



## Nuke (1. Sep 2007)

wie auch immer... ich finde es unflexibel ja fast störend wenn man den text dahingehend farbig verändert indem man ihn einfach markiert, denn es kann vorkommen, dass ich text daraus kopieren möchte und wo anders einfügen sprich jedesmal wenn ich den text kopieren möchte wird er blau...

Auch ist das buchstabengenau färben nur etwas für geübte Mausbenutzer etc selbst mir ging es so, dass ein Buchstabe zuviel farbig markiert wurde. Die Lösung die ich für meine Zwecke anstrebe sieht so aus:

Text wird makiert mit der Maus dann folgt ein druck auf einen JButton, der den markierten Text einfärbt mit einer Farbe die in dem Jbutton definiert ist etc... wenn nun falsch markiert und eine Farbe vergeben wurde drückt der Benutzer einfach den 2. JButton mit der Farbe schwarz und macht somit das einfärben rückgängig, da schwarz eben ursprungsfarbe ist.  dennoch danke für deinen Code, kann sicher ne Menge davon lernen!


----------



## Nuke (1. Sep 2007)

Nachtrag: und es soll möglich sein, dass ich verschiedene Textbereiche in einer Zeile farbig mache, das geht bei dir ja net ;-)


----------



## André Uhres (1. Sep 2007)

Nuke hat gesagt.:
			
		

> Nachtrag: und es soll möglich sein, dass ich verschiedene Textbereiche in einer Zeile farbig mache, das geht bei dir ja net ;-)


Wenn du mit Zeile "Zelle" meinst, stimme ich zu :wink:


----------



## Nuke (1. Sep 2007)

André Uhres hat gesagt.:
			
		

> Nuke hat gesagt.:
> 
> 
> 
> ...


ja sorry ich meinte Zelle. Sobald ich mir nächste Woche deinen Code näher anschaue melde ich mich wieder in dem Thread hier  vielleicht sieht man sich ja  :lol:


----------



## André Uhres (1. Sep 2007)

Nicht zusammenhängenden Text in einer einzigen Textkomponente selektieren geht in Java nicht, zumindest nicht ohne sich die Uhrkette zu brechen. Highlighten würde gehen, falls das genügt, das ist aber keine Selektieren im üblichen Sinn, wo man das Selektierte dann mit der üblichen Tastenkombination kopieren kann :wink:


----------



## Nuke (1. Sep 2007)

André Uhres hat gesagt.:
			
		

> Nicht zusammenhängenden Text in einer einzigen Textkomponente selektieren geht in Java nicht, zumindest nicht ohne sich die Uhrkette zu brechen. Highlighten würde gehen, falls das genügt, das ist aber keine Selektieren im üblichen Sinn, wo man das Selektierte dann mit der üblichen Tastenkombination kopieren kann :wink:



hm... ich glaube wir meinen beide was anders   

Ich erzähl dir mal den Vorgang wie ich mir das vorstelle:

Ich habe * 1* Zelle und darin befindet sich dieser komplette Text:

Windows updates prüfen danach auf die office.microsoft.com site gehen und da die neuesten patches downloaden!

Nun soll der Benutzer einfach den Text "updates prüfen" markieren und auf den JButton "farbig machen" drücken. Danach markiert der User den Text "office.microsoft.com" und drückt wieder den JButton "farbig machen". Als ergebnis erhalte ich oben Satz mit der teilweise blauen Farbe. Das wird doch in Java gehen oder?


----------



## André Uhres (1. Sep 2007)

Ja natürlich geht das, das ist ja dann keine richtige Selektion mehr.
Highlights wäre eventuell auch eine Lösung um das blau einfärben zu ersetzen. Dazu braucht man dann aber einen eigenen Renderer, da JLabel keinen Highlighter hat.


----------



## Nuke (1. Sep 2007)

André Uhres hat gesagt.:
			
		

> Ja natürlich geht das, das ist ja dann keine richtige Selektion mehr.
> Highlights wäre eventuell auch eine Lösung um das blau einfärben zu ersetzen. Dazu braucht man dann aber einen eigenen Renderer, da JLabel keinen Highlighter hat.



Hm... keine richtige Selektion? etwas schwamming du verwirrst mich  :wink: 

Ich weiß noch nicht mal was Highlights sind  :lol:  doch Highlights können text blau färben?

eigener Renderer ? gibts für meinen Fall irgendwie ein Tutorial oder so? Was würdest du als Swing Profi mir denn für ein Vorgehen vorschlagen?


----------



## André Uhres (1. Sep 2007)

Nuke hat gesagt.:
			
		

> ..Sobald ich mir nächste Woche deinen Code näher anschaue melde ich mich wieder in dem Thread hier..


Gute Idee :wink:


----------



## Nuke (2. Sep 2007)

André Uhres hat gesagt.:
			
		

> Nuke hat gesagt.:
> 
> 
> 
> ...


 hehe noch eine Frage vorweg, dass ich mich schon mal drüber schlau machen kann... wenn ich die Tabelle als csv exportiere wo speichere ich dann, dass beim import dieser Datei der vorher gefärbte Text jetzt immer noch gefärbt ist?


----------



## Nuke (2. Sep 2007)

Was ist z.B. wenn ich eine Checkboxen in jeder Zeile einer Column darstellen möchte, dazu noch jede Zeile weiß/hellgrau abwechselnd und text farbig markieren benötige ich da 3 prepareRenderer Methoden ???


----------



## Nuke (2. Sep 2007)

Ich habe mich z.b. gefragt wie man diesen Code in die prepareRenderer Methode von dir einbaut:

```
// This table shades every other row yellow
    JTable table = new JTable() {
        public Component prepareRenderer(TableCellRenderer renderer,
                                         int rowIndex, int vColIndex) {
            Component c = super.prepareRenderer(renderer, rowIndex, vColIndex);
            if (rowIndex % 2 == 0 && !isCellSelected(rowIndex, vColIndex)) {
                c.setBackground(Color.yellow);
            } else {
                // If not shaded, match the table's background
                c.setBackground(getBackground());
            }
            return c;
        }
    };
```
 Hier wird ja ein c zurückgegeben, aber du machst return label; Wenn ich nun den prepareRenderer mit 3 Sachen überschreibe was gebe ich dann zurück ? alle drei zusammen?  :lol:


----------



## André Uhres (2. Sep 2007)

Nuke hat gesagt.:
			
		

> André Uhres hat gesagt.:
> 
> 
> 
> ...


Nehmen wir als Beispiel an, dies sei die erste Zeile deiner Tabelle:
*text der ersten  spalte;text der zweiten spalte;text der dritten spalte*

Zum Speichern kann man z.B. ein Zellattribut machen mit Angabe der Farbbereiche:
*text der ersten  spalte;colored(5-8,17-23)text der zweiten spalte;text der dritten spalte*

Du kannst aber auch zwei Tabellen speichern, die sich "überlagern",
eine mit den Texten und eine mit den Farbbereichen:
Tabelle 1: *text der ersten  spalte;text der zweiten spalte;text der dritten spalte*
Tabelle 2: *;5-8,17-23;*

Es gibt wohl noch viele andere Möglichkeiten, aber ich denke daß diese Bespiele dir schon weiterhelfen
und leicht zu implementieren sind :wink:


----------



## André Uhres (2. Sep 2007)

Nuke hat gesagt.:
			
		

> Was ist z.B. wenn ich eine Checkboxen in jeder Zeile einer Column darstellen möchte, dazu noch jede Zeile weiß/hellgrau abwechselnd und text farbig markieren benötige ich da 3 prepareRenderer Methoden ???


Nein, eine genügt :wink:


----------



## André Uhres (2. Sep 2007)

Nuke hat gesagt.:
			
		

> Ich habe mich z.b. gefragt wie man diesen Code in die prepareRenderer Methode von dir einbaut:
> 
> ```
> // This table shades every other row yellow
> ...


return c;
(du scheinst ja ein recht lustiger Bürger zu sein  )


----------



## André Uhres (2. Sep 2007)

Nuke hat gesagt.:
			
		

> > Eclipse von NetBeans korrigiert
> 
> 
> ..Du meinst wenn man meinen "falschen" code in netbeans läd kann ich dort quickfix machen und es geht ?..


Ja, mit NetBeans Refactoring ging es sehr schnell, denn das Problem lag ja nur darin, daß du eine innere Klasse falsch "veräussert" hast.
Ich hab die Klasse also wieder "verinnerlicht" und dann einfach NetBeans gesagt, er soll sie für mich "veräussern" 
(ein Mausklick) :wink:


----------



## Nuke (2. Sep 2007)

André Uhres hat gesagt.:
			
		

> Nuke hat gesagt.:
> 
> 
> 
> ...



Ich glaube da hast du mich net verstanden:

wenn ich für 3 SAchen nur eine prepareRenderer Methode brauche und ich in der Methode 3 sachen zurückgeben will und du sagst jetzt nur "return c" wo wird dann z.B. dein label zurückgegeben?

hier dein code:


```
public Component prepareRenderer(final TableCellRenderer renderer, final int row, final int column) {
                JLabel label = (JLabel)super.prepareRenderer(renderer, row, column);
                
                String key = String.valueOf(row)+";"+String.valueOf(column);
                String range = (String) colormap.get(key);
                if(range != null){
                    String text = label.getText();
                    int start = Integer.parseInt(range.split(";")[0]);
                    int end = Integer.parseInt(range.split(";")[1]);
                    String color = range.split(";")[2];
                    label.setText("<html>"+text.substring(0, start)+"<font color=" +color+ ">"
                            +text.substring(start, end)+"</font>"+text.substring(end));
                }
                return label;
```
 da steht return label, sollte ich da oben anstatt "label" einfach Jlabel c = (Jlabel) schreiben damit alle c zurückgegeben werden? Ich bin net lustig nur verwirrt  :bae:


----------



## André Uhres (2. Sep 2007)

Nuke hat gesagt.:
			
		

> .. da steht return label, sollte ich da oben anstatt "label" einfach Jlabel c = (Jlabel) schreiben damit alle c zurückgegeben werden? ..


Ja, das geht. Das ist eh immer ein JLabel (ausser man definiert ausdrücklich, daß es anders ist).

Ich dachte übrigens nur du seist lustig, weil du schon wiederholt gelacht hast, 
falls man deinen Smilies glauben kann :wink:


----------



## Nuke (2. Sep 2007)

> falls man deinen Smilies glauben kann :wink:


 also jetzt bist du lustig... warum sollte ich smilies machen die ich net so meine??  :wink:


----------



## André Uhres (2. Sep 2007)

Nuke hat gesagt.:
			
		

> .. warum sollte ich smilies machen die ich net so meine??  :wink:


Naja, zuerst lachst du (oder zumindest dein Smilie) und dann sagst du sowas:


			
				Nuke hat gesagt.:
			
		

> ..Ich bin net lustig..


 :lol:  :lol:  :lol:


----------



## Guest (2. Sep 2007)

André Uhres hat gesagt.:
			
		

> Nuke hat gesagt.:
> 
> 
> 
> ...


 an schmarn das darfst bei mir net so wörtlich nehmen ;-)


----------



## Nuke (2. Sep 2007)

ich wars... ich glaube ich reg mich mal hoffe, dass mein Name noch frei ist ^^


----------



## Nuke (3. Sep 2007)

> Ja, das geht. Das ist eh immer ein JLabel (ausser man definiert ausdrücklich, daß es anders ist).



Das heißt jedes Objekt sprich zelle in einer jtable ist ein JLabel ? Wenn ja wie kann ich dann einen Inneren Abstand des Textes Zum Label-Rahmen festlegen, wenn es die Methode setMargin für JLabel nicht gibt ?

Das heißt die einzelnen Zellen im Header einer Jtable sind auch Label ?


----------



## André Uhres (3. Sep 2007)

Der DefaultTableCellRenderer ist ein JLabel und der Abstand wird mit EmptyBorder gemacht 
(der BooleanRenderer ist natürlich eine JCheckBox).


----------



## Nuke (3. Sep 2007)

> (der BooleanRenderer ist natürlich eine JCheckBox)



als hättest du gewußt was ich fast als nächstes gefragt hätte    :lol:


----------



## Nuke (17. Sep 2007)

André Uhres hat gesagt.:
			
		

> Ja natürlich geht das, das ist ja dann keine richtige Selektion mehr.
> Highlights wäre eventuell auch eine Lösung um das blau einfärben zu ersetzen. Dazu braucht man dann aber einen eigenen Renderer, da JLabel keinen Highlighter hat.



so endlich habe ich wieder etwas Zeit gefunden... obige Aussage ist verwirrend: einerseits sind Highlights eventuell ??? (ja/nein)  auch ??? (was noch?) eine Lösung. Dieser eigene Renderer wird der nicht von JLabel abgeleitet, da du sagt JLabel hat keinen Hightlighter. Nochmals wenn ich einen Text markiert habe und ich per jbutton den markierten Text einfärbe, dann soll die Farbe nicht verschwinden, wenn den cursor wo anders reinklicke. Dieses Highlighten hört sich immer so an als würde nur eine Selection farblich hervorgehoben werden und nicht der Text selbst eingefärbt beständig.

OK angenommen ich befinde mich in der spalte 5 ich benötige diese einfärb-Geschichte auch nur für eine bestimmte Spalte. 

Ich könnte den eigenen Renderer so machen:

```
int vCol = 5;
 TableColumn coloredColumn = tabelle.getColumnModel().getColumn(vCol);
 coloredColumn.setCellEditor(new ComboBoxCellEditor()); 
 coloredColumn.setCellRenderer(new ComboBoxCellRenderer());
```

Die beiden Klassen ComboBoxCellEditor + ComboBoxCellRenderer müsste man halt noch schreiben. Währe die Spalte 5 dann vom Typ Object.class ? wegen der Farbe... oder doch String.class.


----------



## André Uhres (18. Sep 2007)

eventuell = wenn einer will
auch = ausser der Schriftfarbe
eigener Renderer = JTextPane
Highlight = z.B. das was du siehst, wenn bei einem Editor das Wort, nach dem du gesucht hast, überall hervorgehoben wird, wo es vorkommt
Spaltentyp = String


----------



## Nuke (18. Sep 2007)

André Uhres hat gesagt.:
			
		

> eventuell = wenn einer will
> auch = ausser der Schriftfarbe
> eigener Renderer = JTextPane
> Highlight = z.B. das was du siehst, wenn bei einem Editor das Wort, nach dem du gesucht hast, überall hervorgehoben wird, wo es vorkommt
> Spaltentyp = String



Also müsste ich eine Klasse von einer JTextPane ableiten die das TableCellRenderer Interface implementiert ja?

so:


```
public class MyJTextPaneRenderer extends JTextPane implements TableCellRenderer 
{
	private static final long serialVersionUID = 1L;
    MyJTextPaneRenderer textpane;    
        
        
	public MyJTextPaneRenderer()
    {
             
    }
        
    	public Component getTableCellRendererComponent(final JTable table, final Object value,
                final boolean isSelected, final boolean hasFocus, final int row, final int column)    	{
            
    	  String text2Colorize = textpane.getSelectedText();
           ...	
    		
    		
            return this;
        }
    }
```

Wäre obiger Ansatz irgendwie richtig? Sonst BITTE sag wenn ich auf dem Holzweg bin, da ich immer noch nicht weiß und NULL sicher bin wie ich das ganze überhaupt erreichen kann, da google und forumsuche NULL ergebnis dazu hat. Alles was ich immer finde ist wie man den kompletten Text in einer Tabelle färbt. Sowas habe ich ja schon doch, eben färbt es alles und nicht nur den selektierten text...


----------



## Nuke (21. Sep 2007)

```
while(it.hasNext())
            {
                String key = (String) it.next();
                String value = colormap.get(key);
                if(value.split(";")[2].equalsIgnoreCase("blue"))
                {
                    it.remove();
                }
            }
            tabelle.updateUI();
```

in deiner colormap wo legst du da fest das "blue" die farbe blau ist??? ich finde null rgb werte oder sonstiges, dass auf eine blaue Farbe entschuldigung blaues Highlight hinweist ;-)

ist es irgendwie möglich dein Beispiel auf echtes Einfärben abzuändern oder wäre ich da auf dem Holzweg?

An welcher STelle genau, fragst du denn den selektierten Text ?

Ich weiß hier färbst du den selektierten Text ein:


```
public Component prepareRenderer(final TableCellRenderer renderer, final int row, final int column) {
                JLabel label = (JLabel)super.prepareRenderer(renderer, row, column);
                
                String key = String.valueOf(row)+";"+String.valueOf(column);
                String range = (String) colormap.get(key);
                if(range != null){
                    String text = label.getText();
                    int start = Integer.parseInt(range.split(";")[0]);
                    int end = Integer.parseInt(range.split(";")[1]);
                    String color = range.split(";")[2];
                    label.setText("<html>"+text.substring(0, start)+"<font color=" +color+ ">"
                            +text.substring(start, end)+"</font>"+text.substring(end));
                }
                return label;
            }
        };
```

3 x text.substring hast du einmal die default textfarbe falls das highlighten nicht ganz vorne anfängt, dann das Zweite it start,end wo du highlightest und das Dritte wo du ab Position end bis ganz zum ende des Textes wieder default color nimmst. Nichts anderes würde man ja bei dem einfärben auch machen. Generell muss der Komplette Text des Labels ausgelesen werden und danach wird er aufgesplittet(siehe substring) wo die Teile gefärbt werden mit html.

Bei String range = (String) colormap.get(key); holst du die Selektion aus der colormap raus was so drinsteht bsp. "15;35" dann kommt aber etwas merkwürdiges DENN du liest die range aus dem key aus der die row/column des JLabels selbst hat HÄ bin ich blöd ?? wie kannst du die Zeile z.B 1 und spalte 1 für die einfärbung des Textes nehmen, wo doch die Position der Zeichen in dem Label benötigt werden und nicht die Position des Labels selbst ???

*Edit:* hm lag ich doch falsch! 1;38;blue das befindet sich in der "range" variable! 

Frage: Wie kommt also die Selektion in die colormap ???
Antwort:


```
public boolean stopCellEditing() {
        boolean retValue;
        JTextField field = (JTextField)editorComponent;
        
        int start = field.getSelectionStart();
        int end = field.getSelectionEnd();
        
        String sel = field.getSelectedText();
        if (sel != null && !sel.equals("")) {
            imageListePanel.colormap.put(rowE+";"+colE, start+";"+end+";blue") ;
        }
        retValue = super.stopCellEditing();
        return retValue;
    }
```

Hm. das geht einfach so, dass du ein JTextField erzeugst in obiger Methode ? Hm ok dies geschieht im DefaultCellEditor nicht in der Tabelle selbst in der Anzeige. Toll der DefaultCellEditor erlaub nur JTextField, JCheckBox und JComboBox im Konstruktor, da ich mal versucht habe eine JTextPane einzufügen...

So André wie du siehst ich versuche mich durchzukämpfen und schreibe sogar deinen Namen richtig  :bae: (bin halb-franzose, daher muss ich das können ;-) )

Ich würde mich freuen, wenn du mir etwas... Hilfestellung geben könntest, und sorry ich will mich auch net mehr so aufregen wie weiter oben. Bitte.

*Edit:* Neue Erkentnis... das heißt im Editor habe ich das JTextField mit seinen getSelectionEnd/Start methoden und in der Ausgabe das JLabel das den kompletten Text aufbereitet bekommen muss hm ok mal schauen ob ich da was hinbekomme...


----------



## André Uhres (22. Sep 2007)

Ein Beispiel mit JTextPane als Renderer: http://www.java-forum.org/de/userfiles/user3690/TableTextColorDemo.java


----------



## Nuke (22. Sep 2007)

André Uhres hat gesagt.:
			
		

> Ein Beispiel mit JTextPane als Renderer: http://www.java-forum.org/de/userfiles/user3690/TableTextColorDemo.java



also isses doch möglich  :wink:  Ich schaus mir in einer woche an , muss erst mit xml /serialisierung klarkommen und danach check ich deinen code, rippe das highlighten raus und ändere den code des roten Style so ab, dass der user sich eine farbe aus ner list oder combobox aussuchen kann und den style entsprechend übergibt. 

kannst du dir mein unteres Beispiel mal anschauen bitte:

Problem: Wenn der Anwender text markiert und zur jcombobox wechselt um die farbeeinstellung zu ändern, verschwindet die selection. Ist ja eine natürliche Sache. Doch wenn ich in meinem word/openoffice einen text selektiere und auf das farbfeld klicke verschwindet die Selektion net ^^. Weißt du ungefähr, brauchst mir hier jetzt keinen fertigen code wieder hinknallen ;-) ich hätte viel lieber eine grobe route wie man das machen könnte und ich kämpfe mich durch. Sprich wie würdest du das grob machen? Ich nehme mal an, dass irgend ein STandartverhalten geändert werden muss. Und zwar vermute ich in dem moment wo man auf die Jcombobox klickt wird die selektion des textes abgefragt oder vorher zwischengespeichert und dann mit setSelectionEnd()/setSelectionStart neu zurück gesetzt oder ? Wie könnte ich dann das Jcombobox#mouse_gotClicked oder so ähnlich... überschreiben? So dass jedesmal wenn ich die jcombobox anklicke die selection des Textes neu gesetzt wird auf die zwischengespeicherten daten?


```
public class MainWindow extends JFrame implements ActionListener
{
	private static final long serialVersionUID = 1L;	
	private String text = "Hello I am the text which can be selected and after colorized with a simple click on the button!";  

	private JTextPane textPane = new JTextPane();
	private JScrollPane pane = new JScrollPane(textPane);
	private StyledDocument doc = textPane.getStyledDocument();
	 
	private DefaultComboBoxModel modelCB = new DefaultComboBoxModel();		
	private JComboBox mycombobox = new JComboBox(modelCB);
	
	private JButton colorBT = new JButton("colorize Text");	 
	
	public MainWindow()
	{ 	
		super("test for coloring selected Text"); 
        setLayout(null); 
        add(pane);
        add(colorBT);
        add(mycombobox);
         
        mycombobox.setBounds(400, 0, 130, 50);
        colorBT.setBounds(400,51,130,150);
        pane.setBounds(0,0,400,200);
        
        Color gruen = new Color(0,155,0);
		Color rot = new Color(255,0,0);
		Color blau = new Color(30,144,255);
		
		mycombobox.addItem(gruen);
		mycombobox.addItem(rot);
		mycombobox.addItem(blau);		
		mycombobox.setRenderer(new ColorComboBoxRenderer());
        
        textPane.setText(text);        
        colorBT.addActionListener(this);
    } 
	
	public void colorizeText(Color mycolor)
	{		
		Style red = doc.addStyle("red", null); 
	    StyleConstants.setForeground(red, mycolor);		
		int offset =  textPane.getSelectionStart();        
        int length = textPane.getSelectionEnd() - offset;        
        doc.setCharacterAttributes(offset,length, textPane.getStyle("red"), true);		
         
	}
	
	public void actionPerformed(ActionEvent e)
	{
		if(e.getSource().equals(colorBT))
		{			
			colorizeText(setSelectedColor());			
		}	
	} 
	
	public Color setSelectedColor()
	{
		int index = mycombobox.getSelectedIndex();
    	Color tempColor = (Color)mycombobox.getModel().getElementAt(index);    	 
		return tempColor;		
	}
	
	public static void main(String args[])
	{
		MainWindow myWindow = new MainWindow();
        myWindow.setSize(540,228);
        myWindow.setLocationRelativeTo(null);       
        myWindow.setVisible(true);        
    }    
}
```


```
class ColorComboBoxRenderer extends JPanel implements ListCellRenderer
{
		protected Color mycolor = Color.black;
		protected Color focusColor =	(Color) UIManager.get("List.selectionBackground");
		protected Color nonFocusColor = Color.white;
	
		public Component getListCellRendererComponent(JList list, Object obj, int row, boolean sel, boolean hasFocus)
		{
			if (hasFocus || sel) setBorder(new CompoundBorder(new MatteBorder(8, 10, 8, 10, focusColor),new LineBorder(Color.black)));
			
			else setBorder(new CompoundBorder(new MatteBorder(8, 10, 8, 10, nonFocusColor),new LineBorder(Color.black)));
			
			if (obj instanceof Color) mycolor = (Color) obj;
			
			return this;
		}
	
		public void paintComponent(Graphics g)
		{			
			setBackground(mycolor);
			super.paintComponent(g);		
		}
}
```


----------



## André Uhres (22. Sep 2007)

Nuke hat gesagt.:
			
		

> ..kannst du dir mein unteres Beispiel mal anschauen bitte..


Ja gut, ich schau's mir in zwei Wochen an.


----------



## Nuke (23. Sep 2007)

André Uhres hat gesagt.:
			
		

> Nuke hat gesagt.:
> 
> 
> 
> ...



ah gehst in urlaub? oder war das jetzt ein scherz , weil ich sagte ich schau mir deinen code in einer woche an? Ich kann jetzt grad echt net zuerst muss ich das programm lauffähig machen sprich speichern /laden über xml serialisieren. Dann checke ich deinen Code. Hoffe du bist jetzt net böse...


Ok ich habe deinen code nochmals gecheckt. 2 Dinge sind mir aufgefallen und ich weiß net ob die dir 100 % bewußt sind oder zumindest eins davon.

1. wenn ich text in einer zelle markiere und färbe und danach in der gleiche zelle wieder was färben will verschwindet die vorherige Färbung, HÖ???

2.Wenn das alles JTextpanes sind in jeder einzelnen Tabellenzelle, warum bleibt der Text in einer JTextPane nicht gefärbt, wenn ich ein 2. mal etwas färbe? kann es sein , dass da deine Highlights noch zu viel mitmischen?

Wenn du mal mein kleines Beispiel anschaust. Ist auch eine JTextPane wie sie in deiner Tabellenzelle vorkommen könnte. Nur wenn ich da etwas färbe sogar mit 3 farben, dann kann ich färben so oft ich will die färbung bleibt. 

Frage: Frage ist diese Eigenschaft bei deinen JTextPanes bzw. Zellen verloren gegangen? 

Ich habe das table.editCellAt(row, column); mal entfernt da es ungewohnt sein könnte von der Bedienung dann ist mir aber aufgefallen, dass die blaue Hintergrund selektion verschwunden ist? Ich habe schon alles mit getSelectionBackground probiert und Selection Model aber scheint diese visuelle Hilfestellung ist verschwunden...


----------



## André Uhres (23. Sep 2007)

Ich bin jetzt verärgert, aber das vergeht wieder. Stell dir einfach vor, ich hätte Urlaub. Vielleicht entdeckst du beim Studieren meiner Beispiele noch Lösungsmöglichkeiten :wink:


----------



## Nuke (23. Sep 2007)

ok bis in 2 wochen ;-)


----------

