java swing的可輸入可多選的下拉框
阿新 • • 發佈:2018-06-14
void bottom document cati valueof == cer create AC import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.swing.BorderFactory;
import javax.swing.CellRendererPane;
import javax.swing.DefaultListSelectionModel;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JTextField;
import javax.swing.ListCellRenderer;
import javax.swing.ListSelectionModel;
import javax.swing.plaf.basic.BasicComboPopup;
import javax.swing.plaf.basic.ComboPopup;
import javax.swing.plaf.metal.MetalComboBoxUI;
import javax.swing.text.Document;
import javax.swing.text.JTextComponent;
public class MyJComboBox
{
public static void main(String[] args)
{
JFrame frame = new JFrame();
frame.setLayout(new FlowLayout(FlowLayout.CENTER, 20, 20));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500, 500);
frame.setLocationRelativeTo(null);
ReJComboBox reJComboBox = new ReJComboBox(new String[] { "1", "2", "3", "4", "5", "6", "7", "8", "9", "4", "5", "6", "1", "2", "3", "4", "5", "6" });
reJComboBox.setPreferredSize(new Dimension(150, 26));
reJComboBox.setBorder(BorderFactory.createLineBorder(Color.GREEN));
reJComboBox.setEditable(true);
jTextFieldall =(JTextField) reJComboBox.getEditor().getEditorComponent();
frame.add(reJComboBox);
frame.setVisible(true);
}
//************************重寫JComboBox組件以便於直接使用
protected static JTextField jTextFieldall;
public static class ReJComboBox extends JComboBox
{
protected Set set = new HashSet();
private ReJComboBox(String[] string)
{
super(string);
setUI(new ReMetalComboBoxUI());
setRenderer(new ReJCheckBox());
}
public String Stringmanipulation()
{
StringBuilder sb;
String spliceRegex = ",";
List list = new ArrayList(set);
Collections.sort(list);
sb = new StringBuilder();
for (int i=0;i<list.size();i++)
{
Object obj = getModel().getElementAt( Integer.parseInt(list.get(i).toString()));
sb.append(obj == null ? "" : obj).append(spliceRegex);
}
if(sb.length()>1)
sb.setLength(sb.length()-1);
return sb.toString();
}
}
public static class ReBasicComboPopup extends BasicComboPopup
{
public ReBasicComboPopup(JComboBox combo)
{
super(combo);
}
protected void configureList()
{
super.configureList();
list.setSelectionModel(new DefaultListSelectionModel() {public boolean isSelectedIndex(int index)
{
return ((ReJComboBox) comboBox).set.contains(Integer.valueOf(index));
}});
}
protected MouseListener createListMouseListener()
{
return new ReMouseAdapter(list,comboBox);
}
}
//************************重寫鼠標監聽事件
private static class ReMouseAdapter extends MouseAdapter
{
protected JList jList;
protected JComboBox jComboBox;
private ReMouseAdapter(JList list, JComboBox comboBox)
{
this.jList = list;
this.jComboBox = comboBox;
}
public void mousePressed(MouseEvent anEvent)
{
int index = jList.getSelectedIndex();
ReJComboBox reJComboBox = (ReJComboBox) jComboBox;
if (jList.getSelectionMode() == ListSelectionModel.MULTIPLE_INTERVAL_SELECTION)
if (reJComboBox.set.contains(Integer.valueOf(index)))
reJComboBox.set.remove(Integer.valueOf(index));
else
reJComboBox.set.add(Integer.valueOf(index));
else
if (!reJComboBox.set.contains(Integer.valueOf(index)))
{
reJComboBox.set.clear();
reJComboBox.set.add(Integer.valueOf(index));
}
jComboBox.repaint();
jList.repaint();
}
}
//************************重寫MetalComboBoxUI彈出框
public static class ReMetalComboBoxUI extends MetalComboBoxUI
{
public void paint( Graphics g, JComponent c )
{
Rectangle r = rectangleForCurrentValue();
paintCurrentValueBackground(g,r,hasFocus);
paintCurrentValue(g,r,hasFocus);
}
public void paintCurrentValue(Graphics g, Rectangle bounds, boolean hasFocus)
{
JTextField jTextField = new JTextField();
jTextField.setText(((ReJComboBox) comboBox).Stringmanipulation());
jTextField.setFont(comboBox.getFont());
jTextField.setOpaque(comboBox.isOpaque());
if (comboBox.getRenderer() instanceof JComponent)
{
JComponent r = (JComponent) comboBox.getRenderer();
jTextField.setBorder(r.getBorder());
}
int x = bounds.x, y = bounds.y, w = bounds.width, h = bounds.height;
if (padding != null)
{
x = bounds.x + padding.left;
y = bounds.y + padding.top;
w = bounds.width - (padding.left + padding.right);
h = bounds.height - (padding.top + padding.bottom);
}
new ReCellRendererPane(currentValuePane).paintComponent(g, jTextField, comboBox, x, y, w, h, true);
}
protected ComboPopup createPopup()
{
return new ReBasicComboPopup(comboBox);
}
}
//************************重寫錄入框
public static class ReCellRendererPane extends CellRendererPane
{
protected CellRendererPane cellRendererPane;
private ReCellRendererPane(CellRendererPane cellRendererPane)
{
this.cellRendererPane = cellRendererPane;
}
public void paintComponent(Graphics g, Component c, Container p, int x, int y, int w, int h, boolean shouldValidate)
{
if (c == null)
{
if (p != null)
{
Color oldColor = g.getColor();
g.setColor(p.getBackground());
g.fillRect(x, y, w, h);
g.setColor(oldColor);
}
return;
}
Document doc = ((JTextComponent)c).getDocument();
if (c.getParent() != this)
{
this.add(c);
}
c.setBounds(x, y, w, h);
if(shouldValidate)
{
c.validate();
}
boolean wasDoubleBuffered = false;
if ((c instanceof JComponent) && ((JComponent)c).isDoubleBuffered())
{
wasDoubleBuffered = true;
((JComponent)c).setDoubleBuffered(false);
}
jTextFieldall.setDocument(doc);
Graphics cg = g.create(x, y, w, h);
try {
c.paint(cg);
}
finally {
cg.dispose();
}
if (wasDoubleBuffered && (c instanceof JComponent)) {
((JComponent)c).setDoubleBuffered(true);
}
c.setBounds(-w, -h, 0, 0);
}
}
//************************修改彈出框的選單樣式
public static class ReJCheckBox extends JCheckBox implements ListCellRenderer
{
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus)
{
setComponentOrientation(list.getComponentOrientation());
if (isSelected)
{
setBackground(list.getSelectionBackground());
setForeground(list.getSelectionForeground());
} else
{
setBackground(list.getBackground());
setForeground(list.getForeground());
}
setEnabled(list.isEnabled());
setSelected(isSelected);
setText(value == null ? "" : value.toString());
setFont(list.getFont());
return this;
}
}
}
java swing的可輸入可多選的下拉框