import java.awt.*; import java.awt.event.*; //import java.util.*; //public class myListBox extends Canvas implements MouseListener, KeyListener, ActionListener{ public class myListBox extends Panel implements MouseListener, KeyListener,AdjustmentListener{ int X; int Y; int Width; int Height; int lines; // number of visible lines int start; // first item in display int size; // Height of character boolean noselection; boolean changed=false; int selected=0; int viewnr=0; // Height slider int viewlength=0; // Width slider Scrollbar ScrollVert; boolean vertstate=true; // on or off? Scrollbar ScrollHorz; boolean horzstate=true; // on or off? List hiddenList; Image Box; Graphics graphicsBox; Image Box2nd; Graphics graphicsBox2nd; boolean visible=false; Color backgroundcolor; Image offscreen; Graphics graphics; // Drawable canvas myFont font; Component comp; // Drawing component int SIZE=0; // SIZE of Image int CHARACTERS=16; // 16 characters on one line // Your own actionListener private transient ActionListener actionListener; private TextField hidden; public myListBox(myFont fnt, Image offscr, Component c, boolean selection, int sz){ font=fnt; comp=c; offscreen=offscr; noselection=selection; // If there is a selectorbar graphics=offscreen.getGraphics(); setLayout(null); SIZE=sz; // make this configurable backgroundcolor=new Color(0,160,0); comp.addMouseListener(this); comp.addKeyListener(this); // emulate visibility visible=true; // size=8; // font size size=sz; start=1; // first line selected=-1; viewnr=0; // What is the display row? viewlength=0; // make use of the awt list hiddenList=new List(); // Listener adding addMouseListener(this); addKeyListener(this); // listeners ain't working .. what do i need to do? validate(); } public void setBackground(Color b){ backgroundcolor=b; changed=true; //System.out.println("setBackground-draw"); draw(); } // // Make empty public void clear(){ hiddenList.clear(); selected=-1; } public void select(int sele){ if(sele != selected){ try{ hiddenList.select(sele); selected=sele; }catch(Exception exc1){ selected=-1; } ScrollVert.setValue(selected); changed=true; draw(); } } // // Add an item public void add(String text){ hiddenList.add(text); if(selected == -1){ selected=hiddenList.getItemCount(); hiddenList.select(selected+1); changed=true; } ScrollVert.setMaximum(hiddenList.getItemCount()); ScrollHorz.setMaximum(30); } public void add(String text, int Pos){ hiddenList.add(text,Pos); if(selected == -1){ selected=hiddenList.getItemCount(); hiddenList.select(selected+1); changed=true; } ScrollVert.setMaximum(hiddenList.getItemCount()); ScrollHorz.setMaximum(30); } public void setVisible(boolean state){ visible=state; //System.out.println("setVisible-draw"); if(state)draw(); super.setVisible(state); changed=true; //setVisible(false); } public void setBounds(int x, int y, int width, int height){ Box=null; super.setBounds(x,y,width,height); X=x;Y=y;Width=width;Height=height; lines=Height==0?0:Height/size; if(Width > 0 && Height > 0){ } ScrollVert=new Scrollbar(Scrollbar.VERTICAL); ScrollHorz=new Scrollbar(Scrollbar.HORIZONTAL); this.add(ScrollVert); this.add(ScrollHorz); ScrollVert.addAdjustmentListener(this); ScrollHorz.addAdjustmentListener(this); ScrollVert.setBounds(Width-12, 0, 12, Height-12); ScrollHorz.setBounds(0,Height-12, Width-12,12); ScrollVert.setVisible(true); ScrollHorz.setVisible(false); } public void setSelection(int row){ try{ hiddenList.select(row); selected=row; }catch(Exception exc1){ selected=-1; } //System.out.println("setSelection-draw"); draw(); } // // Show the listbox // public void draw(){ if(visible && changed){ if(Box == null){ Box=comp.createImage(Width, Height); Box2nd=comp.createImage(800, Height); graphicsBox=Box.getGraphics(); graphicsBox2nd=Box2nd.getGraphics(); } // graphics.setColor(Color.white); // graphics.drawRect(X,Y,Width,Height); graphicsBox2nd.setColor(backgroundcolor); // graphicsBox2nd.setColor(Color.black); graphicsBox2nd.fillRect(0,0,800,600); int max=hiddenList.getItemCount(); // Adjust when selection is outside of viewport if(selected > viewnr+(lines-2) ){ viewnr = selected-2; } if( selected < viewnr){ // viewnr=selected-2; viewnr=selected-1; } if(viewnr > 1)ScrollVert.setVisible(true); //System.out.println("Draw the text!"); // Draw on the canvas //System.out.println("lines: "+lines); for(int i=0; i < lines-1 && i < max+2; i++){ // i+start is the line-item to be displayed try{ String text=hiddenList.getItem(viewnr+i); //System.out.println("Draw text: "+text); font.drawString(Box2nd, text, 0, i*size,null); if(noselection){ if(viewnr+i == hiddenList.getSelectedIndex()){ // graphicsBox2nd.setColor(Color.white); // graphicsBox2nd.drawRect(0,(i)*size, Width-20,size-1); font.drawString(Box2nd, text, 0, i*size,new Color(0,150,0)); } } }catch(Exception exc1){ // when error do not display } } // Draw the visible area (the scrolled version) graphicsBox.drawImage(Box2nd, -viewlength*(Width/3),0, comp); graphics.drawImage(Box, X, Y, comp); /* if(hiddenList.getItemCount() > lines-1){ if(vertstate) ScrollVert.setVisible(true); }else ScrollVert.setVisible(false); */ if(hiddenList.getItemCount() > 0){ if(horzstate) ScrollHorz.setVisible(true); }else ScrollHorz.setVisible(false); repaint(); } changed=false; } // // Send messag eto event queue // public void sndCommand(){ // ProcessEvent selected ActionEvent ae=new ActionEvent(this, ActionEvent.ACTION_PERFORMED, new String(hiddenList.getItem(hiddenList.getSelectedIndex()))); if(actionListener != null){ actionListener.actionPerformed(ae); processEvent(ae); } } // // When once clicked make the selection or the slider-action // // x= MouseEvent.getX() // y= MouseEvent.getY(); // count = MouseEvent.getClickCount() // for double clicking // public void Click(int x, int y, int count){ if(x > X-1 && y > Y-1 && x < X+Width && y < Y+Height){ int insideX=x-X; int insideY=y-Y; // is X > slide || Y > slide if(insideX > Width-20 || insideY > Height-size){ // do slide-action -> viewnr +/- and/or viewlength +/- if(insideX > Width-20){ ScrollVert.requestFocus(); }else{ // Length slider if(insideY > Height-size){ ScrollHorz.requestFocus(); } } }else{ int viewselected=(insideY>0?insideY/size:0); selected=viewnr+viewselected; //System.out.println("Select: "+selected); hiddenList.select(selected); if(count > 1){ //System.out.println("Act on Double Clicked mouse"); sndCommand(); } //System.out.println("INSIDE LISTBOX - viewselected:"+viewselected+" ("+insideX+", "+insideY+") selected: "+selected); } } changed=true; //System.out.println("Click-draw"); draw(); } // Is the vertical bar on or off? public void setVertical(boolean state){ vertstate=state; } // Is the horizontal bar on or off? public void setHorizontal(boolean state){ horzstate=state; } // Your own Listener public synchronized void addActionListener(ActionListener l) { actionListener = AWTEventMulticaster.add(actionListener, l); } protected void processActionEvent(ActionEvent e) { if (actionListener != null) { actionListener.actionPerformed(e); } } public int getItemCount(){ return hiddenList.getItemCount(); } // Listeners public void keyTyped(KeyEvent ke){ } public void keyReleased(KeyEvent ke){ } public void keyPressed(KeyEvent ke){ //System.out.println("Ke : "+ke.toString()); if(ke.getKeyCode() == ke.VK_UP) if(selected > -1) hiddenList.select(--selected); if(ke.getKeyCode() == ke.VK_DOWN) if(selected < hiddenList.getItemCount()) hiddenList.select(++selected); if(ke.getKeyCode() == ke.VK_RIGHT) viewlength++; if(ke.getKeyCode() == ke.VK_LEFT) if(viewlength > 0) viewlength--; if(ke.getKeyCode() == ke.VK_ENTER) if(selected != -1) sndCommand(); changed=true; //System.out.println("keypressed - draw"); draw(); } public void mouseClicked(MouseEvent me){ // Discover if we are in our box int x=me.getX(); int y=me.getY(); // Add the current compnent dimensions to the mouse coordinates. x+=X; y+=Y; int count=me.getClickCount(); Click(x,y,count); } public void mousePressed(MouseEvent me){ } public void mouseReleased(MouseEvent me){ } public void mouseEntered(MouseEvent me){ } public void mouseExited(MouseEvent me){ } // Do we need this when we send a message to the listener queues public void actionPerformed(ActionEvent ae){ // System.out.println("Action(myListbox): "+ae.toString()); } // Paint over the component public void paint(Graphics g){ update(g); } public void update(Graphics g){ // if(visible && changed) g.drawImage(Box, 0,0,this); } public void adjustmentValueChanged(AdjustmentEvent e){ viewlength=ScrollHorz.getValue(); viewnr=ScrollVert.getValue()-1; hiddenList.select(viewnr-1); selected=viewnr; changed=true; //System.out.println("adjustmentValue - draw"); draw(); repaint(); } }