JCombox
A component that combines a button or editable field and a drop-down list.
The user can select a value from the drop-down list, which appears at the user's request.
If you make the combo box editable, then the combo box includes an editable field into which the user can type a value.
话说JComboBox 默认外观确实不是太好看..在由于本人有时实在太贱.就是想要它好看...所以..这不..又折腾了..
其实这个ComboBox 刚开始想改变外观 只考虑到renderer 毕竟swing上所有的界面 显示全靠renderer来控制..
所以 着手写ComboBoxRenderer. 总是觉的 JComboBox 似乎不太好搞定 因为它不但有显示框 还有小键头.
还有弹出的List 还有ScrollBar..等等.. 似乎不那么好搞...不过Swing是强大的 ..只要你能想到..就可以做到.
那么我们要做几件事.
1: 重载JComboBox 并且设置面板透明
2: 新建renderer 实现ListCellRenderer接口
3: 重载BasicComboBoxUI
1.重载JComboBox 并且设置面板透明 设置renderer 以及设置 ui
package swing.combox.customize; import java.awt.Dimension;
import java.util.Vector; import javax.swing.ComboBoxModel;
import javax.swing.JComboBox; public class IComboBox extends JComboBox {
private static final long serialVersionUID = 1L; public IComboBox() {
super();
init();
} public IComboBox(ComboBoxModel model) {
super(model);
init();
} public IComboBox(Object[] items) {
super(items);
init();
} public IComboBox(Vector items) {
super(items);
init();
} private void init() {
setOpaque(false);
setUI(new IComboBoxUI());
setRenderer(new IComboBoxRenderer());
// setBackground(XUtil.defaultComboBoxColor);
} public Dimension getPreferredSize() {
return super.getPreferredSize();
}
}
2.新建renderer 实现ListCellRenderer接口.注意.这里的ComboBoxRenderer它是控制combobox弹出的List 并非控制JComboBox的 注意 他实现的是ListCellRenderer
package swing.combox.customize; import java.awt.Color;
import java.awt.Component; import javax.swing.DefaultListCellRenderer;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.ListCellRenderer; public class IComboBoxRenderer implements ListCellRenderer { private DefaultListCellRenderer defaultCellRenderer = new DefaultListCellRenderer(); public IComboBoxRenderer() {
super();
} public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) { JLabel renderer = (JLabel) defaultCellRenderer.getListCellRendererComponent(
list, value, index, isSelected, cellHasFocus);
if (isSelected) {
// renderer.setBackground(XUtil.defaultComboBoxBoundsColor);
renderer.setForeground(Color.WHITE);
} else {
renderer.setBackground(Color.WHITE);
}
// list.setSelectionBackground(XUtil.defaultComboBoxColor);
list.setBorder(null);
// renderer.setFont(XUtil.defaultComboBoxFont);
renderer.setHorizontalAlignment(JLabel.CENTER);
return renderer;
}
}
3.重载BasicComboBoxUI .sure 这里当然要注意.因为他是JComboBox的绘制机制
这里包括ComboBox右边的那个箭头的Button.(我们已经通过重写 createArrowButton 来改变这个Button);
至于弹出的List ,it in here, look it ..createPoput(); it create ComboPopup.(不好意思 最近在学英文 总是那么顺口来那么几句.)
这里存在一个ScrollPane 它包含了List.并且我们重写ScrollPane的paintBorder方法 来让我们画出List的Border
package swing.combox.customize; import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.RenderingHints; import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
import javax.swing.plaf.basic.BasicComboBoxUI;
import javax.swing.plaf.basic.BasicComboPopup;
import javax.swing.plaf.basic.ComboPopup; public class IComboBoxUI extends BasicComboBoxUI { private JButton arrow;
private boolean boundsLight = false;
private static final int ARCWIDTH = 15;
private static final int ARCHEIGHT = 15; public IComboBoxUI() {
super();
} protected JButton createArrowButton() {
arrow = new JButton();
// arrow.setIcon(XUtil.defaultComboBoxArrowIcon);
arrow.setRolloverEnabled(true);
// arrow.setRolloverIcon(XUtil.defaultComboBoxArrowIcon_Into);
arrow.setBorder(null);
// arrow.setBackground(XUtil.defaultComboBoxColor);
arrow.setOpaque(false);
arrow.setContentAreaFilled(false);
return arrow;
} public void paint(Graphics g, JComponent c) {
hasFocus = comboBox.hasFocus();
Graphics2D g2 = (Graphics2D) g;
if (!comboBox.isEditable()) {
Rectangle r = rectangleForCurrentValue();
// 重点:JComboBox的textfield 的绘制 并不是靠Renderer来控制 这点让我很吃惊. // 它会通过paintCurrentValueBackground来绘制背景 // 然后通过paintCurrentValue();去绘制JComboBox里显示的值 paintCurrentValueBackground(g2, r, hasFocus);
paintCurrentValue(g2, r, hasFocus);
} g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
int width = (int) this.getPreferredSize(c).getWidth()
+ arrow.getWidth() - 2;
int height = 0;
int heightOffset = 0;
if (comboBox.isPopupVisible()) {
heightOffset = 5;
height = (int) this.getPreferredSize(c).getHeight();
// arrow.setIcon(XUtil.defaultComboBoxArrowIcon_Into);
} else {
heightOffset = 0;
height = (int) this.getPreferredSize(c).getHeight() - 1;
// arrow.setIcon(XUtil.defaultComboBoxArrowIcon);
}
if (comboBox.isFocusable()) {
g2.setColor(new Color(150, 207, 254));
}
g2.drawRoundRect(0, 0, width, height + heightOffset, ARCWIDTH, ARCHEIGHT);
} public void paintCurrentValue(Graphics g, Rectangle bounds, boolean hasFocus) {
Font oldFont = comboBox.getFont();
// comboBox.setFont(XUtil.defaultComboBoxFont); super.paintCurrentValue(g, bounds, hasFocus);
comboBox.setFont(oldFont);
} public Dimension getPreferredSize(JComponent c) {
return super.getPreferredSize(c);
} public boolean isBoundsLight() {
return boundsLight;
} public void setBoundsLight(boolean boundsLight) {
this.boundsLight = boundsLight;
} protected ComboPopup createPopup() {
ComboPopup popup = new BasicComboPopup(comboBox) {
protected JScrollPane createScroller() {
JScrollPane sp = new JScrollPane(list,
ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
sp.setHorizontalScrollBar(null);
return sp;
} // 重载paintBorder方法 来画出我们想要的边框.. public void paintBorder(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.setColor(new Color(150, 207, 254));
g2.drawRoundRect(0, -arrow.getHeight(), getWidth() - 1, getHeight() + arrow.getHeight() - 1, 0, 0);
}
};
return popup;
}
}
ok. 那么到这里 ComboBox这块已经end 但是似乎还有个问题存在 那就是createPopup 方法里的ScrollPane的滚动条还是有点丑.
so。.next 我们搞定 it.
1:继承 ScrollBar 并且 setUI();
2:继承 BasicScrollBarUI 我们来G出我们的效果.
paintThumb 绘制scrollbar里拖动的小box 我们先画个边框 and draw two Orange line.
paintTrack 绘制scrollbar里小box的轨迹.也就是那个啥(术语怎么说来着?拖拽滑块?).
注意:我们首先将Graphics设置透明后 在去画面板 然后立刻把Graphics设置为不透明..
这样是为了能让我们把轨迹左边边界画出来...
createIncreaseButton draw down arrowButton 小心 千万不要use JButton button = new JButton();
should use BasicArrowButton 不然你将无法click this button 并产生你想要的效果..
你猜的到 createDecreaseButton(); 方法是干什么的..(笨蛋 上面那个Button啦);
package swing.combox.customize; import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.RenderingHints; import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.plaf.basic.BasicArrowButton;
import javax.swing.plaf.basic.BasicScrollBarUI; public class IScrollBarUI extends BasicScrollBarUI {
public IScrollBarUI() {
super();
} protected void paintThumb(Graphics g, JComponent c, Rectangle thumbBounds) {
int width = thumbBounds.width;
int height = thumbBounds.height;
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON); g2.translate(thumbBounds.x, thumbBounds.y);
// g2.setColor(XUtil.defaultComboBoxBoundsColor);
g2.drawRoundRect(1, 1, width - 2, height - 2, 5, 5); g2.setColor(Color.ORANGE);
g2.drawLine(3, height / 2, width - 4, height / 2);
g2.drawLine(3, height / 2 + 3, width - 4, height / 2 + 3);
g2.translate(-thumbBounds.x, -thumbBounds.y);
} protected void paintTrack(Graphics g, JComponent c, Rectangle trackBounds) {
// g.setColor(XUtil.defaultComboBoxColor);
int x = trackBounds.x;
int y = trackBounds.y;
int width = trackBounds.width;
int height = trackBounds.height;
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.setComposite(AlphaComposite
.getInstance(AlphaComposite.SRC_OVER, 0.1f)); g2.fill3DRect(x, y, width, height, true);
g2.setComposite(AlphaComposite
.getInstance(AlphaComposite.SRC_OVER, 1f));
// g2.setColor(XUtil.defaultComboBoxBoundsColor.brighter());
g2.fill3DRect(x, y, 1, height + 1, true);
if (trackHighlight == DECREASE_HIGHLIGHT) {
paintDecreaseHighlight(g);
}
else if (trackHighlight == INCREASE_HIGHLIGHT) {
paintIncreaseHighlight(g);
}
} protected JButton createIncreaseButton(int orientation) {
JButton button = new BasicArrowButton(orientation) {
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
// g2.setColor(XUtil.defaultComboBoxBoundsColor);
g2.drawLine(0, 0, 0, getHeight());
g2.drawLine(0, 0, getWidth(), 0 - 1);
// g2.drawImage(((ImageIcon) XUtil.defaultComboBoxArrowIcon_Into).getImage(), -1, 0, null);
}
};
button.setOpaque(false);
return button;
} protected JButton createDecreaseButton(int orientation) { JButton button = new BasicArrowButton(orientation) {
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
// g2.setColor(XUtil.defaultComboBoxBoundsColor);
g2.drawLine(0, 0, 0, getHeight());
g2.drawLine(0, getHeight() - 1, getWidth(), getHeight());
// g2.drawImage(((ImageIcon) XUtil.defaultComboBoxArrowIcon_Into).getImage(), -1, 0, null);
}
};
button.setOpaque(false);
return button;
}
}
http://blog.chinaunix.net/uid-12888785-id-2384253.html
http://www.blogjava.net/chensiyu04/archive/2011/03/27/346868.html
http://blog.sina.com.cn/s/blog_4e6d7e6901000bvm.html
http://blog.chinaunix.net/uid-12888785-id-2384254.html
http://www.2cto.com/kf/201103/86224.html
http://blog.csdn.net/bradwoo8621/article/details/1523118
http://blog.sina.com.cn/s/blog_4412ae250100062n.html


