0
点赞
收藏
分享

微信扫一扫

自己扩展 标题带Radio的TitledBorder


[code]


1.首先自己扩展一个TitledBorder ,源码如下:

public class ComponentTitledBorder implements Border, MouseListener, 

 SwingConstants { 

 int offset = 5; 


 Component comp; 

 JComponent container; 

 Rectangle rect; 

 Border border; 


 public ComponentTitledBorder(Component comp, JComponent container, 

 Border border) { 

 this.comp = comp; 

 this.container = container; 

 this.border = border; 

 container.addMouseListener(this); 

 } 


 public boolean isBorderOpaque() { 

 return true; 

 } 


 public void paintBorder(Component c, Graphics g, int x, int y, int width, 

 int height) { 

 Insets borderInsets = border.getBorderInsets(c); 

 Insets insets = getBorderInsets(c); 

 int temp = (insets.top - borderInsets.top) / 2; 

 border.paintBorder(c, g, x, y + temp, width, height - temp); 

 Dimension size = comp.getPreferredSize(); 

 rect = new Rectangle(offset, 0, size.width, size.height); 

 SwingUtilities.paintComponent(g, comp, (Container) c, rect); 

 } 


 public Insets getBorderInsets(Component c) { 

 Dimension size = comp.getPreferredSize(); 

 Insets insets = border.getBorderInsets(c); 

 insets.top = Math.max(insets.top, size.height); 

 return insets; 

 } 


 private void dispatchEvent(MouseEvent me) { 

 if (rect != null && rect.contains(me.getX(), me.getY())) { 

 Point pt = me.getPoint(); 

 pt.translate(-offset, 0); 

 comp.setBounds(rect); 

 comp.dispatchEvent(new MouseEvent(comp, me.getID(), me.getWhen(), 

 me.getModifiers(), pt.x, pt.y, me.getClickCount(), me 

 .isPopupTrigger(), me.getButton())); 

 if (!comp.isValid()) 

 container.repaint(); 

 } 

 } 


 public void mouseClicked(MouseEvent me) { 

 dispatchEvent(me); 

 } 


 public void mouseEntered(MouseEvent me) { 

 dispatchEvent(me); 

 } 


 public void mouseExited(MouseEvent me) { 

 dispatchEvent(me); 

 } 


 public void mousePressed(MouseEvent me) { 

 dispatchEvent(me); 

 } 


 public void mouseReleased(MouseEvent me) { 

 dispatchEvent(me); 

 } 

}



2.测试运行,测试代码如下

public class MyBorder { 


 public static void main(String[] args) { 

 try{ 

 UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 

 } catch(Exception e){ 

 e.printStackTrace(); 

 } 

 final JPanel proxyPanel = new JPanel(); 

 proxyPanel.add(new JLabel("google: ")); 

 proxyPanel.add(new JTextField("www.google.com.hk")); 

 proxyPanel.add(new JLabel("google Port")); 

 proxyPanel.add(new JTextField("8080")); 

 final JCheckBox checkBox = new JCheckBox("测试标题带Checkbox的TitledBorder", true); 

 final JRadioButton radio = new JRadioButton("测试标题带Radio的TitledBorder", true); 

 checkBox.setFocusPainted(false); 

 ComponentTitledBorder componentBorder = 

 new ComponentTitledBorder(radio, proxyPanel 

 , BorderFactory.createEtchedBorder()); 

 checkBox.addActionListener(new ActionListener(){ 

 public void actionPerformed(ActionEvent e){ 

 boolean enable = checkBox.isSelected(); 

 Component comp[] = proxyPanel.getComponents(); 

 for(int i = 0; i<comp.length; i++){ 

 comp[i].setEnabled(enable); 

 } 

 } 

 }); 


 radio.addActionListener(new ActionListener(){ 

 public void actionPerformed(ActionEvent e){ 

 boolean enable = radio.isSelected(); 

 Component comp[] = proxyPanel.getComponents(); 

 for(int i = 0; i<comp.length; i++){ 

 comp[i].setEnabled(enable); 

 } 

 } 

 }); 

 proxyPanel.setBorder(componentBorder); 

 JFrame frame = new JFrame("ComponentTitledBorder - santhosh@in.fiorano.com"); 

 Container contents = frame.getContentPane(); 

 contents.setLayout(new FlowLayout()); 

 contents.add(proxyPanel); 

 frame.pack(); 

 frame.setBounds(200, 200, 400, 400); 

 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

 frame.setVisible(true); 

 } 


}




效果请看附件


[/code]

举报

相关推荐

0 条评论