Teile von Text in einer tabellenspalte farbig machen

Status
Nicht offen für weitere Antworten.
N

Nuke

Gast
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

Top Contributor
Code:
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);
        }
    }
}
 
N

Nuke

Gast
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

Top Contributor
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.
 
N

Nuke

Gast
Code:
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:
Code:
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
Code:
dim.setValue("bla",1,1); ??
 

merlin2

Top Contributor
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>();
^
TableTextColordemo.java:95: ';' expected
for (String key : colormap.keySet()) {
^
TableTextColordemo.java:103: illegal start of expression
}
^
3 errors

D:\Eigene Dateien\MERLIN\Java>java -version
java version "1.6.0_02"
Java(TM) SE Runtime Environment (build 1.6.0_02-b05)
Java HotSpot(TM) Client VM (build 1.6.0_02-b05, mixed mode, sharing)
 
N

Nuke

Gast
André Uhres hat gesagt.:
Bei mir kompiliert's.

Nuke hat gesagt.:
..wo ist bei deinem Beispiel die dim-instanz? ..
Code:
dim = (DefaultTableModel)table.getModel();

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

Top Contributor
Nuke hat gesagt.:
..aha ich versteh nix :lol:
Doch, das kommt eigentlich alles auf dasselbe hinaus. Es gibt halt verschiedenen Wege zum Ziel:
Code:
       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:
Code:
class MyModel extends DefaultTableModel{
    public Class getColumnClass(final int columnIndex) {
        return String.class;
    }
}
Dann könnte man kürzer schreiben:
Code:
dim = new MyModel(data, columns);
Ich hoffe, das ist jetzt etwas klarer ausgedrückt.
 
N

Nuke

Gast
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


Code:
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


Code:
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




Code:
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:

Code:
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:
 
N

Nuke

Gast
Eclipse von NetBeans korrigiert :cool:

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...
 
N

Nuke

Gast
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!
 
N

Nuke

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

Nuke

Gast
André Uhres hat gesagt.:
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:
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

Top Contributor
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:
 
N

Nuke

Gast
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 :D

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

Top Contributor
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.
 
N

Nuke

Gast
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?
 
N

Nuke

Gast
André Uhres hat gesagt.:
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:
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?
 
N

Nuke

Gast
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 ???
 
N

Nuke

Gast
Ich habe mich z.b. gefragt wie man diesen Code in die prepareRenderer Methode von dir einbaut:
Code:
 // 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

Top Contributor
Nuke hat gesagt.:
André Uhres hat gesagt.:
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:
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?
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

Top Contributor
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

Top Contributor
Nuke hat gesagt.:
Ich habe mich z.b. gefragt wie man diesen Code in die prepareRenderer Methode von dir einbaut:
Code:
 // 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:
return c;
(du scheinst ja ein recht lustiger Bürger zu sein :cool: )
 

André Uhres

Top Contributor
Nuke hat gesagt.:
Eclipse von NetBeans korrigiert :cool:
..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:
 
N

Nuke

Gast
André Uhres hat gesagt.:
Nuke hat gesagt.:
Ich habe mich z.b. gefragt wie man diesen Code in die prepareRenderer Methode von dir einbaut:
Code:
 // 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:
return c;
(du scheinst ja ein recht lustiger Bürger zu sein :cool: )

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:

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

Top Contributor
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:
 
N

Nuke

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

Nuke

Mitglied
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

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

Nuke

Mitglied
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:
Code:
 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

Top Contributor
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

Mitglied
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:

Code:
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

Mitglied
Code:
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:

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;
            }
        };

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:

Code:
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...
 

Nuke

Mitglied
André Uhres hat gesagt.:

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?

Code:
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);        
    }    
}

Code:
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);		
		}
}
 

Nuke

Mitglied
André Uhres hat gesagt.:
Nuke hat gesagt.:
..kannst du dir mein unteres Beispiel mal anschauen bitte..
Ja gut, ich schau's mir in zwei Wochen an.

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