设置JComboBox中JList中元素的ToolTipText需要JComboBox.setRenderer(实现设置ToolTipText的ListCellRenderer);
设置JComboBox的ToolTipText需要JComboBox.addItemListener(new ItemListener()的itemStateChanged方法中调用JComboBox.setToolTipText("tips")
package swing.combox; import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener; import javax.swing.DefaultListCellRenderer;
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.SwingUtilities; /*2015-6-1*/
public class ComboxDemo extends JFrame {
private static final long serialVersionUID = 1L; public ComboxDemo() {
this.setLayout(new FlowLayout());
final JTextField text = new JTextField("test", 10);
this.add(text); String[] petStrings = { "Bird", "Cat", "Dog", "Rabbit", "Pig", "Tiger", "Lion", "Egg", "Swan", "Goose", "Chinese sturgeon" };
final JComboBox petList = new JComboBox(petStrings);
this.add(petList);
petList.setRenderer(new ListCellRendererImpl1());
// petList.setRenderer(new ListCellRendererImpl2());
petList.setPreferredSize(new Dimension(100, 20));
petList.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
text.setText(petList.getSelectedItem().toString() + ":" + petList.getSelectedIndex());
petList.setToolTipText(petList.getSelectedItem().toString());
}
});
petList.setSelectedIndex(4);
// petList.setSelectedItem("Swan"); } public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() { @Override
public void run() {
ComboxDemo comboBox = new ComboxDemo();
comboBox.setDefaultCloseOperation(EXIT_ON_CLOSE);
comboBox.setSize(400, 200);
comboBox.setVisible(true);
comboBox.setLocationRelativeTo(null);
}
});
} } /**
* for JList ToolTextTip
*/
class ListCellRendererImpl1 extends JTextField implements ListCellRenderer {
private static final long serialVersionUID = 1L; @Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
String item = (value == null) ? "" : value.toString();
setText(item);
setBorder(null);
list.setToolTipText("第" + index + "被选中:" + item);
return this;
} } class ListCellRendererImpl2 extends DefaultListCellRenderer {
private static final long serialVersionUID = 1L; @Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
JComponent component = (JComponent) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
setToolTipText(value + ":" + index);
return component;
} @Override
public void setToolTipText(String text) {
super.setToolTipText(text);
} }
JCombox的更多相关文章
- java中的jComBox的基本用法
jComBox获取选中的字符串 getSelectedItem().toString()返回一个字符串 getSelectedItem()返回一个对象. getSelectedIndex()得到选择值 ...
- JComBox的用法
JComboBox的使用: 类层次结构图: java.lang.Object --java.awt.Component --java.awt.Container - ...
- java GUI之事件处理
常见事件及相应事件源类型 事件源 用户操作 事件 JButton 点击按钮 ActionEvent JTextField 在文本域按回车键 ActionEvent JCheckBox 点击复选框 Ac ...
- java 的Swing
1.原来的AWT组件来自java.awt包,而AWT组件的java应用程序在不同平台的界面显示不同.但是在不同平台运用Swing开发的应用程序,就可以使用同一的GUI界面. 2.SWing组件通常被称 ...
- java图形
JFreeCharteclipse图形化编程插件jigloojfaceibm的jface基于swt,swing解决了awt存在的lcd问题.swing组件:container,window,frame ...
- JComboBox实现时间控件
1.认识JComboBox控件 最近学习使用了JComboBox组件: 在学习使用了JList以及Jtree组件之后,对于使用JComboBox还是很轻松的. JcomboBox的其实也是由一个Mod ...
- JavaGUI之Swing简单入门示例
简介 AWT(译:抽象窗口工具包),是Java的平台独立的窗口系统,图形和用户界面器件工具包. Swing 是为了解决 AWT 存在的问题而以 AWT 为基础新开发的包(在使用Swing时也常会用到j ...
- Java-GUI基础(三)java.swing
1. 简介 swing与awt:可以认为awt是swing的前身,awt即Abstrace Window Toolkit抽象窗口工具包,swing是为了解决awt在开发中的问题而开发的,是awt的改良 ...
- Java-GUI 编程之 JList、JComboBox实现列表框
目录 JList.JComboBox实现列表框 简单列表框 不强制存储列表项的ListModel和ComboBoxModel 强制存储列表项的DefaultListModel和DefaultCombo ...
随机推荐
- linux+nginx+mysql+php
LNMP(linux+nginx+mysql+php)服务器环境配置 一.简介 Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为 “engine X”, 是一个高性能的 ...
- 【转】C# String.Format数字格式化输出各种转换{0:N2} {0:D2} {0:C2}...
; //格式为sring输出 // Label1.Text = string.Format("asdfadsf{0}adsfasdf",a); // Label2.Text = & ...
- 【cocos2d-x制作别踩白块儿】第一期:游戏介绍
这一系类文章.我们将来分析时下最火的一款游戏 -- 别踩白块儿. 无图无真相,先上图 这就是我们终于要完毕项目的效果图. 游戏刚開始的最以下有一栏为黄色,紧接着上面每一行都是有一个黑色块,其余为白色块 ...
- C# webservice初探
转载请注明出处Coder的不平庸:http://blog.csdn.net/pearyangyang/article/details/46348633 因为工作的终端曾经是直接对数据库进行操作,导致每 ...
- hdu4734(数位dp)
hdu4734 给定 a和b, 问区间[0,b]内有多少个数字的f(i) <=f(a) dp[i][s] 表示i位的数字的f<=s 所以比如如果第i+1位选择数字5之后, 那么只要剩下的i ...
- python学习笔记--for循环
推荐一个学习语言的网站:http://www.codecademy.com 有教程,可以边学边写,蛮不错的. for循环: 1.for loops allow us to iterate throug ...
- JDK1.8源码分析之HashMap(一) (转)
一.前言 在分析jdk1.8后的HashMap源码时,发现网上好多分析都是基于之前的jdk,而Java8的HashMap对之前做了较大的优化,其中最重要的一个优化就是桶中的元素不再唯一按照链表组合,也 ...
- 浅谈新一代Android操作系统Android L
今天早一些的时候,Google公布了新一代Android操作系统Android L.让我很意外的是命名规则的变化,之前外界纷纷推測会叫Android5.0,同一时候会给一个甜品的名字命名.由于Andr ...
- 小米2S Mk6.0.1 [只能做测试体验,不能使用]
上几张高清图片.. 说明: 此版本只能做测试体验,不能做实际使用. 开发者: laser杨万荣 感谢: 秋叶随风ivan, m1cha 及 MoKee Open Source的各位开发者 下载地址:链 ...
- 用数据说话,外贸产品选择(中篇)-google趋势分析法
在上篇文章<用数据说话,贸B2C产品选择(上篇)-热门搜索法>中我们能搜索出来几种产品了,那我们就拿上次搜索出来的热门产品来做一个趋势分析.我们经过几个站点挑出了几种热卖产品Wedding ...