jnlist.java
来自「纯java操作系统jnode,安装简单和操作简单的个人使用的Java操作系统」· Java 代码 · 共 454 行
JAVA
454 行
package org.jnode.wt.components;
import org.jnode.wt.events.JNAdjustmentEvent;
import org.jnode.wt.events.JNItemEvent;
import org.jnode.wt.events.JNodeMouseEvent;
import org.jnode.wt.image.JNBufferedImage;
import org.jnode.wt.events.JNAdjustmentListener;
import org.jnode.wt.events.JNItemListener;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.peer.ListPeer;
import java.util.ArrayList;
/**
* @author Kishore
*/
public class JNList extends JNPanel implements ListPeer, JNAdjustmentListener, ItemSelectable, JNItemListener {
private JNScrollBar listScroller = null;
private JNMenu listItemsPanel = null;
private int eachListItemHeight = 28;
// This variable is modified by scrollbar.
//private int visibleStartItem = 0;
// This variable is calculated in setSize() method.
private int num_viewable_items_in_List = 1;
//private int currentScrollValue = 0;
private JNBufferedImage listItemsBImage = null;
static final int SCROLLBAR_WIDTH = 20;
private int indexofFirstVisibleLabel = 0;
private int endLabIndex = 1;
private int numof_firstLabelPixels_visible = 0;
private ButtonGroup aButtonGroup = null;
protected ArrayList itemListeners = new ArrayList();
private boolean isBufferedImageReady = false;
/**
* JNList constructor comment.
*/
public JNList() {
super();
init();
}
/*
* Kishore.
*/
private void _menu_processMouseEvent(JNodeMouseEvent event) {
int refLabeIndex = ((numof_firstLabelPixels_visible * -1) + event.getY()) / eachListItemHeight;
int resultLabel = indexofFirstVisibleLabel + refLabeIndex;
// System.out.println(resultLabel+" ============================");
JNLabel comp = null;
if (resultLabel >= 0) {
comp = (JNLabel) listItemsPanel.getComponent(resultLabel);
}
/* System.out.println("numoffirstLabelPixels= " +numof_firstLabelPixels_invisible);
System.out.println("y value= " +event.getY());
System.out.println("resultLabel= "+resultLabel);
System.out.println("-----------------------");*/
if (comp != null) {
boolean b = comp.isSelected();
if (b == true) {
// System.out.println("\nList hell sending^^^ "+ false);
comp.setSelected(false);
} else {
// System.out.println("\nList hell sending^^^ "+ true);
comp.setSelected(true);
}
comp.processMouseEvent(event);
}
}
private void _recalcBufferedImage() {
if (indexofFirstVisibleLabel < 0 || endLabIndex < 0) {
return;
}
// ---
Graphics biG = listItemsBImage.getGraphics();
/* Clear BUffereImage. */
biG.setColor(Color.white);
biG.fillRect(0, 0, listItemsBImage.getWidth(), listItemsBImage.getHeight());
// ----
org.jnode.wt.components.JNComponent[] comps = listItemsPanel.getComponents();
int ty = numof_firstLabelPixels_visible;
JNLabel lab = null;
for (int i = indexofFirstVisibleLabel; i <= endLabIndex; i++) {
lab = (JNLabel) comps[i];
int transY = ty;
biG.translate(0, transY);
lab.internallyPaint(biG);
biG.translate(0, -transY);
// System.out.println(tempy+" ---- "+lab.getText()+" t=>"+ (tempy+28));
ty = ty + eachListItemHeight;
}
//System.out.println("---------------------- MENU.Height"+listItemsPanel.getHeight());
/* paint the ItemsLabelPanel into BufferedImage.
and this BufferedImage will be drawn to screen in internallyPaint */
// listItemsPanel.update( biG );
}
public void add(String s) {
//listItemsPanel.add( new JNLabel(s) );
JNLabel lab = new JNLabel(s);
// lab.setSize(lab.getPreferredSize());
lab.setSize((int) listItemsPanel.getSize().getWidth(), eachListItemHeight);
lab.addItemListener(this);
listItemsPanel.add(lab);
if (null == aButtonGroup)
aButtonGroup = new ButtonGroup();
aButtonGroup.add(lab);
recalcScrollMinMax();
//int i = 0;
}
public void addItemListener(JNItemListener lis) {
itemListeners.add(lis);
}
public void adjustmentValueChanged(JNAdjustmentEvent e) {
double y = e.getValue(); // IF y is [323]
double ELIH_D = eachListItemHeight; // [50.0]
double a = y / eachListItemHeight; // [6.46]
int a_int = (int) a; // [6]
double b_fraction = a - a_int; // [0.46]
int b_fraction_100 = (int) (b_fraction * 100); // [46 = 0.46 * 100]
int firstLabIndex = (int) a; // [6]
if (b_fraction_100 > 0) // [46 > 0]
{
firstLabIndex = firstLabIndex - 1; // [5 = 6-1]
}
// y value of first LAbel.
int firstLabIndex_Y = (int) (ELIH_D * b_fraction) * -1; // [ -46 = (50.0 * 0.46) * -1]
if (firstLabIndex < 0) {
firstLabIndex = 0;
firstLabIndex_Y = 0;
}
int lastLabIndex = firstLabIndex + num_viewable_items_in_List + 2;
/* Q) why 2 ?
A) one extra label at the top, one extra one at the bottom
*/
if (lastLabIndex > listItemsPanel.getComponentCount() - 1) {
lastLabIndex = listItemsPanel.getComponentCount() - 1;
}
this.endLabIndex = lastLabIndex;
/* +++++++++++ */
indexofFirstVisibleLabel = firstLabIndex;
numof_firstLabelPixels_visible = firstLabIndex_Y;
/* +++++++++++ */
_recalcBufferedImage();
//System.out.println("---------------------- MENU.Height"+listItemsPanel.getHeight());
repaint();
/* paint the ItemsLabelPanel into BufferedImage.
and this BufferedImage will be drawn to screen in internallyPaint */
// listItemsPanel.update( biG );
}
private void calculate_NumVisibleItems() {
// calclate num_visible_items.
num_viewable_items_in_List = this.getHeight() / eachListItemHeight;
if (endLabIndex < 0) ;
endLabIndex = indexofFirstVisibleLabel + num_viewable_items_in_List + 2;
}
public Object[] getSelectedObjects() {
return itemListeners.toArray();
}
private void init() {
//Dimension d = new Dimension(150, 6 * eachListItemHeight);
// setSize(d);
// setPreferredSize(d);
//Scrollbar
listScroller = new JNScrollBar(JNScrollBar.VERTICAL);
// ItemsPanel [MENU]
listItemsPanel = new JNMenu(JNMenu.MENU_USED_IN_LIST);
listItemsPanel.setLocation(0, 0);
listScroller.addAdjustmentListener(this);
// this.setLayout(null);
this.add(listScroller);
/* ListItempanel is created but not directly added to JNList,
instead a BufferedImage of that size is created, and all drawing done
to this BuffuredImage, and from the internallyPaint of this[JNList],
the BufferedImage drawn to JNList SCreen.
// this.add( listItemsPanel ); */
listScroller.setUnitIncrement(50);
}
protected void internallyPaint(Graphics g) {
// super.internallyPaint(g);
// System.out.println(" remove recalcbuffere from jnlist internapaint");
if (isBufferedImageReady == false) {
_recalcBufferedImage();
isBufferedImageReady = true;
}
g.drawImage(listItemsBImage, 0, 0, listItemsPanel.getWidth(), this.getHeight(), null);
g.setColor(Color.black);
g.drawRect(0, 0, listItemsPanel.getWidth(), this.getHeight());
}
public void itemStateChanged(JNItemEvent e) {
JNAbstractButton item = (JNAbstractButton) e.getItem();
int id = JNItemEvent.ITEM_STATE_CHANGED;
int state = -1;
if (item.isSelected()) {
state = JNItemEvent.SELECTED;
} else {
state = JNItemEvent.DESELECTED;
}
JNItemEvent ce = new JNItemEvent(this, id, item, state);
for (int i = 0; i < itemListeners.size(); i++) {
((JNItemListener) itemListeners.get(i)).itemStateChanged(ce);
}
}
/*
* Kishore.
*/
public void processMouseEvent(JNodeMouseEvent event) {
/*There are only two components, ScrollBAr and MEnu.*/
/*IF scrollbar*/
if (listScroller.getBounds().contains(event.getX(), event.getY())) {
/* Translate Event X,Y before calling */
event.translatePoint(listScroller.getX(), listScroller.getY());
listScroller.processMouseEvent(event);
return;
} else /*it must be inside the MEnu area Area.*/ if (listItemsPanel.getBounds().contains(event.getX(), event.getY())) {
/* Translate Event X,Y before calling */
event.translatePoint(listItemsPanel.getX(), listItemsPanel.getY());
_menu_processMouseEvent(event);
_recalcBufferedImage();
repaint();
return;
}
// call super, to call the mouseMotionListeners.
/* Call to super is not needed as everything is handeled here */
// super.processMouseEvent(event);
}
private void recalcScrollMinMax() {
int z = 0;
int totalcomps = listItemsPanel.getComponentCount();
/* In case when "total numof viewable components" are lessthan visible */
if (totalcomps < num_viewable_items_in_List) {
z = totalcomps;
} else {
z = totalcomps - num_viewable_items_in_List;
}
/* maximum for SCroller is the height of all list items. */
z = z * eachListItemHeight;
listScroller.setMinMax(0, z);
}
public void recalculate() {
super.recalculate();
_recalcBufferedImage();
}
public void removeItemListener(JNItemListener lis) {
itemListeners.remove(lis);
}
/*TODO:: this is not needed once GridLayout is done,
GridLayout will be used for listItemsPanel,
and a simple listItemsPanel.resize() will do the job.*/
public void resizeListItemsComponents(int w, int h) {
org.jnode.wt.components.JNComponent[] comps = listItemsPanel.getComponents();
for (int i = 0; i < comps.length; i++) {
comps[i].setSize(w, h);
}
}
public void setSize(int w, int h) {
super.setSize(w, h);
// ScrollBar
int sbrwidth = SCROLLBAR_WIDTH;
int itemspanelwidth = w - sbrwidth;
listScroller.setSize(sbrwidth, h);
listScroller.setLocation(itemspanelwidth, 0);
// ItemsPanel
listItemsPanel.setSize(itemspanelwidth, h);
// BufferedImage for ItemsPanel.
if ((itemspanelwidth > 0) && (h > 0)) {
listItemsBImage = new JNBufferedImage(itemspanelwidth, h, JNBufferedImage.TYPE_INT_RGB);
}
/*TODO:: this is not needed once GridLayout is done,
GridLayout will be used for listItemsPanel,
and a simple listItemsPanel.resize() will do the job.*/
resizeListItemsComponents(itemspanelwidth, h);
calculate_NumVisibleItems();
recalcScrollMinMax();
}
public void setVisible(boolean b) {
super.setVisible(b);
listScroller.setVisible(b);
_recalcBufferedImage();
repaint();
}
public void add(String item, int index) {
//TODO: implement it
}
public void addItem(String item, int index) {
//TODO: implement it
}
public void clear() {
//TODO: implement it
}
public void delItems(int start_index, int end_index) {
//TODO: implement it
}
public void deselect(int index) {
//TODO: implement it
}
public int[] getSelectedIndexes() {
//TODO: implement it
return new int[0];
}
public void makeVisible(int index) {
//TODO: implement it
}
public Dimension minimumSize(int s) {
//TODO: implement it
return null;
}
public Dimension preferredSize(int s) {
//TODO: implement it
return null;
}
public void removeAll() {
//TODO: implement it
}
public void select(int index) {
//TODO: implement it
}
public void setMultipleMode(boolean multi) {
//TODO: implement it
}
public void setMultipleSelections(boolean multi) {
//TODO: implement it
}
public Dimension getPreferredSize(int i){
//TODO: implement it
return null;
}
public Dimension getMinimumSize(int i){
//TODO: implement it
return null;
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?