Using a JList with a cell renderer within an applet/cell renderer not working

From: Stuart Leonard (suncds_at_earthlink.net)
Date: 05/30/04


Date: Sat, 29 May 2004 23:44:08 GMT

I have a cell renderer for a JList that is supposed to render the foreground
color in blue, and also insert tabs into the lines. When this code is
changed to run as an application, the cell renderer performs as expected.
When the code is run as an applet, the cell renderer has no impact at all.

Any help would be appreciated.

I am using SDK 1.4.0, Windows XP Professional.

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.text.DecimalFormat;
import javax.swing.text.MaskFormatter;
import java.text.ParseException;
import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;
import java.util.StringTokenizer;
public class TempConvert extends JApplet {

 public JFormattedTextField low;
 public JFormattedTextField high;
 public JFormattedTextField incr;

 public TempConvert() {
  getContentPane().setLayout(new BorderLayout());
  createGrid();
  setSize(270,400);

 }
 private void createGrid() {

  JPanel panel = new JPanel(new BorderLayout());

  // add selection panel
  MaskFormatter mf1 = null;
  MaskFormatter mf2 = null;
  try
  {
   mf1 = new MaskFormatter("####");
      mf1.setPlaceholderCharacter('_');
      //mf1.setCommitsOnValidEdit(true);
   mf2 = new MaskFormatter("###");
      mf2.setPlaceholderCharacter('_');
         //mf2.setCommitsOnValidEdit(true);
     }
     catch (ParseException e){
     }

  low = new JFormattedTextField(mf1);
  low.setFocusLostBehavior(JFormattedTextField.COMMIT);
  high = new JFormattedTextField(mf1);
  high.setFocusLostBehavior(JFormattedTextField.COMMIT);
  incr = new JFormattedTextField(mf2);
  incr.setFocusLostBehavior(JFormattedTextField.COMMIT);
  JPanel select = new JPanel(new GridBagLayout());
  GridBagConstraints gbc = new GridBagConstraints();
  gbc.fill = GridBagConstraints.NONE;
  addgbc(select, new JLabel("Low Temperature Range . . ."),gbc,0,0);
  addgbc(select, low,gbc,1,0);
  addgbc(select, new JLabel("High Temperature Range . ."),gbc,0,1);
  addgbc(select, high,gbc,1,1);
  addgbc(select, new JLabel("Increment Degrees . . . . ."),gbc,0,2);
  addgbc(select, incr,gbc,1,2);
  panel.add(select, BorderLayout.NORTH);

  // add temperature list
  final JList list = new JList();
  TabListCellRenderer renderer = new TabListCellRenderer();
  //renderer.setTabs(new int[] {50,200,300,});
  list.setCellRenderer(renderer);
  JScrollPane scroller = new JScrollPane();
  scroller.getViewport().add(list);
  panel.add(scroller, BorderLayout.CENTER);

  // add buttons
  JPanel buttons = new JPanel(new FlowLayout(FlowLayout.CENTER,5,5));
  JButton ok = new JButton("OK");
  JButton cancel = new JButton("Cancel");
  buttons.add(ok);
  buttons.add(cancel);
  panel.add(buttons, BorderLayout.SOUTH);
  getContentPane().add(panel);
  //pack();
  setVisible(true);

  // register action listeners for the buttons
  ok.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent e) {
    if (verifyData())
    {
       list.setListData(calculateTemps());
       list.revalidate();
       list.repaint();
    }
   }

  });
  cancel.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent e) {
   // stop();
   // destroy();
   }

  });

 }

 private int getIntValue(JFormattedTextField field)
 {
  try
  {
   return Integer.parseInt(field.getText().toString().replace('_','
').trim());
  }
  catch (NumberFormatException e){}

  return 0;
 }

 private boolean verifyData()
 {
  int lowTemp = getIntValue(low);
  int highTemp = getIntValue(high);
  int incrTemp = getIntValue(incr);

  if (lowTemp < 0)
  {
   JOptionPane.showMessageDialog(this, "If low temperature is entered, must
be greater than zero");
   return false;
  }

  if (highTemp == 0)
  {
   JOptionPane.showMessageDialog(this, "High temperature must be entered");
   return false;
  }

  if (highTemp <= lowTemp)
  {
   JOptionPane.showMessageDialog(this, "High temperature must be greater
than low temperature");
   return false;
  }

  if (incrTemp == 0)
  {
   JOptionPane.showMessageDialog(this, "Increment degrees must be
entered.");
   return false;
  }

  return true;

 }

 private void addgbc(Container cont, JComponent comp, GridBagConstraints
gbc, int x, int y) {
  gbc.gridx=x; gbc.gridy=y;
  cont.add(comp,gbc);
 }

 private TempData[] calculateTemps() {

  int lowTemp = getIntValue(low);
  int highTemp = getIntValue(high);
  int incrTemp = getIntValue(incr);

  int range = highTemp-lowTemp;
  TempData[] tempdata = new TempData[range/incrTemp +1];

  int j=0;
  for (int i=lowTemp; i<=highTemp; i+=incrTemp) {
    tempdata[j] = new TempData(i);
    j++;
  }
  return tempdata;

 }
 public static void main (String[] args) {
  new TempConvert();
 }
 public class TempData {
  int fahrenheit;
  int celsius;

  public TempData(int fahrenheit) {
   this.fahrenheit = fahrenheit;
   calculateTemp();
  }

  private void calculateTemp() {

   double temp = 5/9 * (fahrenheit-32);
   celsius = (int)temp;

  }

  public String toString() {

   return fahrenheit + "\t" + celsius;
  }
 }

}
 class TabListCellRenderer
  extends JLabel
  implements ListCellRenderer {

     protected static Border m_noFocusBorder;
  protected FontMetrics m_fm = null;
     protected Insets m_insets = new Insets(0, 0, 0, 0);

  protected int m_defaultTab = 50;
  protected int[] m_tabs = null;

  public TabListCellRenderer() {
   m_noFocusBorder = new EmptyBorder(1, 1, 1, 1);
   setOpaque(true);
   setBorder(m_noFocusBorder);
  }

  public Component getListCellRendererComponent(JList list,
   Object value, int index, boolean isSelected, boolean cellHasFocus) {
   setText(value.toString());
   System.out.println("getText = " + getText());
   setBackground(isSelected ? list.getSelectionBackground() :
list.getBackground());
   //setForeground(isSelected ? list.getSelectionForeground() :
list.getForeground());
   setForeground(Color.blue);
   //setBackground(Color.blue);
   setFont(list.getFont());
   setBorder((cellHasFocus) ?
UIManager.getBorder("List.focusCellHighlightBorder") : m_noFocusBorder);

   return this;
  }

  public void setDefaultTab(int defaultTab) {
   m_defaultTab = defaultTab;
  }

  public int getDefaultTab() {
   return m_defaultTab;
  }

  public void setTabs(int[] tabs) {
   m_tabs = tabs;
  }

  public int[] getTabs() {
   return m_tabs;
  }

  public int getTab(int index) {
   if (m_tabs == null)
    return m_defaultTab*index;

   int len = m_tabs.length;
   if (index>=0 && index<len)
    return m_tabs[index];

   return m_tabs[len-1] + m_defaultTab*(index-len+1);
  }

  public void paintComponent(Graphics g) {
   super.paintComponent(g);
   Color colorRetainer = g.getColor();
   m_fm = g.getFontMetrics();

   g.setColor(getBackground());
   g.fillRect(0, 0, getWidth(), getHeight());
   getBorder().paintBorder(this, g, 0, 0, getWidth(), getHeight());

   g.setColor(getForeground());
   g.setFont(getFont());
   m_insets = getInsets();
   int x = m_insets.left;
   int y = m_insets.top + m_fm.getAscent();

   StringTokenizer st = new StringTokenizer(getText(), "\t");
   while (st.hasMoreTokens()) {
    String sNext = st.nextToken();
    System.out.println("next token = " + sNext);
    g.drawString(sNext, x, y);
    x += m_fm.stringWidth(sNext);

    if (!st.hasMoreTokens())
     break;
    int index = 0;
    while (x >= getTab(index))
    index++;
    x = getTab(index);
    }

   g.setColor(colorRetainer);
  }

 }


Quantcast