Custom UIManager

Hello,
I have a class which change the UIManager (UIManager.put(...)).
When the application starts, I have any problem.
But during the use of the application, the user can change the values in the UIManager.
When the values are inserted into the UIManager, I execute 'updateUI()', but the update is no visible, the objects keeps theirs gfx representation.
Help me please =)
Pierre Carpentier

Here is a section from the Java Swing tutorial that explains how to solve this problem:
http://java.sun.com/docs/books/tutorial/uiswing/misc/plaf.html#dynamic
The Swing tutorial is a great place to start for all Swing problems. It can be download for free from:
http://java.sun.com/docs/books/tutorial/

Similar Messages

  • UIManager & Custom UIs

    In my test application I have:
    - A custom LookAndFeel installed (extends MetalLookAndFeel)
    - GreenPanelUI and RedPanelUI which both extend BasicPanelUI
    Their paint methods draw a small green or red square in top left of the panel.
    - MyPanel which extends JPanel and uses GreenPanelUI as its default UI.
    - In my application JFrame I have:
    1 an instance of JPanel
    2 an instance of JPanel with setBackground(Color.red);
    3 an instance of MyPanel
    4 an instance of JPanel with setUI(RedPanelUI) & setBackground(Color.yellow)
    - There is also an editor which enables the user to change the UIDefaults for Panel.background. Everytime this is done SwingUtilities.updateComponentTreeUI( <my test app> ) is called to update the colours.
    When I start my app everything is fine and works as expected
    1 is grey - as expected from subclassing MetalLookAndFeel
    2 is red
    3 is grey with a green square
    4 is yellow with a red square
    Now when things go wrong is when the user chooses a new colour Panel.background. i.e.
    UIManager.put("Panel.background", new ColorUIResource(Color.blue));
    SwingUtilities.updateComponentTreeUI( <my test app> );
    Now;
    1 is blue - GOOD
    2 is red - GOOD
    3 is blue with a green square - GOOD
    4 is yellow - BAD
    Okay, I presume the SwingUtilities.updateComponentTreeUI has caused the default UI to be reinstalled for each JPanel.
    This where my knowledge and understanding of the use and scope of UIManager & L&F is lacking, 'cos what I'd like to do is call the setUI method on numerous instances of JPanel to install numerous different PanelUIs (which I know does work).
    However, this business of SwingUtilities.updateComponentTreeUI resetting the UI delegate is, for me in this case, annoying.
    It seems as if the only to keep the UI delegate is to subclass the JPanel and set its default UI with the UIManager. Therefore if I wish to display 5 Panels each with a different PanelUI then I must also create 5 different Panel subclasses. Surely this can't be right!!!
    Would appreciate any help or thoughts on this one.
    Thanks

    Any UI specialists out there? Please? Help??

  • Custom button UI Problem

    Hi all,
    I have written CustomButtonUI for JButton.
    But, it results into error.please suggest me.
    Here is the code:
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Rectangle;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import javax.accessibility.Accessible;
    import javax.swing.AbstractButton;
    import javax.swing.JButton;
    import javax.swing.JComponent;
    import javax.swing.UIManager;
    import javax.swing.plaf.ComponentUI;
    import javax.swing.plaf.basic.BasicButtonListener;
    import javax.swing.plaf.metal.MetalButtonUI;
    * CustomButtonUI.java
    * Created on March 4, 2010, 5:13 PM
    * @author  mourya
    public class CustomButtonUI extends javax.swing.JDialog {
        /** Creates new form CustomButtonUI */
        public CustomButtonUI(java.awt.Frame parent, boolean modal) {
            super(parent, modal);
            String DEFAULTCLASSID="Mybutton";
            UIManager.put(DEFAULTCLASSID, "Mybutton");
            UIManager.put("ButtonUI",DEFAULTCLASSID);
            initComponents();
            JButton jbutton = new JButton("Custom");
            jbutton.setBounds(10,10,100,20);
            add(jbutton);
            this.addWindowListener(new WindowAdapter()
                public void windowClosing(WindowEvent event)
                    System.exit(0);
        /** This method is called from within the constructor to
         * initialize the form.
         * WARNING: Do NOT modify this code. The content of this method is
         * always regenerated by the Form Editor.
        // <editor-fold defaultstate="collapsed" desc=" Generated Code ">                         
        private void initComponents() {
            setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
            org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
            getContentPane().setLayout(layout);
            layout.setHorizontalGroup(
                layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(0, 400, Short.MAX_VALUE)
            layout.setVerticalGroup(
                layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(0, 300, Short.MAX_VALUE)
            pack();
        }// </editor-fold>                       
         * @param args the command line arguments
        public static void main(String args[]) {
            java.awt.EventQueue.invokeLater(new Runnable() {
                public void run() {
                    new CustomButtonUI(new javax.swing.JFrame(), true).setVisible(true);
        // Variables declaration - do not modify                    
        // End of variables declaration                  
    class Mybutton extends MetalButtonUI
         private final static Mybutton
          mMybutton = new Mybutton();
        public static ComponentUI createUI(JComponent c)
          return mMybutton;
        protected void clearTextShiftOffset()
            super.clearTextShiftOffset();
        protected void finalize() throws Throwable
            super.finalize();
        protected BasicButtonListener createButtonListener(AbstractButton b)
            return super.createButtonListener(b);
        protected Color getDisabledTextColor()
            return super.getDisabledTextColor();
        protected Color getFocusColor()
            return super.getFocusColor();
        protected String getPropertyPrefix()
            return super.getPropertyPrefix();
        protected Color getSelectColor()
            return super.getSelectColor();
        protected int getTextShiftOffset() {
            return super.getTextShiftOffset();
        protected void installKeyboardActions(AbstractButton b)
            super.installKeyboardActions(b);
        protected void installListeners(AbstractButton b) {
            super.installListeners(b);
        protected Object clone() throws CloneNotSupportedException {
            return super.clone();
        protected void paintButtonPressed(Graphics g, AbstractButton b)
            super.paintButtonPressed(g,b);
        protected void paintFocus(Graphics g, AbstractButton b, Rectangle viewRect, Rectangle textRect, Rectangle iconRect) {
            super.paintFocus(g,b,viewRect,textRect,iconRect);
        protected void paintIcon(Graphics g, JComponent c, Rectangle iconRect) {
            super.paintIcon(g,c,iconRect);
        protected void paintText(Graphics g, AbstractButton b, Rectangle textRect, String text)
            g.setColor(Color.GRAY);
            super.paintText(g,b,textRect,text);
        protected void paintText(Graphics g, JComponent c, Rectangle textRect, String text) {
            g.setColor(Color.GRAY);
            super.paintText(g,c,textRect,text);
        protected void setTextShiftOffset() {
            super.setTextShiftOffset();
        protected void uninstallKeyboardActions(AbstractButton b) {
            super.uninstallKeyboardActions(b);
        protected void uninstallListeners(AbstractButton b) {
            super.uninstallListeners(b);
        public boolean contains(JComponent c, int x, int y)
            return super.contains(c,x,y);
        public boolean equals(Object obj)
            return super.equals(obj);
        public Accessible getAccessibleChild(JComponent c, int i) {
            return super.getAccessibleChild(c,i);
        public int getAccessibleChildrenCount(JComponent c) {
            return super.getAccessibleChildrenCount(c);
        public int getDefaultTextIconGap(AbstractButton b) {
            return super.getDefaultTextIconGap(b);
        public Dimension getMaximumSize(JComponent c) {
            return super.getMaximumSize(c);
        public Dimension getMinimumSize(JComponent c) {
            return super.getMinimumSize(c);
        public Dimension getPreferredSize(JComponent c) {
            return super.getPreferredSize(c);
        public void installDefaults(AbstractButton b) {
            super.installDefaults(b);
        public void installUI(JComponent c) {
            super.installUI(c);
        public int hashCode() {
            return super.hashCode();
        public void paint(Graphics g, JComponent c) {
            super.paint(g,c);
        public String toString() {
            return super.toString();
        public void uninstallDefaults(AbstractButton b)
            super.uninstallDefaults(b);
        public void uninstallUI(JComponent c)
            super.uninstallUI(c);
        public void update(Graphics g, JComponent c)
            super.update(g,c);
    }Thank You

    Hi DarrylBurke,
    Sure i will.
    But i have posted that code after trying all the possibilities.
    I thought that getUI() failed exception may have the resulkt for not implementing any method or any registration problem with UIManager.
    So, that is my test code not exactly i have posted that in hurry.
    Here is the code :
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Rectangle;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import javax.accessibility.Accessible;
    import javax.swing.AbstractButton;
    import javax.swing.JButton;
    import javax.swing.JComponent;
    import javax.swing.UIManager;
    import javax.swing.plaf.ComponentUI;
    import javax.swing.plaf.basic.BasicButtonListener;
    import javax.swing.plaf.metal.MetalButtonUI;
    * CustomButtonUI.java
    * Created on March 4, 2010, 5:13 PM
    * @author  mourya
    public class CustomButtonUI extends javax.swing.JDialog {
        /** Creates new form CustomButtonUI */
        public CustomButtonUI(java.awt.Frame parent, boolean modal) {
           super(parent, modal);
            String DEFAULTCLASSID="Mybutton";
            UIManager.put(DEFAULTCLASSID, "Mybutton");
            UIManager.put("ButtonUI",DEFAULTCLASSID);
            initComponents();
            JButton jbutton = new JButton("Custom");
            jbutton.setBounds(10,10,100,20);
            add(jbutton);
            this.addWindowListener(new WindowAdapter()
                public void windowClosing(WindowEvent event)
                    System.exit(0);
        /** This method is called from within the constructor to
         * initialize the form.
         * WARNING: Do NOT modify this code. The content of this method is
         * always regenerated by the Form Editor.
        // <editor-fold defaultstate="collapsed" desc=" Generated Code ">                         
        private void initComponents() {
            setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
            org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
            getContentPane().setLayout(layout);
            layout.setHorizontalGroup(
                layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(0, 400, Short.MAX_VALUE)
            layout.setVerticalGroup(
                layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(0, 300, Short.MAX_VALUE)
            pack();
        }// </editor-fold>                       
         * @param args the command line arguments
        public static void main(String args[]) {
            java.awt.EventQueue.invokeLater(new Runnable() {
                public void run() {
                    new CustomButtonUI(new javax.swing.JFrame(), true).setVisible(true);
        // Variables declaration - do not modify                    
        // End of variables declaration                  
    class Mybutton extends MetalButtonUI
         private final static Mybutton
          mMybutton = new Mybutton();
        public static ComponentUI createUI(JComponent c)
          return mMybutton;
        protected void paintText(Graphics g, AbstractButton b, Rectangle textRect, String text)
            g.setColor(Color.RED);
            super.paintText(g,b,textRect,text);
    }Can you please suggest me the possible solution for this problem.
    Thank You DarrylBurke

  • Custom component not working properly

    Hi all - I am trying to create a custom component. I have followed the suggested MVC architecture, and created the following classes:
    1. SuperLineModel (the MODEL)
    2. SuperLine (the actual component,e.g. the CONTROLLER)
    3. BasicSuperLineUI (the UI Delegate class, e.g. the VIEW)
    4. SuperLineUI (an abstract type class for my UI Delegate)
    I also have a fifth class that draws a frame and panel, and then adds the custom component to the panel. In the main method of this class, I
    register the UI delegate like this:
    UIManager.put(BasicSuperLineUI.UI_CLASS_ID, "com.volant.mapit.view.BasicSuperLineUI");Everything compiles without any problems, but the custom component is never painted for some reason. In fact, I added a print line to the UI delegates paint method just to see if it was ever called, and it wasn't. I know I'm missing something here, and it's probably something small. I'm hoping some of you Swing gurus can take a look at my code below and point out the problem for me.
    I really appreciate any help you can give me. Thanks.
    The classes are listed below:
    // SuperLineModel
    import javax.swing.*;
    import javax.swing.event.*;
    public class SuperLineModel
      private double sourceXCoord = 0;
      private double sourceYCoord = 0;
      private double targetXCoord = 0;
      private double targetYCoord = 0;
      private EventListenerList listenerList = new EventListenerList();
      public SuperLineModel()
      public SuperLineModel(double sourceXCoord, double sourceYCoord,
                           double targetXCoord, double targetYCoord)
        this.sourceXCoord = sourceXCoord;
        this.sourceYCoord = sourceYCoord;
        this.targetXCoord = targetXCoord;
        this.targetYCoord = targetYCoord;
      public void setSourceXCoord(double x)
        this.sourceXCoord = x;
        return;
      public void setSourceYCoord(double y)
        this.sourceYCoord = y;
        return;
      public void setTargetXCoord(double x)
        this.targetXCoord = x;
        return;
      public void setTargetYCoord(double y)
        this.targetYCoord = y;
        return;
      public double getSourceXCoord()
        return this.sourceXCoord;
      public double getSourceYCoord()
        return this.sourceYCoord;
      public double getTargetXCoord()
        return this.targetXCoord;
      public double getTargetYCoord()
        return this.targetYCoord;
      public void addChangeListener(ChangeListener cl)
        listenerList.add(ChangeListener.class, cl);
      public void removeChangeListener(ChangeListener cl)
        listenerList.remove(ChangeListener.class, cl);
    // SuperLine
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.event.*;
    import com.volant.mapit.view.*;
    import com.volant.mapit.model.*;
    public class SuperLine extends JComponent implements ChangeListener
      private SuperLineModel model;
      public SuperLine()
        init(new SuperLineModel());
      public SuperLine(SuperLineModel model)
        init(model);
      public void init(SuperLineModel model)
        setModel(model);
        setMinimumSize(new Dimension(50, 50));
        setPreferredSize(new Dimension(50,50));
        updateUI();
      public void setUI(BasicSuperLineUI ui)
        super.setUI(ui);
      public BasicSuperLineUI getUI()
        return (BasicSuperLineUI)ui;
      public void updateUI()
        setUI((BasicSuperLineUI)UIManager.getUI(this));
        invalidate();
      public String getUIClassID()
        return SuperLineUI.UI_CLASS_ID;
      public SuperLineModel getModel()
        return model;
      public void setModel(SuperLineModel model)
        SuperLineModel oldModel = model;
        if(oldModel != null)
          oldModel.removeChangeListener(this);
        if(model == null)
          model = new SuperLineModel();
        else
          model.addChangeListener(this);
        firePropertyChange("model", oldModel, model);
      public void stateChanged(ChangeEvent evt)
        repaint();
    // BasicSuperLineUI
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.plaf.*;
    import com.volant.mapit.control.*;
    public class BasicSuperLineUI extends SuperLineUI
      public static ComponentUI createUI(JComponent c)
        return new BasicSuperLineUI();
      public void installUI(JComponent c)
        SuperLine sl = (SuperLine)c;
      public void uninstallUI(JComponent c)
        SuperLine sl = (SuperLine)c;
      // This method is never called and I don't know why!!!
      public void paint(Graphics g, JComponent c)
        super.paint(g, c);
        System.out.println("test2");
        g.fillRect(0, 0, 200, 400);
    // SuperLineUI
    import javax.swing.plaf.*;
    import com.volant.mapit.control.*;
    public abstract class SuperLineUI extends ComponentUI
      public static final String UI_CLASS_ID = "SuperLineUI";

    A quick glance at the code and it looks ok with the exception of the following which I don't understand what you're trying to do:
      public void installUI(JComponent c)  {
        SuperLine sl = (SuperLine)c;
      public void uninstallUI(JComponent c)  {
        SuperLine sl = (SuperLine)c;
      }Here are my comments:
    1) I expect Superline sl to be a global variable for use elsewhere in your program.
    2) I have no idea what your uninstallUI does.
    This is what I would do:
      SuperLine sl;
      public void installUI(JComponent c)  {
        sl = (SuperLine)c;
      public void uninstallUI(JComponent c)  {
      }Finally, I am assuming that the changelistener will trigger a repaint which in turn will call your paint method, right?
    ;o)
    V.V.

  • Problem with focus border and ListCellRenderer in custom listbox

    I have a bug in some code that I adapted from another posting on this board -- basically what I've done is I have a class that implements a custom "key/value" mapping listbox in which each list item/cell is actually a JPanel consisting of 3 JLabels: the first label is the "key", the second is a fixed "==>" mapping string, and the 3rd is the value to which "key" is mapped.
    The code works fine as long as the list cell doesn't have the focus. When it does, it draws a border rectangle to indicate focus, but if the listbox needs to scroll horizontally to display all the text, part of the text gets cut off (i.e. "sometex..." where "sometext" should be displayed).
    The ListCellRenderer creates a Gridlayout to lay out the 3 labels in the cell's JPanel.
    What can I do to remedy this situation? I'm not sure what I'd need to do in terms of setting the size of the panel so that all the text gets displayed OK within the listbox. Or if there's something else I can do to fix this. The code and a main() to run the code are provided below. To reproduce the problem, click the Add Left and Add Right buttons to add a "mapping" -- when it doesn't have focus, everything displays fine, but when you give it focus, note the text on the right label gets cut off.
    //======================================================================
    // Begin Source Listing
    //======================================================================
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import java.util.Collection;
    import java.util.Iterator;
    import java.util.Vector;
    import java.util.Enumeration;
    public class TwoColumnListbox extends JPanel
    private JList m_list;
    private JScrollPane m_Pane;
    public TwoColumnListbox(Collection c)
         DataMapListModel model = new DataMapListModel();
         if (c != null)
         Iterator it = c.iterator();
         while (it.hasNext())
         model.addElement(it.next());
         m_list = new JList(model);
         ListBoxRenderer renderer= new ListBoxRenderer();
              m_list.setCellRenderer(renderer);
              setLayout(new BorderLayout());
              m_list.setVisibleRowCount(4);
              m_Pane = new JScrollPane(m_list);
              add(m_Pane, BorderLayout.NORTH);
    public JList getList()
    return m_list;
    public JScrollPane getScrollPane()
    return m_Pane;
    public static void main(String s[])
              JFrame frame = new JFrame("TwoColumnListbox");
              frame.addWindowListener(new WindowAdapter() {
              public void windowClosing(WindowEvent e) {System.exit(0);}
    final DataMappings dm = new DataMappings();
    final TwoColumnListbox lb = new TwoColumnListbox(dm.getMappings());
              final DataMap map = new DataMap();
              JButton leftAddBtn = new JButton("Add Left");
              leftAddBtn.addActionListener(new ActionListener() {
              public void actionPerformed(ActionEvent e)
              map.setSource("JButton1");
              DefaultListModel model = new DefaultListModel();
              model.addElement(map);
              lb.getList().setModel(model);
              JButton leftRemoveBtn = new JButton("Remove Left");
              leftRemoveBtn.addActionListener(new ActionListener() {
              public void actionPerformed(ActionEvent e)
              map.setSource("");
              DefaultListModel model = new DefaultListModel();
              model.addElement(map);
              lb.getList().setModel(model);
              JButton rightAddBtn = new JButton("Add Right");
    rightAddBtn.addActionListener(new ActionListener() {
              public void actionPerformed(ActionEvent e)
              map.setDestination("/getQuote/symbol[]");
              DefaultListModel model = new DefaultListModel();
              model.addElement(map);
              lb.getList().setModel(model);
              JButton rightRemoveBtn = new JButton("Remove Right");
    rightRemoveBtn.addActionListener(new ActionListener() {
              public void actionPerformed(ActionEvent e)
              map.setDestination("");
              DefaultListModel model = new DefaultListModel();
              model.addElement(map);
              lb.getList().setModel(model);
              JPanel leftPanel = new JPanel(new BorderLayout());
              leftPanel.add(leftAddBtn, BorderLayout.NORTH);
              leftPanel.add(leftRemoveBtn, BorderLayout.SOUTH);
    JPanel rightPanel = new JPanel(new BorderLayout());
              rightPanel.add(rightAddBtn, BorderLayout.NORTH);
              rightPanel.add(rightRemoveBtn, BorderLayout.SOUTH);
    frame.getContentPane().add(leftPanel, BorderLayout.WEST);
              frame.getContentPane().add(lb,BorderLayout.CENTER);
    frame.getContentPane().add(rightPanel, BorderLayout.EAST);
              frame.pack();
              frame.setVisible(true);
         class ListBoxRenderer extends JPanel implements ListCellRenderer
              private JLabel left;
              private JLabel arrow;
              private JLabel right;
              private Color clrForeground = UIManager.getColor("List.foreground");
    private Color clrBackground = UIManager.getColor("List.background");
    private Color clrSelectionForeground = UIManager.getColor("List.selectionForeground");
    private Color clrSelectionBackground = UIManager.getColor("List.selection.Background");
              public ListBoxRenderer()
                   setLayout(new GridLayout(1, 2, 10, 0));
                   //setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4));
                   left = new JLabel("");
                   left.setForeground(clrForeground);               
                   arrow = new JLabel("");
                   arrow.setHorizontalAlignment(SwingConstants.CENTER);
                   arrow.setForeground(clrForeground);
                   right = new JLabel("");
                   right.setHorizontalAlignment(SwingConstants.RIGHT);
                   right.setForeground(clrForeground);
                   add(left);
                   add(arrow);
                   add(right);
              public Component getListCellRendererComponent(JList list, Object value,
                        int index, boolean isSelected, boolean cellHasFocus)
                   if (isSelected)
                        setBackground(list.getSelectionBackground());
                        setForeground(list.getSelectionForeground());
                        left.setForeground(clrSelectionForeground);
                        arrow.setForeground(clrSelectionForeground);
                        right.setForeground(clrSelectionForeground);
                   else
                        setBackground(list.getBackground());
                        setForeground(list.getForeground());
                   left.setForeground(clrForeground);
                        arrow.setForeground(clrForeground);
                        right.setForeground(clrForeground);               
                   // draw focus rectangle if control has focus. Problem with focus
    // and cut off text!!
                   if (cellHasFocus)
                   // FIXME: for Windows LAF I'm not getting the correct thing here for some reason.
                   // Looks OK on Metal though.
                   setBorder(BorderFactory.createLineBorder(UIManager.getColor("focusCellHighlightBorder")));
                   else
                   setBorder(BorderFactory.createEmptyBorder());               
    DataMap map = (DataMap) value;
                   String displaySource = map.getSource();
                   String displayDest = map.getDestination();
                   left.setText(displaySource);
                   arrow.setText("=>to<=");
                   right.setText(displayDest);
                   return this;
    /** Interface for macro editor UI
    * @version 1.0
    class DataMappings
    private Collection mappings;
    public DataMappings()
    setMappings(new Vector(0));
    public DataMappings(Collection maps)
    setMappings(maps);
    /** gets mapping value of a specified source object
    * @param src -- the "key" or source object, what is mapped.
    * @return what the source object is mapped to
    * @version 1.0
    public Object getValue(String src)
    if (src != null)
    Iterator it = mappings.iterator();
    while (it.hasNext());
    DataMap thisMap = (DataMap) it.next();
    if (thisMap.getSource().equals(src))
    return thisMap.getDestination();
    return null;
    /** sets mapping value of a specified source object
    * @param src -- the "key" or source object, what is mapped.
    * @param what the source object is to be mapped to
    * @version 1.0
    public void setValue(String src, String dest)
    if (src != null)
    // see if the value is in there first.
    Iterator it = mappings.iterator();
    while (it.hasNext())
    DataMap thisMap = (DataMap) it.next();
    if (thisMap.getSource().equals(src))
    thisMap.setDestination(dest);
    return;
    // not in the collection, add it
    mappings.add(new DataMap(src, dest));
    /** gets collection of mappings
    * @return a collection of all mappings in this object.
    * @version 1.0
    public Collection getMappings()
    return mappings;
    /** sets collection of mappings
    * @param maps a collection of src to destination mappings.
    * @version 1.0
    public void setMappings(Collection maps)
    mappings = maps;
    /** adds a DataMap
    * @param map a DataMap to add to the mappings
    * @version 1.0
    public void add(DataMap map)
    if (map != null)
    mappings.add(map);
    class DataMap
    public DataMap() {}
    public DataMap(String source, String destination)
    m_source = source;
    m_destination = destination;
    public String getSource()
    return m_source;
    public void setSource(String s)
    m_source = s;
    public String getDestination()
    return m_destination;
    public void setDestination(String s)
    m_destination = s;
    protected String m_source = null;
    protected String m_destination = null;
    /** list model for datamaps that provides ways
    * to determine whether a source is already mapped or
    * a destination is already mapped.
    class DataMapListModel extends DefaultListModel
    public DataMapListModel()
    super();          
    /** determines whether a source is already mapped
    * @param src -- the source property of a datamapping
    * @return true if the source is in the list, false if not
    public boolean containsSource(Object src)
    Enumeration enum = elements();
    while (enum.hasMoreElements())
    DataMap dm = (DataMap) enum.nextElement();
    if (dm.getSource().equals(src))
    return true;
    return false;
    /** determines whether a destination is already mapped
    * @param dest -- the destination property of a datamapping
    * @return true if the destination is in the list, false if not
    public boolean containsDest(Object dest)
    Enumeration enum = elements();
    while (enum.hasMoreElements())
    DataMap dm = (DataMap) enum.nextElement();
    if (dm.getDestination().equals(dest))
    return true;
    return false;
    public DataMappings getDataMaps()
    DataMappings maps = new DataMappings();
    // add all the datamaps in the model
    Enumeration enum = elements();
    while (enum.hasMoreElements())
    DataMap dm = (DataMap) enum.nextElement();
    maps.add(dm);
    return maps;
    //======================================================================
    // End of Source Listing
    //======================================================================

    I did not read the program, but the chopping looks like a layout problem.
    I think it's heavy to use a panel + 3 components in a gridlayout for each cell. look at this sample where i draw the Cell myself,
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    import java.util.*;
    public class Jlist3 extends JFrame 
         Vector      v  = new Vector();
         JList       jc = new JList(v);
         JScrollPane js = new JScrollPane(jc);
    public Jlist3()
         addWindowListener(new WindowAdapter()
        {     public void windowClosing(WindowEvent ev)
              {     dispose();
                   System.exit(0);}});
         for (int j=0; j < 70; j++)     v.add(""+j*1000+"a  d"+j);
           setBounds(1,1,400,310);
         getContentPane().add(js);
         js.setPreferredSize(new Dimension(230,259));
         jc.setSelectedIndex(1);
         jc.setCellRenderer(new MyCellRenderer());
         getContentPane().setLayout(new FlowLayout());
         setVisible(true);
    public class MyCellRenderer extends JLabel implements ListCellRenderer
         String  txt;
         int     idx;
         boolean sel;
    public Component getListCellRendererComponent(JList list,
                             Object  value,           // value to display
                             int     index,           // cell index
                             boolean isSelected,      // is the cell selected
                             boolean cellHasFocus)    // the list and the cell have the focus
         idx = index;
         txt = value.toString();
         sel = isSelected;
         setText(txt);
         return(this);
    public void paintComponent(Graphics g)
         if (idx%2 == 1) g.setColor(Color.white);
              else        g.setColor(Color.lightGray);
         if (sel)        g.setColor(Color.blue);
         g.fillRect(0,0,getWidth(),getHeight());
         StringTokenizer st = new StringTokenizer(txt.trim()," ");
         g.setColor(Color.black);
         if (st.hasMoreTokens())     g.drawString(st.nextToken(),1,14);
         g.setColor(Color.red);
         g.drawString("===>",70,14);
         g.setColor(Color.black);
         if (st.hasMoreTokens())     g.drawString(st.nextToken(),110,14);
    public static void main (String[] args) 
         new Jlist3();
    Noah
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    import java.util.*;
    public class Jlist3 extends JFrame
         Vector v = new Vector();
         JList jc = new JList(v);
         JScrollPane js = new JScrollPane(jc);
    public Jlist3()
         addWindowListener(new WindowAdapter()
    {     public void windowClosing(WindowEvent ev)
              {     dispose();
                   System.exit(0);}});
         for (int j=0; j < 70; j++)     v.add(""+j*1000+"a d"+j);
         setBounds(1,1,400,310);
         getContentPane().add(js);
         js.setPreferredSize(new Dimension(230,259));
         jc.setSelectedIndex(1);
         jc.setCellRenderer(new MyCellRenderer());
         getContentPane().setLayout(new FlowLayout());
         setVisible(true);
    public class MyCellRenderer extends JLabel implements ListCellRenderer
         String txt;
         int idx;
         boolean sel;
    public Component getListCellRendererComponent(JList list,
                             Object value, // value to display
                             int index, // cell index
                             boolean isSelected, // is the cell selected
                             boolean cellHasFocus) // the list and the cell have the focus
         idx = index;
         txt = value.toString();
         sel = isSelected;
         setText(txt);
         return(this);
    public void paintComponent(Graphics g)
         if (idx%2 == 1) g.setColor(Color.white);
              else g.setColor(Color.lightGray);
         if (sel) g.setColor(Color.blue);
         g.fillRect(0,0,getWidth(),getHeight());
         StringTokenizer st = new StringTokenizer(txt.trim()," ");
         g.setColor(Color.black);
         if (st.hasMoreTokens())     g.drawString(st.nextToken(),1,14);
         g.setColor(Color.red);
         g.drawString("===>",70,14);
         g.setColor(Color.black);
         if (st.hasMoreTokens())     g.drawString(st.nextToken(),110,14);
    public static void main (String[] args)
         new Jlist3();
    }

  • Custom ComboBoxEditor and event notification at the end of the edition

    Hi,
    I am trying to write a custom ComboBoxEditor that delegates editing to a JFormattedTextField for inputing only integers in a JComboBox. However unlike the JTable and JTree editors, I find that the documentation is not clear on how to notify the parent combo box that the editing has finished and the user value has been validated. Since ComboBoxEditor has the addActionListener() and removeActionListener() methods in its signature, I naturally assumed that I could fire an ActionEvent to notify the combo when for example the JFormattedTextField just fired a PropertyChangeEvent on the "value" property.
    While it looks like this is working OK at first, this causes the following issue: when the component is displayed in a JOptionPane, the dialog box is closed as soon as the ActionEvent is fired which is definitely not the behavior we want the user to experience (note: the event is fired when the delegated editor loses focus for exemple by clicking in the JTextArea in the provided example). I find this quite odd as the default ComboBoxEditor does not behave this way: when the editor looses focus, the combo box simply fires an ItemEvent; however the code from the basic UI or the metal UI never fire an ActionEvent and thus supposedly never notify the parent combo (!). Of course if I disable the ActionEvent firing, the JOptionPane does not close but the JComboBox never fire an ItemEvent...
    Do you have any idea or suggestions to fix this problem?
    Note : for testing purposes, I also made a custom ComboBoxEditor delegating to a JSpinner*. This one experiences exactly the same issue than the one delegating to a JFormattedTextField.
    *Speaking of which: how come JSpinner does not have an API for its own editor??
    package test;
    import java.awt.*;
    import java.awt.event.*;
    import java.beans.*;
    import java.text.*;
    import javax.swing.*;
    import javax.swing.event.*;
    import javax.swing.text.*;
    * @author  fabriceb
    public class TestComboBoxEditor extends JPanel {
      enum Flavor {
        J_FORMATTED_TEXT_FIELD, J_SPINNER, DEFAULT;
      private static final long serialVersionUID = 1l;
       * Default font sizes.
      private static final int[] DEFAULT_SIZE = {8, 9, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 36, 48, 72};
       * Editing flag.
      private boolean isEditing;
      private JComboBox sizeCombo = new JComboBox(new DefaultComboBoxModel());
      private JTextArea textArea = new JTextArea("abcdefghijklmnopqrstuvwxyz\nABCDEFGHIJKLMNOPQRSTUVWXYZ\n1234567890.:,;()[]{}<>/\\+-*=!?_'\"@#$%^%&\nThe quick brown fox jumps over the lazy dog. 1234567890");
      private Flavor flavor = Flavor.J_FORMATTED_TEXT_FIELD;
      private boolean fireActionPerformed = true;
      public TestComboBoxEditor(Flavor flavor) {
        super();
        setPreferredSize(new Dimension(500, 150));
        this.flavor = flavor;
        setLayout(new BorderLayout());
        add(sizeCombo, BorderLayout.NORTH);
        add(new JScrollPane(textArea), BorderLayout.CENTER);
        textArea.setEditable(false);
        textArea.setLineWrap(true);
        textArea.setRows(5);
        sizeCombo.setEditable(true);
        sizeCombo.setMaximumRowCount(5);
        switch (flavor) {
          case J_FORMATTED_TEXT_FIELD:
            sizeCombo.setEditor(new SizeComboBoxEditor());
            break;
          case J_SPINNER: {
            sizeCombo.setEditor(new Size2ComboBoxEditor());
        DefaultComboBoxModel sizeModel = (DefaultComboBoxModel) sizeCombo.getModel();
        for (int size : DEFAULT_SIZE) {
          sizeModel.addElement(size);
        sizeCombo.setSelectedItem(textArea.getFont().getSize());
        sizeCombo.addItemListener(new ItemListener() {
          @Override
          public void itemStateChanged(ItemEvent event) {
            if (isEditing) {
              return;
            switch (event.getStateChange()) {
              case ItemEvent.SELECTED:
                  Object value = sizeCombo.getSelectedItem();
                  System.out.println("Received " + value + "\t" + value.getClass());
                  if ((value instanceof Integer) || (value instanceof Long)) {
                    int size = ((Number) value).intValue();
                    DefaultComboBoxModel sizeModel = (DefaultComboBoxModel) sizeCombo.getModel();
                    int sizeCount = sizeModel.getSize();
                    for (int i = 0; i <
                      sizeCount; i++) {
                      int val = ((Number) sizeModel.getElementAt(i)).intValue();
                      // Value already in combo.
                      if (size == val) {
                        break;
    // Insert before current value.
                      else if (val > size) {
                        sizeModel.insertElementAt(size, i);
                        break;
                      // Add at end.
                      else if (i == sizeCount - 1) {
                        sizeModel.addElement(size);
                        break;
                    applyNewFont();
                break;
       * Produces a new font from the user input.
      protected void applyNewFont() {
        int size = ((Number) sizeCombo.getSelectedItem()).intValue();
        Font font = textArea.getFont().deriveFont((float) size);
        textArea.setFont(font);
       * Self-test main.
       * @param args Arguments from the command line.
      public static void main(String... args) {
        SwingUtilities.invokeLater(new Runnable() {
           * {@inheritDoc}
          @Override
          public void run() {
            try {
              UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
              final JFrame frame = new JFrame("Test");
              frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              frame.setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS));
              for (final Flavor flavor : Flavor.values()) {
                JPanel panel = new JPanel();
                panel.setLayout(new FlowLayout(FlowLayout.LEFT));
                panel.add(new TestComboBoxEditor(flavor));
                switch (flavor) {
                  case J_FORMATTED_TEXT_FIELD:
                  case J_SPINNER:
                    JButton forwardEventButton = new JButton("Forward event");
                    forwardEventButton.addActionListener(new ActionListener() {
                      @Override
                      public void actionPerformed(ActionEvent event) {
                        JOptionPane.showMessageDialog(frame, new TestComboBoxEditor(flavor), flavor + " - Event forwarded", JOptionPane.INFORMATION_MESSAGE);
                    panel.add(forwardEventButton);
                    JButton doNotForwardEventButton = new JButton("Do Not Forward event");
                    doNotForwardEventButton.addActionListener(new ActionListener() {
                      @Override
                      public void actionPerformed(ActionEvent event) {
                        TestComboBoxEditor test = new TestComboBoxEditor(flavor);
                        test.fireActionPerformed = false;
                        JOptionPane.showMessageDialog(frame, test, flavor + " - Event not forwarded", JOptionPane.INFORMATION_MESSAGE);
                    panel.add(doNotForwardEventButton);
                    break;
                  case DEFAULT:
                    JButton openButton = new JButton("Dialog");
                    openButton.addActionListener(new ActionListener() {
                      @Override
                      public void actionPerformed(ActionEvent event) {
                        JOptionPane.showMessageDialog(frame, new TestComboBoxEditor(flavor), flavor + " - Default editor", JOptionPane.INFORMATION_MESSAGE);
                    panel.add(openButton);
                frame.add(panel);
              frame.pack();
              frame.setLocationRelativeTo(null);
              frame.setVisible(true);
            catch (Exception e) {
              e.printStackTrace();
       * A combo box editor that only accepts integers.
       * @author  fabriceb
      private class SizeComboBoxEditor implements ComboBoxEditor, PropertyChangeListener, FocusListener {
        private JFormattedTextField delegated = new JFormattedTextField(new NumberFormatter(NumberFormat.getIntegerInstance()));
        private EventListenerList listenerList = new EventListenerList();
        private boolean isEditing;
         * Creates a new instance.
        public SizeComboBoxEditor() {
          delegated.addPropertyChangeListener("value", this);
          delegated.addFocusListener(this);
          delegated.setBorder(null);
         * {@inheritDoc}
        @Override
        public Component getEditorComponent() {
          return delegated;
         * {@inheritDoc}
        @Override
        public void selectAll() {
          delegated.selectAll();
          delegated.requestFocus();
         * {@inheritDoc}
        @Override
        public void setItem(Object anObject) {
          isEditing = true;
          if (delegated.getValue() == null || !delegated.getValue().equals(anObject)) {
            delegated.setValue(anObject);
          isEditing = false;
         * {@inheritDoc}
        @Override
        public Object getItem() {
          return delegated.getValue();
         * {@inheritDoc}
        @Override
        public void addActionListener(ActionListener l) {
          listenerList.add(ActionListener.class, l);
         * {@inheritDoc}
        @Override
        public void removeActionListener(ActionListener l) {
          listenerList.remove(ActionListener.class, l);
        protected void fireActionEvent(Integer value) {
          Object listeners[] = listenerList.getListenerList();
          ActionEvent actionEvent = null;
          for (int i = listeners.length - 2; i >= 0; i -= 2) {
            if (listeners[i] == ActionListener.class) {
              // Lazily create the event.
              if (actionEvent == null) {
                actionEvent = new ActionEvent(delegated, ActionEvent.ACTION_PERFORMED, String.valueOf(value));
              ((ActionListener) listeners[i + 1]).actionPerformed(actionEvent);
         * {@inheritDoc}
        @Override
        public void propertyChange(PropertyChangeEvent event) {
          if (!isEditing) {
            Object value = delegated.getValue();
            if (value == null) {
              return;
            int val = ((Number) value).intValue();
            System.out.println("Should forward " + value);
            if (fireActionPerformed) {
              fireActionEvent(val);
        @Override
        public void focusGained(FocusEvent e) {
          System.out.println("JFormattedTextField: Focus gained.");
        @Override
        public void focusLost(FocusEvent e) {
          System.out.println("JFormattedTextField: Focus lost.");
       * A combo box editor that only accepts integers.
       * @author  fabriceb
      private class Size2ComboBoxEditor implements ComboBoxEditor, ChangeListener, FocusListener {
        private SpinnerNumberModel model = new SpinnerNumberModel(1, 1, 100, 1);
        private JSpinner delegated = new JSpinner(model);
        private EventListenerList listenerList = new EventListenerList();
        private boolean isEditing;
         * Creates a new instance.
        public Size2ComboBoxEditor() {
          delegated.addChangeListener(this);
          delegated.addFocusListener(this);
          delegated.setBorder(null);
         * {@inheritDoc}
        @Override
        public Component getEditorComponent() {
          return delegated;
         * {@inheritDoc}
        @Override
        public void selectAll() {
          //delegated.getEditor().selectAll();
          delegated.requestFocus();
         * {@inheritDoc}
        @Override
        public void setItem(Object anObject) {
          isEditing = true;
          if ((anObject != null) && (delegated.getValue() == null || !delegated.getValue().equals(anObject))) {
            delegated.setValue(anObject);
          isEditing = false;
         * {@inheritDoc}
        @Override
        public Object getItem() {
          return delegated.getValue();
         * {@inheritDoc}
        @Override
        public void addActionListener(ActionListener l) {
          listenerList.add(ActionListener.class, l);
         * {@inheritDoc}
        @Override
        public void removeActionListener(ActionListener l) {
          listenerList.remove(ActionListener.class, l);
        protected void fireActionEvent(Integer value) {
          Object listeners[] = listenerList.getListenerList();
          ActionEvent actionEvent = null;
          for (int i = listeners.length - 2; i >= 0; i -= 2) {
            if (listeners[i] == ActionListener.class) {
              // Lazily create the event.
              if (actionEvent == null) {
                actionEvent = new ActionEvent(delegated, ActionEvent.ACTION_PERFORMED, String.valueOf(value));
              ((ActionListener) listeners[i + 1]).actionPerformed(actionEvent);
         * {@inheritDoc}
        @Override
        public void stateChanged(ChangeEvent event) {
          if (!isEditing) {
            Object value = delegated.getValue();
            if (value == null) {
              return;
            int val = ((Number) value).intValue();
            System.out.println("Should forward " + value);
            if (fireActionPerformed) {
              fireActionEvent(val);
        @Override
        public void focusGained(FocusEvent e) {
          System.out.println("JSpinner: Focus gained.");
        @Override
        public void focusLost(FocusEvent e) {
          System.out.println("JSpinner: Focus lost.");
    {code}                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                

    Thanks for the advice but that's not what I am looking for. My itend is to later have a fully custimized editor that implied pattern configuration (for currency, scientific units, etc..) as well as context popup support as well as complitly different kinds of editors (ie: not-textfield based) but that still fit within the combo area (ie: the address bar for Vista's Explorer).
    I am still considering keeping a (weak) reference to the parent combo to manually edit its content when the PropertyChangeEvent is received.
    Edited by: bouye on Sep 1, 2008 2:23 PM

  • Custom DefaultTreeCellRender not rending node labels correctly.

    In our JTree we need to display the state of our custom nodes, the state can be cycled by the user clicking on the node. Our problem is that since upgrading from Java 1.4 if a node is clicked before it is expanded the child nodes will not be rendered correclty, some nodes may not have the label showing, some may not have the label or icon showing.
    Under Java 1.4 the following code works correctly.
    Under Java 1.5 and 1.6 If you click on a node before expanding it (which changes the node's icon) then expand the node the child nodes are not completely rendered, some may be missing a icon or label or both.
    package com.test;
    import java.awt.BorderLayout;
    import java.awt.Component;
    import java.awt.FlowLayout;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import javax.swing.Box;
    import javax.swing.Icon;
    import javax.swing.JButton;
    import javax.swing.JCheckBox;
    import javax.swing.JPanel;
    import javax.swing.JTree;
    import javax.swing.UIManager;
    import javax.swing.tree.DefaultMutableTreeNode;
    import javax.swing.tree.DefaultTreeCellRenderer;
    import javax.swing.tree.DefaultTreeModel;
    import javax.swing.tree.TreePath;
    * Example to demonstate differences between Java 1.4 and Java 1.5/1.6
    * node rendering.
    * <p>
    * Under Java 1.4 nodes are always rendered correctly.
    * <p>
    * Under Java 1.5 and 1.6 If you click on a node before expanding it (which
    * results in the icon changing) then expand the node not all child nodes
    * will be fully rendered.
    public class TreeNodeRenderExample extends javax.swing.JFrame {
        private static final long serialVersionUID = 7963956320358601702L;
        private JTree tree1;
         * Entry point.
         * @param args Arguments are ignored.
        public static void main(String[] args) {
            TreeNodeRenderExample inst = new TreeNodeRenderExample();
            inst.setVisible(true);
         * Constructor.
         * <br>
         * Create a instance of TreeNodeRenderExample.
        public TreeNodeRenderExample() {
            super();
            initGUI();
            populateTree();
            postInitGUI();
         * Create the Frame and JTree.
        private void initGUI() {
            try {
                    this.setTitle("Checkbox node Render Example");
                    tree1 = new JTree();
                    getContentPane().add(tree1, BorderLayout.CENTER);
                setSize(400, 300);
            } catch (Exception e) {
                e.printStackTrace();
         * Add the custom cell renderer and a mouse listener.
        private void postInitGUI() {
            tree1.setCellRenderer(new NodeRenderer());
            tree1.addMouseListener(new TreeMouseClickSelectionListener(tree1));
         * Populate the tree.
        private void populateTree() {
            TreeNode root = new TreeNode("Render Example");
            TreeNode colourNode = new TreeNode("Colours");
            TreeNode modelNode = new TreeNode("Models");
            colourNode.add(new TreeNode("Black"));
            colourNode.add(new TreeNode("White"));
            colourNode.add(new TreeNode("Blue"));
            modelNode.add(new TreeNode("Ford"));
            modelNode.add(new TreeNode("Fiat"));
            modelNode.add(new TreeNode("Nissan"));
            root.add(modelNode);
            root.add(colourNode);
            tree1.setModel(new DefaultTreeModel(root));
         * Custom tree node to allow the icon to be changed when the node
         * is clicked.
         * <p>
         * This is a simple example, our custom nodes hold much more state
         * information and get node children on the fly.
        class TreeNode extends DefaultMutableTreeNode {
            private static final long serialVersionUID = 7527381850185157388L;
             * Constructor.
             * <br>
             * Create a instance of TreeNode.
             * @param name Tree node display name.
            public TreeNode(String name) {
                this.name = name;
                this.state = "u";
             * Just cycle through some states so that the icon can
             * can be changed depending on how may 'clicks' on the node.
            public void updateSelectionStatus() {
                if (state.equals("u")) {
                    state = "s";
                } else if (state.equals("s")) {
                    state = "d";
                } else if (state.equals("d")) {
                    state = "u";
             * Get the icon to be used for the check box, shows the current
             * state of a node to the user.
             * @return A icon.
            public Icon getIcon() {
                Icon icon = null;
                if (state.equals("u")) {
                    icon = UIManager.getIcon("FileView.directoryIcon");
                } else if (state.equals("s")) {
                    icon = UIManager.getIcon("FileView.fileIcon");
                } else if (state.equals("d")) {
                    icon = UIManager.getIcon("FileView.computerIcon");
                return icon;
             * String representation of a node.
             * @see javax.swing.tree.DefaultMutableTreeNode#toString()
            public String toString() {
                return name;
            private String name;
            private String state;
         * Custom node render, adds a checkbox in front of the node, could be
         * any object that we can change the icon for, this will show the
         * user the current state of the selected node.
        class NodeRenderer extends DefaultTreeCellRenderer {
            private static final long serialVersionUID = -7358496302112018405L;
            protected JCheckBox checkBox = new JCheckBox();
            //protected JButton checkBox = new JButton();
            private Component strut = Box.createHorizontalStrut(5);
            private JPanel panel = new JPanel(new FlowLayout(FlowLayout.CENTER,0,0));
             * Constructor.
            public NodeRenderer() {
                setOpaque(false);
                this.checkBox.setOpaque(false);
                this.panel.setBackground(UIManager.getColor("Tree.textBackground"));
                this.panel.setOpaque(false);
                this.panel.add(this.checkBox);
                this.panel.add(this.strut);
                this.panel.add(this);
             * Render the label, then change the icon if necessary.
             * @see javax.swing.tree.DefaultTreeCellRenderer#getTreeCellRendererComponent(javax.swing.JTree, java.lang.Object, boolean, boolean, boolean, int, boolean)
            public Component getTreeCellRendererComponent(JTree tree, Object value,
                boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus)
                super.getTreeCellRendererComponent(tree, value,
                    sel, expanded, leaf, row, hasFocus);
                updateDisplayedStatus((TreeNode)value);
                return this.panel;
             * Set the node's icon.
             * @param node Rendered node.
            private void updateDisplayedStatus(TreeNode node) {
                this.checkBox.setIcon(node.getIcon());
         * Listener to allow cycling of node states by clicking on the node.
        class TreeMouseClickSelectionListener extends MouseAdapter {
            private JTree tree;
            private int hotspot = new JCheckBox().getPreferredSize().width;
             * Constructor.
             * <br>
             * Create a instance of TreeMouseClickSelectionListener.
             * @param tree Tree listener is attached to.
            public TreeMouseClickSelectionListener(JTree tree) {
                this.tree = tree;
             * Cycle the state of a clicked node.
             * @see java.awt.event.MouseAdapter#mouseClicked(java.awt.event.MouseEvent)
            public void mouseClicked(MouseEvent me) {
                int x = me.getX();
                int y = me.getY();
                int row = tree.getRowForLocation(x, y);
                TreePath path = tree.getPathForRow(row);
                if (path != null)
                    if(x <= tree.getPathBounds(path).x + hotspot)
                        TreeNode node = (TreeNode) path
                            .getLastPathComponent();
                        if (node != null)
                            node.updateSelectionStatus();
                            tree.repaint();
    }

    I can't recreate your problem. I'm running 1.5.0_09. When I open the program and JUST expand the nodes I see all "file" icons and all the labels work correctly. If i Select a node before expanding it, I get the same result.
    What Am I supposed to witness happening?
    -Js

  • F2 key not working with custom JTable Column

    I have a custom JTable Column (which is a JPanel with a JTextfield and JButton). Everything works as expected, except when the user presses "F2" to start editing the custom column cell. When the user presses F2, the custom cell goes into editing mode, but I am unable to type anything in it.
    Below is the SSCCE.
    Steps to Reproduce problem:
    1) Run the Program
    2) Select any cell in first Column.
    3) Press "F2" and try to type into the cell. Can't type anything.
    package com.ns;
    import java.awt.BorderLayout;
    import java.awt.Component;
    import java.awt.Dimension;
    import java.awt.Point;
    import java.awt.Toolkit;
    import java.awt.event.ActionEvent;
    import java.awt.event.KeyEvent;
    import java.util.EventObject;
    import javax.swing.DefaultCellEditor;
    import javax.swing.JButton;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.JTextField;
    import javax.swing.SwingUtilities;
    import javax.swing.UIManager;
    import javax.swing.WindowConstants;
    import javax.swing.table.DefaultTableModel;
    import javax.swing.table.TableCellRenderer;
    public class TextButtonCellFrame extends javax.swing.JFrame {
        // Variables declaration - do not modify                    
        private JTextField inputText;
        private JScrollPane jScrollPane1;
        private JPanel testPanel;
        private JTable testTable;
        // End of variables declaration                  
        public TextButtonCellFrame() {
            initComponents();
        @SuppressWarnings("unchecked")
        // <editor-fold defaultstate="collapsed" desc="Generated Code">                         
        private void initComponents() {
            testPanel = new JPanel();
            jScrollPane1 = new JScrollPane();
            testTable = new JTable();
            inputText = new JTextField();
            setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            testTable.setModel(new DefaultTableModel(
                new Object [][] {
                    {null, null, null, null},
                    {null, null, null, null},
                    {null, null, null, null},
                    {null, null, null, null}
                new String [] {
                    "Title 1", "Title 2", "Title 3", "Title 4"
            testTable.setCellSelectionEnabled(true);
            testTable.setRowHeight(52);
            testTable.setSurrendersFocusOnKeystroke(true);
            testTable.getColumnModel().getColumn(0).setCellRenderer(new MyTableCellRenderer());
            testTable.getColumnModel().getColumn(0).setCellEditor(new MyTableCellEditor(new JTextField()));
            testTable.getColumnModel().getColumn(0).setPreferredWidth(200);
            jScrollPane1.setViewportView(testTable);
            testPanel.add(jScrollPane1);
            inputText.setPreferredSize(new Dimension(50, 20));
            testPanel.add(inputText);
            getContentPane().add(testPanel, BorderLayout.CENTER);
            Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
            setBounds((screenSize.width-576)/2, (screenSize.height-417)/2, 576, 417);
        }// </editor-fold>                       
        public static void main(String args[]) {
            java.awt.EventQueue.invokeLater(new Runnable() {
                public void run() {
                    new TextButtonCellFrame().setVisible(true);
        public class MyTableCellRenderer extends JPanel implements TableCellRenderer {
            Point point;
            JButton button1 = new JButton("Test 1");
            JTextField txtField = new JTextField();
            public MyTableCellRenderer() {
                setLayout(new BorderLayout());
                this.add(button1, BorderLayout.EAST);
                this.add(txtField,BorderLayout.CENTER);
            public Component getTableCellRendererComponent(JTable table, Object value,
                    boolean isSelected, boolean hasFocus, int rowIndex, int vColIndex) {
                if (isSelected) {
                    txtField.setBackground(testTable.getSelectionBackground());
                    txtField.setBorder(UIManager.getBorder("Table.focusCellHighlightBorder"));
                else {
                    txtField.setBackground(testTable.getBackground());
                    txtField.setBorder(null);
                return this;
        public class MyTableCellEditor extends DefaultCellEditor {
            JPanel panel = new JPanel();
            JButton button1 = new JButton ("Test 1");
            JTextField txtField;
            MyTableCellEditor(JTextField txtField) {
                super (txtField);
                this.txtField = txtField;
                panel.setLayout(new BorderLayout());
                panel.add(button1, BorderLayout.EAST);
                panel.add(txtField,BorderLayout.CENTER);
            public void actionPerformed(ActionEvent e) {
                if (e.getSource() == button1)
                    JOptionPane.showMessageDialog(null, "Action One Successful");
            public Component getTableCellEditorComponent(JTable table, Object value,
                                        boolean isSelected, int row, int column) {
                return panel;
           public boolean isCellEditable(final EventObject anEvent) {
              if (anEvent instanceof KeyEvent) {
                 final KeyEvent keyEvent = (KeyEvent) anEvent;
                 SwingUtilities.invokeLater(new Runnable() {
                    public void run() {
                       if (!Character.isIdentifierIgnorable(keyEvent.getKeyChar())) {
                          txtField.setText(txtField.getText() + keyEvent.getKeyChar());
                       txtField.setCaretPosition(txtField.getText().length());
                       txtField.requestFocusInWindow();
                return super.isCellEditable(anEvent);
    }The code for isCellEditable(final EventObject anEvent) which is needed to edit the cell using keyboard was provided by DarrylBurke here
    regards,
    nirvan.

    The F2 key when pressed generates an action event (either JTable generates it or some other component). I am not sure how to handle the action event in the isCellEditable() method. Also, F(X) range of keys other than F2 dump some junk character in the JTextfield when pressed. I am now stuck at this point and don't know how handle F(X) range of keys.
    regards,
    nirvan.

  • Plz help me out!! Custom components not showed in JTabbedPane....

    Hi!!
    I am extending a JPanel and adding some components to it and finally when I create an object and add it to the JTAbbedPane its not being shown....If i do it disrectly on JPanel instead of my class its is being shown.can anybody...please help me out and tell where the problem is ...My code is as follows....
    public class TabColorExample extends JPanel {
    public TabColorExample() {
    setLayout(new BorderLayout());
    UIManager.put("TabbedPane.selected", Color.green);
    JTabbedPane tabbedPane = new JTabbedPane();
    String tabs[] = {"One", "Two", "Three", "Four"};
    Color[] colors = {null, Color.red, null, null};
    for (int i=0;i<tabs.length;i++) {
    tabbedPane.addTab(tabs, createPane(tabs[i]));
    tabbedPane.setBackgroundAt(i, colors[i]);
    tabbedPane.setSelectedIndex(0);
    add(tabbedPane, BorderLayout.CENTER);
    JPanel createPane(String s) {
    return new panel(s);
    public static void main(String[] args) {
    JFrame frame = new JFrame("Tab color Example");
    frame.addWindowListener( new WindowAdapter() {
    public void windowClosing( WindowEvent e ) {
    System.exit(0);
    frame.getContentPane().add( new TabColorExample() );
    frame.setSize( 200, 100 );
    frame.setVisible(true);
    class panel extends javax.swing.JPanel
         panel(String s)
              super();
              JPanel p = new JPanel();
              p.add(new JLabel(s));
    Thanx in advance...
    Krtrao

    Hi there,
    Having that string in a mapping of DSO when DSO will process the SIDs it doesn't like that string and therefore throws an error.
    You could for example transform that field in for example start routine or customer exit R/3 side, like for example split string with commas, and concatenate everything like this: 01,02,03 should retrieve 010203.
    Other option is to first create master data texts datasource for that field PDP and for each key retrieves a string, like this for example:
    010203 - text 01,02,03, or text MDTDWD
    than when you fill the DSO with that field aready fixed in the form 010203, you can in the query represent it with text, it should represent in the form 01,02,03 or MDTDWD, see the picture?
    You can do this kind of fixing of the filed 01,02,03 or in the start routine, or the transfer structure.
    And to only get those records with the field being there, just write in the start routine something like:
    DELETE <SOURCE_PACKAGE> where your_field is initial.
    Hope this helps,
    Diogo.

  • Determing which component from a custom TreeCellRenderer was clicked on

    hi,
    i've been experimenting with finding which component has been clicked on in a JTree which has a custom tree cell renderer. I've got a piece of code that appears to work, but am unsure if this is the proper way to go about doing this, and whether it might fail under some circumstances.
    any help appreciated,
    asjf
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.tree.*;
    import javax.swing.event.*;
    public class JTreeTest1 {
       public static void main(String[] arg) throws Exception {
          final JTree tree = new JTree();
          final TreeCellRenderer renderer = new MyRenderer();
          tree.setCellRenderer(renderer);
          tree.addMouseListener(new MouseAdapter() {
             public void mouseClicked(MouseEvent e) {
                int x = e.getX(), y = e.getY();
                int row = tree.getRowForLocation(x,y);
                TreePath path = tree.getPathForLocation(x,y);
                if(path!=null) {
                   Object o = path.getLastPathComponent();
                   Rectangle r = tree.getPathBounds(path);
                   // how to detect what component has been clicked on?
                   // simplification: pretend all boolean state has no effect on renderer (which is true for the renderer below)
                   Component renderedComponent = renderer.getTreeCellRendererComponent(tree, o, false, false, false, row, false);
                   renderedComponent.setBounds(r);
                   int _x = (int) ((double)e.getX() - r.getX());
                   int _y = (int) ((double)e.getY() - r.getY());
                   Component clickedUpon = SwingUtilities.getDeepestComponentAt(renderedComponent, _x, _y);
                   if(clickedUpon instanceof JLabel) {
                      JLabel jl = (JLabel) clickedUpon;
                      System.out.println(jl.getText());
          JFrame frame = new JFrame("JTreeTest1");
          frame.getContentPane().add(tree);
          frame.pack();
          frame.setVisible(true);
    class MyRenderer extends JPanel implements TreeCellRenderer {
       JLabel custom;
       public MyRenderer() {
          super(); // flow layout
          add(new JLabel("Hello"));
          add(custom = new JLabel());
          custom.setOpaque(true);
          custom.setBackground(UIManager.getColor("Tree.background"));
          custom.setForeground(UIManager.getColor("Tree.foreground"));
          add(new JLabel("World"));
       public Component getTreeCellRendererComponent(JTree tree, Object value, boolean isSelected, boolean expanded,
                                                     boolean leaf, int row, boolean hasFocus)
          custom.setText("("+value.toString()+")");
          return this;
    }

    My only advice would be to remember that rendered components are not actually added to the tree, so they are not a child of the tree... they actually cannot be clicked on. The rendered components are quickly used just to paint and specific image and then discarded (which is why you don't typically want to create new ones each time). When you click on the tree, there is no "rendered component" there, just an image that was painted.
    Hope this helps
    Josh Castagno
    http://www.jdc-software.com

  • UIManager.getIcon("OptionPane.warningIcon") on Linux

    Hi,
    I'm using
    Icon icon = UIManager.getIcon("OptionPane.warningIcon");to retrieve default icons and use them in my custom dialogs.
    Everything is OK with JVMs since version 1.4.1 on every OSs (Windows 98, 2K and XP and Mac OS X 10.2 and later) except on Linux where icon is null!
    If I use
    JOptionPane.showMessageDialog(component, text, title, JOptionPane.WARNING_MESSAGE);the icon is displayed in the dialog even on Linux.
    The same behaviour is encountered for the 4 icons (warningIcon, errorIcon, informationIcon and questionIcon).
    How could I get the default icons on Linux?
    Thanks in advance for your help.
    Regards,
    Lara.

    henrique.abreu wrote:
    Legend_Keeper wrote:
    The above is probably the case, and whether it is or isn't the case, the String key you're using is probably not the right String key on the Linux platform you're using. I have no idea what the correct one is. Is there a way you can get the list of keys and print it out?Sure you can. The following code is not mine, I got it searching in this forum (a long time ago)
    import java.util.Enumeration;
    import javax.swing.UIDefaults;
    import javax.swing.UIManager;
    public class ListProperties {
    public static void main(String args[]) throws Exception {
    UIManager.LookAndFeelInfo looks[] = UIManager.getInstalledLookAndFeels();
    for (UIManager.LookAndFeelInfo info : looks) {
    UIManager.setLookAndFeel(info.getClassName());
    UIDefaults defaults = UIManager.getDefaults();
    Enumeration newKeys = defaults.keys();
    while (newKeys.hasMoreElements()) {
    Object obj = newKeys.nextElement();
    System.out.printf("%50s : %s\n", obj, UIManager.get(obj));
    Well, I used something similiar to list all strings and found out there are listed on Linux too but I don't understand your syntax in for (UIManager.LookAndFeelInfo info : looks) nor does my Javac :javac ListProperties.java
    ListProperties.java:10: ';' expected
        for (UIManager.LookAndFeelInfo info : looks) {
                                            ^
    ListProperties.java:21: illegal start of expression
      ^
    2 errorsThank you anyway for your answer...
    Regards,
    Lara.
    Edited by: JolieLara on Oct 9, 2008 1:49 AM

  • "ClassNotFoundException" loading custom LookAndFeel class

    Hi!
    I created a custom LaF for my application. It works fine after registering e.g. my new ButtonUI in the myLookAndFeel class:
    Object[] uiDefaults = {
    "ButtonUI", myPackageName + "myButtonUI",
    "CheckBoxUI", metalPackageName + "MetalCheckBoxUI",
    The main program looks something like:
    UIManager.setLookAndFeel(new GUI.mygui.plaf.myLookAndFeel());
    SwingUtilities.updateComponentTreeUI(frame);
    I can change the background-color in myTheme or directly myLookAndFeel (~line 384):
    "Button.background", new ColorUIResource(204, 204, 255),
    Works fine, but when changing the font to:
    "Button.font", new UIDefaults.ProxyLazyValue(          "GUI.mygui.plaf.myLookAndFeel",
         "getControlTextFont"),
    instead of
    "Button.font", new UIDefaults.ProxyLazyValue(          "javax.swing.plaf.metal.MetalLookAndFeel",
         "getControlTextFont"),
    (i.e. not using a standard plaf), i get an error at runtime (from UIDefaults):
    Problem creating GUI.mygui.plaf.myLookAndFeel with method getControlTextFont and args { : java.lang.ClassNotFoundException: GUI/mygui/plaf/myLookAndFeel
    It seems to be a problem with the class loader, but everyone said it isn't a problem any more since jdk1.2.2! I am using jdk1.3.1 on win. Any clue?
    Thanks a lot, Holger

    Even specifying the classpath explicitly with
    java -cp C:\java\ui\classes Main
    (or with ';.' ) doesn't solve it, where the LaF is in
    C:\java\ui\classes\GUI\mygui\plaf\myLookAndFeel.class
    At the point i'm registering the new LaF in the main program he doesn't show any exception. It's in the moment he has to show one of the modified buttons.
    As i explained before, the was a bug report on this topic, i found it again:
    Bug Id 4155617
    It certainly has to do with the class loader, but why do they say the bug is fixed (status: closed), when no one really knows how to make it right?
    The workarounds for the mentioned Bug Ids 4378245, 4120021 and 4138667 don't seem to work.

  • Customizing FLVPlayback version 2.5 in Flex

    I am using the new FLVPlayback version 2.5 in a Flex Builder 3 Actionscript project. The application streams flv and mpv from a cdn.
    The FLVPlayback version 2.5 ships with an all inclusive compiled swf skins but this is not usable for custom players.  The individual controls are the only viable path.  There is some issue with using the idividual seek and volume controls.  The handles never show up? In the debug handle_mc is null in UIManager setControl when using individual components but is working with the all inclusive controlls.  There must be something different in the fla file for the version 2.5.  I have tried individual seek bar and volume bar from both CS3 and CS4 without success.  All the button controls seem to be forward compatable though.  Could someone at Adobe please release the fla so we can create custom controls? or at least explain how to modify the current ones to work with FLVPlayback version 2.5. It must be out there somewhere because it was used to compile the working all inclusive skins.

    Discovered the issue.
    For mounted drives you need to use the nativePath property.
    For cross platform applications you can simply replace() the delimiter with the .separator property.
    Also for some reason the skin wouldn't load, despite the fact that I had chosen it in the component selector.
    I ended up setting the myFLVplayback.skin property just before I added the component to the stage.
    On  a related note, does anyone know if there's a difference between publishing an app with included folders, and simply publishing the app and adding the folders to the .app directory after the .app folder has been published?
    Dan

  • Cell with boolean value not rendering properly in Swing (custom renderer)

    Hello All,
    I have a problem rendenring boolean values when using a custom cell renderer inside a JTable; I managed to reproduce the issue with a dummy application. The application code follows:
    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.lang.reflect.InvocationTargetException;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    import java.util.logging.Logger;
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.SwingUtilities;
    * Simple GUI that uses custom cell rendering
    * @author josevnz
    public final class SimpleGui extends JFrame {
         private static final long serialVersionUID = 1L;
         private Logger log = Logger.getLogger(SimpleGui.class.getName());
         private JTable simpleTable;
         public SimpleGui() {
              super("Simple GUI");
              setPreferredSize(new Dimension(500, 500));
              setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              setLayout(new BorderLayout());
         public void constructGui() {
              simpleTable = new JTable(new SimpleTableModel());
              simpleTable.getColumnModel().getColumn(2).setCellRenderer(new HasItCellRenderer());
              SpecialCellRenderer specRen = new SpecialCellRenderer(log);
              simpleTable.setDefaultRenderer(Double.class, specRen);
              simpleTable.setDefaultRenderer(String.class, specRen);
              simpleTable.setDefaultRenderer(Date.class, specRen);
              //simpleTable.setDefaultRenderer(Boolean.class, specRen);
              add(new JScrollPane(simpleTable), BorderLayout.CENTER);          
              pack();
              setVisible(true);
         private void populate() {
              List <List<Object>>people = new ArrayList<List<Object>>();
              List <Object>people1 = new ArrayList<Object>();
              people1.add(0, "Jose");
              people1.add(1, 500.333333567);
              people1.add(2, Boolean.TRUE);
              people1.add(3, new Date());
              people.add(people1);
              List <Object>people2 = new ArrayList<Object>();
              people2.add(0, "Yes, you!");
              people2.add(1, 100.522222);
              people2.add(2, Boolean.FALSE);
              people2.add(3, new Date());
              people.add(people2);
              List <Object>people3 = new ArrayList<Object>();
              people3.add(0, "Who, me?");
              people3.add(1, 0.00001);
              people3.add(2, Boolean.TRUE);
              people3.add(3, new Date());
              people.add(people3);
              List <Object>people4 = new ArrayList<Object>();
              people4.add(0, "Peter Parker");
              people4.add(1, 11.567444444);
              people4.add(2, Boolean.FALSE);
              people4.add(3, new Date());
              people.add(people4);
              ((SimpleTableModel) simpleTable.getModel()).addAll(people);
          * @param args
          * @throws InvocationTargetException
          * @throws InterruptedException
         public static void main(String[] args) throws InterruptedException, InvocationTargetException {
              final SimpleGui instance = new SimpleGui();
              SwingUtilities.invokeAndWait(new Runnable() {
                   @Override
                   public void run() {
                        instance.constructGui();
              instance.populate();
    }I decided to write a more specific renderer just for that column:
    import java.awt.Color;
    import java.awt.Component;
    import javax.swing.JTable;
    import javax.swing.UIManager;
    import javax.swing.table.DefaultTableCellRenderer;
    * Cell renderer used only by the DividendElement table
    * @author josevnz
    final class HasItCellRenderer extends DefaultTableCellRenderer {
         protected static final long serialVersionUID = 2596173912618784286L;
         private Color hasIt = new Color(255, 225, 0);
         public HasItCellRenderer() {
              super();
              setOpaque(true);
         @Override
         public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
              Component comp = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
              int desCol = table.convertColumnIndexToView(1);
              if (! isSelected && value instanceof Boolean && column == desCol) {
                   if (((Boolean) value).booleanValue()) {
                        comp.setForeground(hasIt);     
                   } else {
                        comp.setForeground(UIManager.getColor("table.foreground"));
              return comp;
          * Override for performance reasons
         @Override
         public void firePropertyChange(String propertyName, boolean oldValue, boolean newValue) {
              // EMPTY
         @Override
         protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) {
              // EMPTY
         @Override
         public void revalidate() {
              // EMPTY
         @Override
         public void validate() {
              // EMPTY
    } // end classBut the rendering comes all wrong (a String saying true or false, not the expected checkbox from the default renderer) and also there is a weird flickring effect as this particular boolean column is editable (per table model, not show here)...
    I can post the table model and the other renderer if needed (didn't want to put too much code on the question, at least initiallty).
    Should I render a checkbox myself for this cell in the custom renderer? I'm puzzled as I expected the default renderer part of the code to do this for me instead.
    Thanks!
    Edited by: josevnz on Apr 14, 2009 12:35 PM
    Edited by: josevnz on Apr 14, 2009 12:37 PM

    camickr
    Thats because the default render is a JLabel and it just displays the text from the toString() method of the Object in the table model.What I meant to say is that I expected the JCheckbox not a String representation of the boolean value.
    Thats because a different renderer is used depending on the Class of data in the column. Look at the source code for the JTable class to see what the "default >renderer for the Boolean class" is. Then you can extend that or if its a private class then you will need to copy all the code and customize it.At the end I looked at the code and replicated the functionality I needed. I thought than maybe there was a way to avoid replicating the same logic all over again in order to implement this functionality. Good advice, though.
    see you learned nothing from your last posting. This is NOT a SSCCE. 90% of the code you posted is completely irrelevant for the described problem. There is abosutelly no need to post the custom TableModel, because there is no need to use a custom TableModel for this problem. The TableModel has nothing to do with how a column is rendererd.The custom table model returns the type of the column (giving a hint to the renderer on what to expect, right?) and for the one that had a problem it says than the class is Boolean. That's why I mentioned it:
    public Class getColumnClass(int columnIndex) {
        // Code omited....
    You also posted data for 4 columns worth of data. Again, irrelevant. Your question is about a single column containing Boolean data, so forget about the other columns.
    When creating a SSCCE you don't start with your existing code and "remove" code. You start with a brand new class and only add in what is important. That way hopefully if you made a mistake the first time you don't repeat it the second time.That's what I did, is not the real application. I copy & pasted code in a haste from this dummy program on this forum, not the best approach as it gave the wrong impression.
    Learn how to write a proper SSCCE if you want help in the future. Point taken, but there is NO need for you to be rude. Your help is appreciated.
    Regards,
    Jose.

  • Problem of custom table model

    Hi,
    i m leaning JTable recently, following is an experimental code which i wrote, it has a custom table model and custom tablecellrenderer, the custom tablecellrender determine the column of # of Years greater or equal than 5 should display color green, less than 5 should display color red, it works well, however, the custom table model should be smart enough to know that the # of Years column contains numbers (which should generally be right aligned and have a particular format), it also should know that the Vegetarian column contains boolean values, which can be represented by check boxes, but it didn't, i don't know why, i have implement a getColumnClass method,
    but it seems not work, have i make any mistakes? Any idea? Thanks
    import java.awt.BorderLayout;
    import java.awt.Container;
    import java.awt.Dimension;
    import javax.swing.JFrame;
    import javax.swing.JTable;
    import javax.swing.table.AbstractTableModel;
    import javax.swing.table.TableColumn;
    import javax.swing.table.DefaultTableCellRenderer;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.UIManager;
    import java.awt.Color;
    import java.util.Vector;
    public class CellRenderTestVector extends JFrame {
         protected JTable table;
         protected int width = 100;
         protected MyCustomTableModel model;
         public CellRenderTestVector() {
              JPanel pan0 = new JPanel(new BorderLayout());
              Container contentPane = getContentPane();
              pan0.setPreferredSize(new Dimension(500,200));
              model = new MyCustomTableModel();
              table = new JTable();
              table.setAutoCreateColumnsFromModel(false);
              table.setModel(model);
              table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                            TableColumn column = null;
              for (int i = 0; i < model.getColumnCount(); i++) {
                   DefaultTableCellRenderer renderer = new
                     ColoredTableCellRenderer();
                   column = new TableColumn(i,
                              width, renderer, null);
                              table.addColumn(column);
              TableColumn t_column = table.getColumnModel().getColumn(2);
              System.out.println(table.getColumnModel());
              JScrollPane scrollPane = new JScrollPane(table);
              pan0.add(scrollPane, BorderLayout.CENTER);
              contentPane.add(pan0);
                public class ColoredTableCellRenderer extends DefaultTableCellRenderer {
              public void setValue(Object value) {
                   Color  m_color;
                   Color GREEN = new Color(0, 128, 0);
                   Color RED = Color.red;
                   if (value instanceof Integer) {
                        Integer m_data = (Integer)value;
                        m_color = m_data.intValue() >= 5 ? GREEN : RED;
                                           setForeground(m_color);
                               setText(m_data.toString());
                   else {
                        super.setValue(value);
         public class Columndata {
              protected String m_title;
              public Columndata(String title) {
                   m_title = title;
         public class Rowdata {
              protected String fname;
              protected String lname;
              protected String sport_type;
              protected Integer no_year;
              protected Boolean vegetarian;
              public Rowdata(String fn, String ln,
                        String sp, int ny, boolean vg) {
                   fname = fn;
                   lname = ln;
                   sport_type = sp;
                   no_year = new Integer(ny);
                   vegetarian = new Boolean(vg);
         public class MyCustomTableModel extends AbstractTableModel {
              protected final Columndata m_column[] =
                        {new Columndata("First Name"),
                         new Columndata("Last Name"),
                         new Columndata("Sport"),
                         new Columndata("# of Years"),
                         new Columndata("Vegetarian")
              protected Vector m_vector;
              public MyCustomTableModel() {
                   m_vector = new Vector();
                   setDefaultData();
              public void setDefaultData() {
                   m_vector.removeAllElements();
                   m_vector.addElement(new Rowdata("Mary", "Campione",
                                                           "Snowboarding", 5, false));
                   m_vector.addElement(new Rowdata("Alison", "Huml",
                                                           "Rowing",3,true));
                   m_vector.addElement(new Rowdata("Kathy", "Walrath",
                                                           "Knitting",2, false));
                   m_vector.addElement(new Rowdata("Sharon", "Zakhour",
                                                           "Speed reading",20,true));
                   m_vector.addElement(new Rowdata("Philip", "Milne",
                                                           "Pool",10,false));
              public int getColumnCount() {
                   return m_column.length;
              public int getRowCount() {
                   return m_vector==null ? 0 : m_vector.size();
              public String getColumnName(int col) {
                   return m_column[col].m_title;
              public Object getValueAt(int nRow, int nCol) {
                   if (nRow < 0 || nRow>=getRowCount()) return "";
                   Rowdata row = (Rowdata)m_vector.elementAt(nRow);
                   switch (nCol) {
                   case 0: return row.fname;
                   case 1: return row.lname;
                   case 2: return row.sport_type;
                   case 3: return row.no_year;
                   case 4: return row.vegetarian;
                   return "";
              public Class getColumnClass(int c) {
                   return getValueAt(0, c).getClass();
         public static void createAndShowGUI() {
              try {
                UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
              } catch (Exception evt) {}
                   JFrame f = new CellRenderTestVector();
                   f.setTitle("TableTest");
                   f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                   f.pack();
                 f.setVisible(true);
         public static void main(String[] args) {
              javax.swing.SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    createAndShowGUI();
    }

    You need to write your custom TableCellRenderes/Editors for each type. And don't forget to register your custom renderes via myTable.setDefaultRendere().

Maybe you are looking for

  • How do I install Boot Camp drivers without the Mac OS disc?

    When I installed OS X Lion for my Macbook Pro, I purchased it off the Apple Store (so I don't have the disc.) Is there any way possible to download the drivers I need without the disc?

  • Flash Player not working on some pages

    Using  Windows 7 Home Premium 64 bit,           Google Chrome 10.0.648.127 (not sure if it's 32 or 64, was told to assume 32)           Flash Player WIN 10,2,154,18 Works fine for most pages but when I try to see a friends' app on Facebook I get a me

  • Character output problems.

    I'm currently writing a java console program that deals with european currency. The problem comes when I try something along the lines of the following (the printing of the currency symbol being the important part): import java.text.DecimalFormat; im

  • PDF and Javascript

    I am using Adobe Acrobat 5.0. I am having two issues. Issue 1: A javascript code is written such that when a hyper link is clicked the code will make a specific bookmark to automatically expand or collapse. Each time the link is clicked the book mark

  • How to render a html content in a text field?

    Hi! Is it possible to render a html content(like <strong>< b >This text is bold  </strong></b>) in a Text field with Crystal Report for Eclipse Basic . In .Net there were a field called  Text Interpretation where you could choose HTML. But in Eclipse