/*
author: yinzhiguo
mail: yin_zhiguo at hotmail.com
env: ubuntu 8.04 jdk1.6.0
this is a checkbox list ctrl for developer java swing application.
it is very simple. you only require implements a method!
require apache commons-lang.jar
For example:
langList = new CheckboxList(ts){
@Override
public Object getDataLabel(Object data){
Book a = (Book)data;
return a.getTitle();
}
};
centerPane.add(langList, BorderLayout.CENTER);
ArrayList as = langList.getSelectedData();
the ts is a Object array that your checkboxlist model.
you will implements the getDataLabel method.
get user's chooser is simple, only invoke langList.getSelectedData()
*/
package com.rntsoft.java.swing.common.pane;
import java.awt.Dimension;
import java.util.ArrayList;
import java.util.Vector;
import javax.swing.JMenuItem;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableColumnModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableModel;
/**
* this is a checkbox list for swing application
* @author yinzhiguo
*/
public class CheckboxList extends javax.swing.JPanel {
private Vector dataModel = new Vector();
private int columnWidth = 0;
public CheckboxList( Object[] datas) {
if(datas == null)
throw new java.lang.IllegalArgumentException("datas is null!");
int max = 0;
for(Object o : datas)
{
BooleanWrap bw = new BooleanWrap(o);
int a = bw.getLabel().length();
if(max < a)
max = a;
dataModel.add(bw);
}
columnWidth = max;
initComponents();
this.setPreferredSize(table.getPreferredSize());
}
public CheckboxList(ArrayList list) {
if(list == null || list.isEmpty())
throw new java.lang.IllegalArgumentException("list is null or empty!");
int max = 0;
for(Object o : list)
{
BooleanWrap bw = new BooleanWrap(o);
int a = bw.getLabel().length();
if(max < a)
max = a;
dataModel.add(bw);
}
columnWidth = max;
initComponents();
this.setPreferredSize(table.getPreferredSize());
}
private JMenuItem getMenuItem(String id) {
JMenuItem item = new javax.swing.JMenuItem();
if("all".equals(id))
{
item.setText("??");
}else if("notAll".equals(id))
{
item.setText("???");
}else if("reverse".equals(id))
{
item.setText("??");
}
return item;
}
public ArrayList getSelectedData(){
ArrayList i = new ArrayList();
for(BooleanWrap bw : dataModel){
if(bw.getChecked()){
i.add(bw.getData());
}
}
return i;
}
private TableModel getTableModel() {
return new DataModel();
}
/** 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.
*/
@SuppressWarnings("unchecked")
// //GEN-BEGIN:initComponents
private void initComponents() {
popupMenu = new javax.swing.JPopupMenu();
allMenuItem = getMenuItem("all");
notAllMenuItem = getMenuItem("notAll");
reverseMenuItem = getMenuItem("reverse");
colText = new javax.swing.JTextField();
scrollPane = new javax.swing.JScrollPane();
table = new javax.swing.JTable();
allMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
allMenuItemActionPerformed(evt);
}
});
popupMenu.add(allMenuItem);
notAllMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
notAllMenuItemActionPerformed(evt);
}
});
popupMenu.add(notAllMenuItem);
reverseMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
reverseMenuItemActionPerformed(evt);
}
});
popupMenu.add(reverseMenuItem);
setLayout(new java.awt.BorderLayout());
add(colText, java.awt.BorderLayout.PAGE_START);
table.setModel(getTableModel());
table.setComponentPopupMenu(popupMenu);
setTableParam();
scrollPane.setViewportView(table);
add(scrollPane, java.awt.BorderLayout.CENTER);
}// //GEN-END:initComponents
private void actionPerformOfButton(int type){
if(!dataModel.isEmpty()){
for(BooleanWrap bw : dataModel)
{
if(type == 1){
bw.setChecked(Boolean.TRUE);
}else if(type == 2)
{
bw.setChecked(Boolean.FALSE);
}else if(type == 3){
bw.setChecked(!bw.getChecked());
}
}
((AbstractTableModel)table.getModel()).fireTableDataChanged();
}
}
private void allMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_allMenuItemActionPerformed
// TODO add your handling code here:
actionPerformOfButton(1);
}//GEN-LAST:event_allMenuItemActionPerformed
private void notAllMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_notAllMenuItemActionPerformed
// TODO add your handling code here:
actionPerformOfButton(2);
}//GEN-LAST:event_notAllMenuItemActionPerformed
private void reverseMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_reverseMenuItemActionPerformed
// TODO add your handling code here:
actionPerformOfButton(3);
}//GEN-LAST:event_reverseMenuItemActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JMenuItem allMenuItem;
private javax.swing.JTextField colText;
private javax.swing.JMenuItem notAllMenuItem;
private javax.swing.JPopupMenu popupMenu;
private javax.swing.JMenuItem reverseMenuItem;
private javax.swing.JScrollPane scrollPane;
private javax.swing.JTable table;
// End of variables declaration//GEN-END:variables
private void setTableParam() {
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
// table.setDragEnabled(false);
table.setShowGrid(false);
table.getTableHeader().setEnabled(false);
//???????
DefaultTableCellRenderer renderer = new DefaultTableCellRenderer();
renderer.setPreferredSize(new Dimension(0, 0));
table.getTableHeader().setDefaultRenderer(renderer);
table.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
if (e.getValueIsAdjusting()) {
return;
}
ListSelectionModel sm = (ListSelectionModel) e.getSource();
int row = sm.getLeadSelectionIndex();
if(row >=0){
BooleanWrap bw = dataModel.get(row);
colText.setText(bw.getLabel());
}
}
});
DefaultTableColumnModel dtm = (DefaultTableColumnModel)table.getColumnModel();
int count = dtm.getColumnCount();
for(int i = 0; i < count; i++)
{
TableColumn tc = dtm.getColumn(i);
tc.setResizable(false);
if(i == 0){
tc.setWidth(15);
tc.setPreferredWidth(25);
}else{
tc.setWidth(columnWidth * 3);
tc.setPreferredWidth(columnWidth * 10);
}
}
ColumnColorTableCellRenderer ctlr = new ColumnColorTableCellRenderer();
table.getColumnModel().getColumn(1).setCellRenderer(ctlr);
}
class DataModel extends AbstractTableModel {
private String[] columnNames = {"...", "..."};
public Class getColumnClass(int columnIndex) {
if(columnIndex == 0)
return Boolean.class;
return String.class;
}
public String getColumnName(int column) {
return columnNames[column];
}
public int getRowCount() {
return dataModel.size();
}
public int getColumnCount() {
return columnNames.length;
}
public Object getValueAt(int rowIndex, int colIndex) {
BooleanWrap bw = dataModel.get(rowIndex);
if(colIndex == 1)
return getDataLabel(bw.getData());
else{
return bw.getChecked();
}
}
@Override
public void setValueAt(Object value, int rowIndex, int colIndex) {
if(colIndex == 0){
Boolean flag = (Boolean)value;
BooleanWrap bw = dataModel.get(rowIndex);
bw.setChecked(flag);
}
}
@Override
public boolean isCellEditable(int rowIndex,
int columnIndex) {
if(columnIndex == 0)
return true;
return false;
}
}
/**
* ????????list????????
* ????,??????
* @param data
* @return
*/
public Object getDataLabel(Object data){
return data.toString();
}
class BooleanWrap{
private Boolean checked = Boolean.FALSE;
private Object data = null;
public BooleanWrap(Object obj)
{
this.data = obj;
}
public Boolean getChecked() {
return checked;
}
public void setChecked(Boolean checked) {
this.checked = checked;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public String getLabel(){
return (String)getDataLabel(this.getData());
}
}
}
//////////////////////////////////////////////////////
/*
* AlternationColorTableCellRenderer.java
*
* Created on 2007?9?14?, ??10:32
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package com.rntsoft.java.swing.common.pane;
import java.awt.Color;
import java.awt.Component;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.table.DefaultTableCellRenderer;
/**
*
* @author java
*/
public class ColumnColorTableCellRenderer extends DefaultTableCellRenderer{
private Color colorOne = Color.white;
private Color colorTwo = new Color(206,231,255);
private Color textColor = Color.BLUE;
private Color numberColor = Color.RED;
private Color dateColor = Color.BLUE;
/** Creates a new instance of AlternationColorTableCellRenderer */
public ColumnColorTableCellRenderer(Color one, Color two) {
if(one != null)
colorOne = one;
if(two != null)
colorTwo = two;
}
public ColumnColorTableCellRenderer() {
}
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
if(value instanceof String)
{
String str = (String)value;
this.setForeground(textColor);
}else if(value instanceof Integer || value instanceof Double || value instanceof Long)
{
this.setForeground(numberColor);
this.setHorizontalAlignment(SwingConstants.RIGHT);
}
if(row % 2 == 0){
setBackground(colorOne);
}
else if(row % 2 == 1)
{
setBackground(colorTwo);
}
return super.getTableCellRendererComponent(table, value,
isSelected, hasFocus, row, column);
}
public Color getTextColor() {
return textColor;
}
public void setTextColor(Color textColor) {
this.textColor = textColor;
}
public Color getNumberColor() {
return numberColor;
}
public void setNumberColor(Color numberColor) {
this.numberColor = numberColor;
}
public Color getDateColor() {
return dateColor;
}
public void setDateColor(Color dateColor) {
this.dateColor = dateColor;
}
}
//////////////////////////////////////////////////////
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.rntsoft.java.swing.common.pane;
import com.uusee.platform.util.*;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FontMetrics;
import java.awt.Point;
import java.awt.Toolkit;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;
/**
* @email yin_zhiguo@hotmail.com
* @author yinzhiguo
*/
public class SwingUtil {
/** Creates a new instance of SwingUtil */
private SwingUtil() {
}
public static String[] getClassNameOfLookAndFeel() {
LookAndFeelInfo[] lookAndFeelInfos = UIManager.getInstalledLookAndFeels();
String[] name = new String[lookAndFeelInfos.length];
for (int i = 0; i < lookAndFeelInfos.length; i++) {
name[i] = lookAndFeelInfos[i].getClassName();
}
return name;
}
public static void setLookAndFeel(String clzz) {
try {
UIManager.setLookAndFeel(clzz);
} catch (Exception exception) {
exception.printStackTrace();
}
}
public static int getScreenWidth() {
return getScreenSize().width;
}
public static int getScreenHeight() {
return getScreenSize().height;
}
public static Dimension getScreenSize() {
return Toolkit.getDefaultToolkit().getScreenSize();
}
public static void setLocationToCenterOfComponent(Component parent, Component child)
{
Point parentPoint = parent.getLocation();
Dimension parentDim = parent.getSize();
Dimension childDim = child.getSize();
child.setLocation(parentPoint.x + (parentDim.width - childDim.width)/2, parentPoint.y + (parentDim.height - childDim.height)/2);
}
/**
* ???????
* @param comp
*/
public static void setLocationToCenterOfScreen(Component comp) {
Dimension screenSize = getScreenSize();
Dimension frameSize = comp.getSize();
if (frameSize.height > screenSize.height) {
frameSize.height = screenSize.height;
}
if (frameSize.width > screenSize.width) {
frameSize.width = screenSize.width;
}
comp.setLocation((screenSize.width - frameSize.width) / 2,
(screenSize.height - frameSize.height) / 2);
}
public static String[] convertToMaxWidth(String[] strs, FontMetrics fm){
int max = 0; //????
int fix = fm.stringWidth(" ");//???????(?????)
int[] widths = new int[strs.length]; //???????(?????)
int[] dis = new int[strs.length]; //???????(?????)
for(int i = 0; i < strs.length; i++){
int w = fm.stringWidth(strs[i]);
// System.out.println(strs[i] + " " + w);
widths[i] = w;
if(w > max){
max = w;
}
}
max = max + fix * 4;
// System.out.println("max: " + max + ", fix: " + fix);
for(int i = 0; i < strs.length; i++){
int distance = max - widths[i]; //??????
dis[i] = (distance / fix) + 1;
}
String[] res = new String[strs.length];
for(int i = 0; i < strs.length; i++){
res[i] = Helper.leftAppendSpace(strs[i], dis[i]);
//System.out.println(strs[i] + " " + dis[i] + ", "+ widths[i] + ", " + fm.stringWidth(strs[i]));
}
return res;
}
}
//////////////////////////////////////////////////////
package com.rntsoft.java.swing.common.pane;
import java.awt.BorderLayout;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.UIManager;
/**
* @email yin_zhiguo@hotmail.com
* @author yinzhiguo
*/
public class CheckboxListTestFrame extends javax.swing.JFrame {
/** Creates new form CheckboxListTestFrame */
public CheckboxListTestFrame() {
initComponents();
this.setSize(140, 230);
this.setTitle("CheckboxList ??");
}
/** 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.
*/
@SuppressWarnings("unchecked")
// //GEN-BEGIN:initComponents
private void initComponents() {
centerPane = new javax.swing.JPanel();
testButPane = new javax.swing.JPanel();
testBut = getButtonBy("test");
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
centerPane.setLayout(new java.awt.BorderLayout());
testButPane.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.RIGHT));
testBut.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
testButActionPerformed(evt);
}
});
testButPane.add(testBut);
centerPane.add(testButPane, java.awt.BorderLayout.PAGE_END);
prepareCheckboxListPane();
getContentPane().add(centerPane, java.awt.BorderLayout.CENTER);
pack();
}// //GEN-END:initComponents
/**
* ??ID??JButton???
* @param id ?????
* @return ????
*/
public JButton getButtonBy(String id){
JButton but = new JButton();
if("test".equals(id)){
but.setText("??");
but.setToolTipText("??");
}
return but;
}
private CheckboxList langList = null;
class Book{
private String title = "";
private double price = 0.0;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}
private void prepareCheckboxListPane() {
Book t = new Book();
t.setTitle("Java??");
t.setPrice(20.5);
Book t1 = new Book();
t1.setTitle("PHP??");
t1.setPrice(30.5);
Book t2 = new Book();
t2.setTitle("C++??");
t2.setPrice(50.5);
Book t3 = new Book();
t3.setTitle("Python??");
t3.setPrice(30.5);
Book t4 = new Book();
t4.setTitle("Perl??");
t4.setPrice(23.5);
Book t5 = new Book();
t5.setTitle("SmallTalk??");
t5.setPrice(23.5);
Book t6 = new Book();
t6.setTitle("Ruby??");
t6.setPrice(23.5);
Book t7 = new Book();
t7.setTitle("Lisp??");
t7.setPrice(23.5);
Book t8 = new Book();
t8.setTitle("Shell??");
t8.setPrice(23.5);
Book[] ts = {t,t1,t2,t3,t4,t5,t6,t7,t8};
langList = new CheckboxList(ts){
@Override
public Object getDataLabel(Object data){
Book a = (Book)data;
return a.getTitle();
}
};
centerPane.add(langList, BorderLayout.CENTER);
}
private void testButActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_testButActionPerformed
// TODO add your handling code here:
ArrayList as = langList.getSelectedData();
if(as.isEmpty()){
JOptionPane.showMessageDialog(this, "????????!", "??", JOptionPane.INFORMATION_MESSAGE);
}else{
StringBuffer sub = new StringBuffer();
sub.append("");
sub.append("????:
");
sub.append("");
for(Object o : as){
Book b = (Book)o;
sub.append("- " + b.getTitle() + ", " + b.getPrice() + "
");
}
sub.append("
");
sub.append("");
JOptionPane.showMessageDialog(this, sub.toString(), "??", JOptionPane.INFORMATION_MESSAGE);
}
}//GEN-LAST:event_testButActionPerformed
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
UIManager.put("swing.boldMetal", Boolean.FALSE);
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
CheckboxListTestFrame cltf = new CheckboxListTestFrame();
SwingUtil.setLocationToCenterOfScreen(cltf);
cltf.setVisible(true);
}
});
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JPanel centerPane;
private javax.swing.JButton testBut;
private javax.swing.JPanel testButPane;
// End of variables declaration//GEN-END:variables
}
CheckboxListDemoYinZhiGuo.zip( 241 k)