Top Contributor
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:
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Text via RegEx durchsuchen und teile ersetzten Allgemeine Java-Themen 5
KonradN Oracle übergibt (Java Teile der) GraalVM Community Edition an OpenJDK Community Allgemeine Java-Themen 2
OnDemand Teile eines Links entfernen Allgemeine Java-Themen 6
L RegEx für Teile einer Berechnung Allgemeine Java-Themen 14
T Teile eines Double-Wertes verändern Allgemeine Java-Themen 2
Joew0815 Algorithmus - Zahlenfolge in 4 ähnliche Teile aufteilen Allgemeine Java-Themen 0
P Werte in Array zählen und Summe der einzelnen Teile ausgeben Allgemeine Java-Themen 10
D Nur Teile einer Datei symetrisch Verschlüsseln Allgemeine Java-Themen 4
S teile einer datei mit Regexp ersetzen Allgemeine Java-Themen 5
F Teile vom InputStream schreiben Allgemeine Java-Themen 9
J Teile eines Strings ersetzen Allgemeine Java-Themen 2
I Teile von ArrayList in eine andere kopieren? Allgemeine Java-Themen 2
L Fehlende Teile des javax Packages Allgemeine Java-Themen 3
H teile eines codes überspringen Allgemeine Java-Themen 4
G Strings "umformen" bzw. Teile "abschneiden&qu Allgemeine Java-Themen 12
M Teile eines Strings ausgeben Allgemeine Java-Themen 9
bernd Teile eines String Array Allgemeine Java-Themen 13
G Dateien öffnen + Teile ersetzten! Allgemeine Java-Themen 2
bummerland Teile von Dateien downloaden Allgemeine Java-Themen 7
C EML Email Text in String wandeln Allgemeine Java-Themen 11
O Text aus einer Textdatei rausholen, der zwischen zwei Schlüsselworten steht Allgemeine Java-Themen 4
K Bildschirm auslesen/ Text erkennen Allgemeine Java-Themen 5
berserkerdq2 Text über einen Shape anzeigen (Scenebuilder) Allgemeine Java-Themen 1
M Thymeleaf th value und th text Allgemeine Java-Themen 1
_user_q Eingegebenen Text Zeile für Zeile ausgeben lassen Allgemeine Java-Themen 11
_user_q Eingegebenen Text wiederholt schreiben lassen Allgemeine Java-Themen 9
G Darstellung von Text auf MapContext von GeoTools Allgemeine Java-Themen 2
Alex_99 Programm stürzt beim Aufruf der Funktion ab? Text ausgeben Allgemeine Java-Themen 45
Mozart53 JLabel nur meinen Text verschieben ohne Image Allgemeine Java-Themen 3
izoards Bestimmter Text aus PDF extrahieren Allgemeine Java-Themen 3
B Scanner erkennt keinen Text in Textdatei, obwohl welcher drinsteht Allgemeine Java-Themen 10
K HTMLEditor HTML Text in Rich Text umwandeln Allgemeine Java-Themen 14
kodela JDialog zeigt Text nicht an Allgemeine Java-Themen 5
L Text filtern Allgemeine Java-Themen 1
Bluedaishi TEXT Kodierung Allgemeine Java-Themen 3
J Die Letzte Zahl aus einer Text datei lesen Allgemeine Java-Themen 8
S Ini Text aus String parsen Allgemeine Java-Themen 1
M itext - Button der Text in Zwischenablage stellt Allgemeine Java-Themen 0
E CSV mit Text und Binärdaten auslesen Allgemeine Java-Themen 7
FRI3ND Datentypen Date-Array sortieren - Text mitnehmen? Allgemeine Java-Themen 7
I Text suchen und ersetzen im Word Dokument Allgemeine Java-Themen 3
windl Text mining / deep learning Allgemeine Java-Themen 0
I Text aus Input-Box entnehmen und zuweisen Allgemeine Java-Themen 1
KeexZDeveoper Text Mining Allgemeine Java-Themen 3
L Input/Output Wie kann man in der Konsole einen Text farbig ausgeben z.b in grün Allgemeine Java-Themen 6
B Arrays mit Text und Zahlen füllen Allgemeine Java-Themen 3
A Datenexport (Text und Draw) Allgemeine Java-Themen 1
L Text von txt auf JTextArea Allgemeine Java-Themen 4
N Das Ende von bestimmten zeilen in text datei ändern und speichern Allgemeine Java-Themen 3
A 2D-Grafik Text in ein Bild schreiben Allgemeine Java-Themen 11
T Textarea text wird immer überschrieben Allgemeine Java-Themen 4
I Apache POI Word Text einfügen Allgemeine Java-Themen 26
T itext: text in ein textfeld hinzufügen Allgemeine Java-Themen 2
B Farbiger Text in der Konsole Allgemeine Java-Themen 1
K Pdf mit dynamischem Text mit iText Allgemeine Java-Themen 0
D Text Analyzer Allgemeine Java-Themen 2
RalleYTN Audiodatein(.ogg/.wav) in Text konvertieren Allgemeine Java-Themen 0
L Nach Button drücken den Text festspeichern Allgemeine Java-Themen 9
X Löschen von einer Zeile in einer Text Datei. Klappt nicht. Allgemeine Java-Themen 4
J Text lesen und in Variablen speichern Allgemeine Java-Themen 3
S Text in mehreren Sprachen korrekt darstellen? Wie waehle ich die Fonts aus..? Allgemeine Java-Themen 0
J Java - Zeile aus Text datei löschen Allgemeine Java-Themen 13
M Text in erstelltes Excelfile schreiben Allgemeine Java-Themen 6
N Input/Output Website Text auslesen und bestimmte Zeilen wiedergeben Allgemeine Java-Themen 4
W Arraylist Text Suchen und Datei löschen Allgemeine Java-Themen 5
P HTML Text bearbeiten Allgemeine Java-Themen 1
B JFrame Text Ausgabe Allgemeine Java-Themen 7
G Makierter Text in Arbeitsspeicher Allgemeine Java-Themen 2
B Text in die Mitte der Konsole schreiben. Allgemeine Java-Themen 1
M Variablen Variablen in Text einbinden Allgemeine Java-Themen 5
P iText Text zentrieren Allgemeine Java-Themen 3
J Verschlüsselung von Text? Allgemeine Java-Themen 2
M Text datei in java jar datei einbinden Allgemeine Java-Themen 4
S Swing Text in eine JTextArea schreiben Allgemeine Java-Themen 17
M Verschlüsselung von Text und Files durch RSA (Encoding Problem) Allgemeine Java-Themen 7
S Robuste Methode um Text von HTML code zu extrahieren..? Allgemeine Java-Themen 6
achillesat Rich Text Editor Allgemeine Java-Themen 2
M CMD-Text anzeigen Allgemeine Java-Themen 10
G Text Mining Allgemeine Java-Themen 7
B Text auf Standarddrucker drucken Allgemeine Java-Themen 3
S Library fuer Internet-Text-Daten-Quellen..? Allgemeine Java-Themen 8
nrg Find and replace Text docx Allgemeine Java-Themen 6
M Ein bestimmtes Wort in einem Text zählen (String in String) Allgemeine Java-Themen 9
S Text in for Schleife in Label einfügen Allgemeine Java-Themen 4
M Funktion gesucht: Text vektorisieren Allgemeine Java-Themen 20
D Wort in Text mit >100.000 Wörter finden Allgemeine Java-Themen 7
B Text wird nicht richtig angezeigt Allgemeine Java-Themen 9
Q Text Datei einlesen Allgemeine Java-Themen 27
N .doc text ändern Allgemeine Java-Themen 12
R Komponente hat nicht die gesetzten Eingeschaften (Text, Farbe) Allgemeine Java-Themen 3
M NOA an den Source Text des Dokumentes kommen Allgemeine Java-Themen 7
O Text mit Wildcard gegen regulären Ausdruck prüfen Allgemeine Java-Themen 3
A Umwandlung von Text/Zeichen in Polynome Allgemeine Java-Themen 8
Y Eclipse ppt Folie erzeugen + text plazieren Allgemeine Java-Themen 4
cedi Eingegebenen Text in der Konsole nicht sichtbar machen oder nur in Sternchen anzeigen Allgemeine Java-Themen 2
D markierten Text kopieren Allgemeine Java-Themen 2
P Doppeltverkettete Listen + Text Allgemeine Java-Themen 5
DEvent embedded Object Database in Text Format Allgemeine Java-Themen 5
C Datei als ASCII text einlesen ? Allgemeine Java-Themen 16
R Texterkennung - Text aus einem/r Bild/Grafik auslesen Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben