[Áöµð³ÝÄÚ¸®¾Æ]¼ÒÇÁÆ®¿þ¾î »ç¿ëÀÚµéÀº °áÄÚ ¸Þ´º¾óÀ» ¾Èº»´Ù. ¾Æ¹«¸® ¾î·Á¿î ÇÁ·Î±×·¥À̶ó ÇØµµ »ç¿ëÀÚ´Â Àڱ⠽º½º·Î ¹æ¹ýÀ» ã¾Æ³»·Á°í ÇÑ´Ù. Á¤¸» È¥ÀÚ¼ ÇØ°áÇÏÁö ¸øÇÑ´Ù ÇØµµ ´Ù¸¥ »ç¶÷¿¡°Ô ¹°¾îº¼Áö¾ðÁ¤ ¸Þ´º¾óÀº ¾Èº»´Ù.
µû¶ó¼ °³¹ßÀÚ´Â ÇÁ·Î±×·¥À» »ç¿ëÇϱ⠽±°í Á÷°üÀûÀ¸·Î ÀÌ¿ëÇÒ ¼ö ÀÖµµ·Ï ¸¸µé¾î¾ß ÇÑ´Ù. °áÄÚ ¸Þ´º¾óÀ» º¸Áö ¾Ê´Â »ç¿ëÀڵ鿡°Ô ¾î¶»°Ô ÇÁ·Î±×·¥À» ÀÌÇØ½ÃŰ°í µµ¿òÀ» ÁÙ ¼ö ÀÖÀ»Áö, ¸î°¡Áö ¹æ¹ýÀ» ¾Ë¾Æº¸ÀÚ.
»ç¿ëÀÚ °¡À̵åÇϱâ
°¡Àå ÀÚÁÖ ¾²ÀÌ´Â ¹æ¹ýÀº °¢ ÀÎÅÍÆäÀ̽º¿¡ °£´ÜÇÑ ÈùÆ®³ª ±æÀâÀÌ ¹®±¸¸¦ ³Ö´Â °ÍÀÌ´Ù. ½ºÀ®(Swing) ÇÁ·¹ÀÓ¿öÅ©´Â ÅøÆÁ ÇüÅ·ΠÀÌ·¯ÇÑ ±â´ÉÀ» Àû¿ë½Ã۵µ·Ï ÇØÁØ´Ù. setToolTipText ¸Þ¼Òµå¸¦ È£ÃâÇÔÀ¸·Î½á ¾î¶² ½ºÀ® ÄÄÆ÷³ÍÆ®¿¡ ´ëÇØ¼µµ ÅøÆÁÀ» ¼³Á¤ÇÒ ¼ö ÀÖ´Ù.
ÅøÆÁÀÌ ¼³Á¤µÇ¸é ¸¶¿ì½º°¡ ÇØ´ç ÄÄÆ÷³ÍÆ® À§·Î À§Ä¡ÇÒ °æ¿ì ÅØ½ºÆ®·Î µÈ °£´ÜÇÑ ¼³¸íÀÌ ÀÛÀº À©µµ¿ì¿¡ Ç¥½ÃµÈ´Ù(¸¶¿ì½º°¡ Áö³ª°¡¸é »ç¶óÁø´Ù). ÀÌ ¼³¸í¿¡´Â ÄÄÆ÷³ÍÆ®ÀÇ ±â´ÉÀ̳ª °³¹ßÀÚ°¡ À¯¿ëÇÏ´Ù°í »ý°¢ÇÏ´Â Á¤º¸ µîÀÌ ´ã°ÜÀÖ´Ù.
ÅøÆÁÀº °£°áÇÏ°í ¸íÈ®ÇÑ ¹æ¹ýÀÌÁö¸¸ ´ÜÁ¡µµ ÀÖ´Ù. ¾ÆÁÖ ¼Ò·®ÀÇ Á¤º¸¸¸ Àü´ÞÇÒ ¼ö ÀÖÀ¸¸ç, ÀÎÅÍÆäÀ̽º À§¿¡ °ãÃÄÁ®¼ Ç¥½ÃµÇ±â ¶§¹®¿¡ ¿ÀÈ÷·Á »ç¿ë¿¡ ¹æÇذ¡ µÇ±âµµ ÇÑ´Ù. µû¶ó¼ ÇÁ·Î±×·¥ÀÇ ¸Þ´º¿¡ »ç¿ëÇϱ⿡´Â ÀûÇÕÇÏÁö ¾ÊÀº ¸éÀÌ ÀÖ´Ù.
ÅøÆÁ ¿Ü¿¡ »óÅÂÇ¥½ÃÁÙ¿¡ ¼³¸íÀ» Ç¥½ÃÇÏ´Â ¹æ¹ýÀÌ ÀÖ´Ù. ±âº» °³³äÀº ÅøÆÁ°ú µ¿ÀÏÇÏ´Ù. ¸¶¿ì½º°¡ ¾î¶² ¿ä¼Ò À§¿¡ ÀÖÀ» µ¿¾È¿¡¸¸ ¼³¸íÀÌ ³ªÅ¸³´Ù. ´Ù¸¸ ÇÁ·Î±×·¥ À©µµ¿ìÀÇ »óÅÂÇ¥½ÃÁÙ¿¡ ¼³¸íÀÌ º¸¿©Áö¹Ç·Î, ÅøÆÁó·³ ÇÁ·Î±×·¥ »ç¿ë¿¡ ¹æÇذ¡ µÇ´Â ÀÏÀº ¾ø´Ù.
¸¶¿ì½º-¿À¹ö ¹æ½Ä Àû¿ëÇϱâ
½ºÀ®¿¡¼´Â »óÅÂÇ¥½ÃÁÙ¿¡ ¼³¸íÀ» º¸¿©ÁÖ´Â ±â´ÉÀ» ±âº» Á¦°øµÇÁö ¾ÊÁö¸¸, ¾î·ÆÁö ¾Ê°Ô Á÷Á¢ ±¸ÇöÇÒ ¼ö ÀÖ´Ù. ¼³¸íÀ» º¸¿©ÁÖ°íÀÚ ÇÏ´Â °¢ Ç׸ñÀ» '¸¶¿ì½º °¨Áö±â(mouse listener)'¿Í ¿¬°áÇϰí, MouseListener ÀÎÅÍÆäÀ̽ºÀÇ mouseEntered¿Í mouseExited ¸Þ¼Òµå¸¦ Àû¿ëÇÏ¸é µÈ´Ù.
mouseEntered ¸Þ¼Òµå´Â ¼³¸íÀ» º¸¿©ÁÖ´Â ¿ªÇÒÀ», mouseExited ¸Þ¼Òµå´Â ¼³¸íÀ» »ç¶óÁö°Ô ÇÏ´Â ¿ªÇÒÀ» ÇÑ´Ù. ÀÌ À̺¥Æ® ¼Ò½º¸¦ »ç¿ëÇϸé Ç׸ñÀ» ½Äº°ÇØ ÀÚµ¿À¸·Î ÇØ´çµÇ´Â ¼³¸íÀ» º¸¿©Áֱ⠶§¹®¿¡ °¢ Ç׸ñ¸¶´Ù ÀÏÀÏÀÌ ¸¶¿ì½º ¿¬°áÀ» ÇÏÁö ¾Ê¾Æµµ µÈ´Ù.
MouseOverHintManager(¼Ò½ºº¸±â1)´Â Àç»ç¿ëÀÌ °¡´ÉÇÑ »óÅÂÇ¥½ÃÁÙ ¼³¸í ±â´ÉÀ» º¸¿©ÁØ´Ù. »ç¿ë¹ýÀº ¾ÆÁÖ °£´ÜÇÏ´Ù. JLabelÀ» °ÅÄ¡´Â MouseOverHintManagerÀÇ ÀνºÅϽº¸¦ ¼³Á¤ÇÑ ÈÄ, addHintFor ¸Þ¼Òµå¸¦ È£ÃâÇØ °¢ Ç׸ñ¿¡ ´ëÇÑ ¼³¸íÀ» ¼³Á¤ÇÑ´Ù. žÄÁÅ×À̳Ê(ÇÁ·Î±×·¥ â, ÇÁ·¹ÀÓ, ´ëÈ»óÀÚ µî)¿¡ ´ëÇØ¼ enableHints ¸Þ¼Òµå¸¦ È£ÃâÇÑ´Ù.
| |
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
public class MouseOverHintManager implements MouseListener {
private Map hintMap;
private JLabel hintLabel;
public MouseOverHintManager( JLabel hintLabel ) {
hintMap = new WeakHashMap();
this.hintLabel = hintLabel;
}
public void addHintFor( Component comp, String hintText ) {
hintMap.put( comp, hintText );
}
public void enableHints( Component comp ) {
comp.addMouseListener( this );
if ( comp instanceof Container ) {
Component[] components = ((Container)comp).getComponents();
for ( int i=0; i<components.length; i++ )
enableHints( components[i] );
}
if ( comp instanceof MenuElement ) {
MenuElement[] elements = ((MenuElement)comp).getSubElements();
for ( int i=0; i<elements.length; i++ )
enableHints( elements[i].getComponent() );
}
}
private String getHintFor( Component comp ) {
String hint = (String)hintMap.get(comp);
if ( hint == null ) {
if ( comp instanceof JLabel )
hint = (String)hintMap.get(((JLabel)comp).getLabelFor());
else if ( comp instanceof JTableHeader )
hint = (String)hintMap.get(((JTableHeader)comp).getTable());
}
return hint;
}
public void mouseEntered( MouseEvent e ) {
Component comp = (Component)e.getSource();
String hint;
do {
hint = getHintFor(comp);
comp = comp.getParent();
} while ( (hint == null) && (comp != null) );
if ( hint != null )
hintLabel.setText( hint );
}
public void mouseExited( MouseEvent e ) {
hintLabel.setText( " " );
}
public void mouseClicked( MouseEvent e ) {}
public void mousePressed( MouseEvent e ) {}
public void mouseReleased( MouseEvent e ) {}
} | |
 |
MouseOverHintManager¸¦ Àû¿ëÇÏ´Â °Íµµ »ó±âÇÑ ÀýÂ÷¿Í À¯»çÇÏ´Ù. addHintFor ¸Þ¼Òµå´Â º¯¼ö·Î ÄÄÆ÷³ÍÆ® ·¹ÆÛ·±½º¿Í ÀÌ¿¡ ´ëÀÀÇÏ´Â ¼³¸íÀ» ¹Þ°í, À̸¦ ¸Ê(Map)¿¡ ÀúÀåÇÑ´Ù. ¼³¸íÀº WeakHashMap ÀνºÅϽº¿¡ ÀúÀåµÇ±â ¶§¹®¿¡ ´ëÀÀ Ç׸ñ¿¡ ´ëÇÑ ÂüÁ¶°¡ ´õ ÀÌ»ó ¾øÀ» °æ¿ì ÀÚµ¿ÀûÀ¸·Î °¡ºñÁö-ÄÝ·ºÆ®(garbage-collected) 󸮵ȴÙ. µû¶ó¼ ¼³¸íÀ» »ç¶óÁö°Ô Çϱâ À§ÇÑ º°µµÀÇ ¸Þ¼Òµå´Â ÇÊ¿ä ¾ø´Ù.
enableHints ¸Þ¼Òµå´Â º¯¼öÀΠžÄÁÅ×À̳ÊÀÇ ¸ðµç Ç׸ñ, ÇϺÎÇ׸ñ, ¸Þ´º¿ä¼Ò µî¿¡ ´ëÇÑ ¸¶¿ì½º °¨Áö±â·Î MouseOverHintManager¸¦ Ãß°¡ÇÑ´Ù.
mouseEntered ¸Þ¼Òµå´Â ¸¶¿ì½º Æ÷ÀÎÅͰ¡ Ç׸ñÀ» °¡¸®Å°¸é ¸Ê¿¡¼ ÇØ´çµÇ´Â ¼³¸íÀ» ã¾Æ JLabel¿¡ »Ñ·ÁÁØ´Ù. mouseExited ¸Þ¼Òµå´Â JLabelÀ» ºñ¿ö ¼³¸íÀ» Á¦°ÅÇÑ´Ù.
Æ®¸¯
»óÅÂÇ¥½ÃÁÙ ¼³¸í°ú °ü·ÃµÈ ¸î°¡Áö °£´ÜÇÑ Æ®¸¯ÀÌ ÀÖ´Ù.
¿ì¼± mouseEntered ¸Þ¼Òµå´Â ¡®À̺¥Æ®¸¦ »ý¼ºÇÏ´Â Ç׸ñ¡¯ÀÇ ¼³¸íÀ» ¹Þ´Â´Ù´Â Á¡À» ÀÌ¿ëÇÑ´Ù. mouseEntered´Â ÇØ´ç Ç׸ñ¿¡ ´ëÀÀÇÏ´Â ¼³¸íÀÌ ¾øÀ¸¸é »óÀ§ Ç׸ñÀ» È®ÀÎÇÑ´Ù. ÀÌ ÇÁ·Î¼¼½º´Â ÃÖ»óÀ§ Ç׸ñ¿¡ µµ´ÞÇϰųª ¼³¸íÀÌ ¹ß°ßµÉ ¶§±îÁö °è¼ÓµÈ´Ù. ÀÌ Æ¯¼ºÀ» ÀÌ¿ëÇØ ÆÐ³Î°ú °°Àº ÇϳªÀÇ ÄÁÅ×À̳ʿ¡ ´ëÇØ ÇÏÀ§ ¸ðµç ¿ä¼ÒµéÀÌ °°Àº ¼³¸íÀ» °øÀ¯Çϵµ·Ï Çϰųª, ¶Ç´Â »óÀ§ Ç׸ñ°ú ÇÏÀ§ Ç׸ñ¿¡ ´ëÇØ ¼·Î ´Ù¸¥ ¼³¸íÀ» ¼³Á¤ÇÒ ¼ö ÀÖ´Ù.
¶Ç´Ù¸¥ Æ®¸¯Àº getHintFor ¸Þ¼Òµå´Ù. mouseEntered´Â Ç׸ñ¿¡ ´ëÇÑ ¼³¸íÀ» ¹Þ±âÀ§ÇØ getHintFor¸¦ È£ÃâÇÑ´Ù. ±×·±µ¥ º¯¼ö·Î ³Ñ°Ü¹ÞÀº Ç׸ñ¿¡ ¼³¸íÀÌ Á¸ÀçÇÏÁö ¾Ê´Â °æ¿ì, getHintFor´Â ¸î°¡Áö Ưº°ÇÑ °æ¿ì¸¦ üũÇÑ´Ù. ¹®Á¦ÀÇ Ç׸ñÀÌ JLabel, ¶Ç´Â JTableHeaderÀÏ °æ¿ì, getHintFor ¸Þ¼Òµå´Â °¢°¢ JLabelÀÌ ºÙ¿©Áø ¼³¸í°ú Jtable ¼³¸íÀ» ¸®ÅÏÇÑ´Ù. Áï Ç׸ñ°ú ¶óº§¿¡ ´ëÇØ º°µµ·Î µÎ ¹ø ¼³¸íÀ» ¼³Á¤ÇÒ Çʿ䰡 ¾ø´Â °ÍÀÌ´Ù. °¢ÀÚ ¼·Î ´Ù¸¥ Ç׸ñÀ¸·Î º¸¿©Áö´Â °æ¿ì¶óµµ ¸¶Âù°¡Áö´Ù.
¼³¸íÀ» ³ÖÀÚ
MouseOverHintDemo(¼Ò½ºº¸±â2)´Â MouseOverHintManager Ŭ·¡½º »ç¿ë¿¡ ´ëÇÑ °£´ÜÇÑ ¿¹·Î, »óÅÂÇ¥½ÃÁÙÀÌ ÀÖ´Â JFrameÀ» »ý¼ºÇÑ´Ù. ÀÌ JFrameÀº °¡Àå ÈçÈ÷ »ç¿ëµÇ´Â ½ºÀ® ¿ä¼Ò ¹× ¼³¸íÀ» º¸¿©ÁØ´Ù.
| |
import java.awt.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
class MouseOverHintDemo {
public static void main( String[] args ) {
JLabel hintBar = new JLabel(" ");
MouseOverHintManager hintManager = new MouseOverHintManager(hintBar);
JFrame frame = new JFrame("MouseOverHintDemo");
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
JMenuBar menuBar = new JMenuBar();
JMenu menu = new JMenu("File");
JMenuItem item1 = new JMenuItem("Load");
JMenuItem item2 = new JMenuItem("Save");
JMenuItem item3 = new JMenuItem("Exit");
Box mainPanel = Box.createVerticalBox();
JButton button = new JButton("Apply");
JCheckBox checkBox = new JCheckBox("Disable hints");
JLabel label = new JLabel("Backup strategy");
JComboBox comboBox = new JComboBox(new String[] {"Always","Just the last","Never"});
JFormattedTextField formattedText = new JFormattedTextField(new Date());
Box radioPanel = Box.createVerticalBox();
ButtonGroup radioGroup = new ButtonGroup();
JRadioButton radio1 = new JRadioButton("left");
JRadioButton radio2 = new JRadioButton("right");
JTable table = new JTable(new String[][] {{"Copy","Ctrl+C"},{"Paste","Ctrl+V"},{"Cut","Ctrl+X"}}, new String[] {"Action","Shortcut"});
hintManager.addHintFor( item1, "Loads a new file" );
hintManager.addHintFor( item2, "Saves the current file" );
hintManager.addHintFor( item3, "Exits the application" );
hintManager.addHintFor( button, "Apply any changes made" );
hintManager.addHintFor( checkBox, "Turns off the display of hints" );
hintManager.addHintFor( comboBox, "Selects how many backups to make" );
hintManager.addHintFor( formattedText, "Enters the date for next run" );
hintManager.addHintFor( radioPanel, "Selects the position for application's toolbar" );
hintManager.addHintFor( table, "Shortcuts for each application's action" );
frame.setJMenuBar( menuBar );
menuBar.add( menu );
menu.add( item1 );
menu.add( item2 );
menu.add( item3 );
frame.getContentPane().add( mainPanel, BorderLayout.CENTER );
mainPanel.add( Box.createVerticalStrut(5) );
mainPanel.add( button );
mainPanel.add( Box.createVerticalStrut(5) );
mainPanel.add( checkBox );
mainPanel.add( Box.createVerticalStrut(5) );
mainPanel.add( label );
label.setLabelFor( comboBox );
mainPanel.add( comboBox );
mainPanel.add( Box.createVerticalStrut(5) );
mainPanel.add( formattedText );
mainPanel.add( Box.createVerticalStrut(5) );
radioGroup.add( radio1 );
radioGroup.add( radio2 );
radioPanel.setBorder( BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),"Toolbar") );
radioPanel.add( radio1 );
radioPanel.add( radio2 );
mainPanel.add( radioPanel );
mainPanel.add( Box.createVerticalStrut(5) );
mainPanel.add( table.getTableHeader() );
mainPanel.add( table );
mainPanel.add( Box.createVerticalStrut(5) );
hintBar.setBorder( BorderFactory.createLoweredBevelBorder() );
frame.getContentPane().add( hintBar, BorderLayout.SOUTH );
frame.pack();
hintManager.enableHints( frame );
frame.setVisible( true );
}
} | |
 |
ÀÌ ¿¹Á¦´Â ´Ü¼ø¸í·áÇÏ´Ù. »ç¿ëÀÚ ÀÎÅÍÆäÀ̽ºÀÇ ¸ðµç Ç׸ñÀ» »ý¼ºÇϰí À̵鿡 ´ëÇØ ¼³¸íÀ» ¼³Á¤ÇÑ ÈÄ ¾ÖÇø®ÄÉÀÌ¼Ç À©µµ¿ì¸¦ ¸¸µé°í ouseOverHintManager.enableHints¸¦ È£ÃâÇÑ´Ù. À¯ÀÇÇÒ Á¡Àº À¯Àú ÀÎÅÍÆäÀ̽º¸¦ ±¸¼ºÇÑ ÈÄ¿¡ ³¡À¸·Î enableHints¸¦ È£ÃâÇØ¾ß enableHints°¡ ¸ðµç Ç׸ñ¿¡ ´ëÇÑ ¸¶¿ì½º °¨Áö±â·Î µî·ÏµÈ´Ù´Â °ÍÀÌ´Ù. ÀÌ·¸°Ô ÇØ¾ß MouseOverHintManager°¡ ¸ðµç Ç׸ñÀÇ ¸¶¿ì½º À̺¥Æ®¸¦ Á¢¼öÇØ °¢°¢¿¡ ÇØ´çÇÏ´Â ¼³¸íÀ» ¼±ÅÃÇÒ ¼ö ÀÖ´Ù.
¼Ò½ºÄÚµå2 ¿¹Á¦¸¦ ½ÇÇàÇÏ¸é ¸î°¡Áö Á¶Àý±â´ÉÀ» °®Ãá °£´ÜÇÑ À©µµ¿ì°¡ ¶á´Ù. Ç׸ñ°ú ¸Þ´º À§·Î ¸¶¿ì½º¸¦ ¿òÁ÷ÀÌ¸é¼ »óÅÂÇ¥½ÃÁÙ¿¡ °¢°¢¿¡ ÇØ´çµÇ´Â ¼³¸íÀÌ ³ªÅ¸³ª´ÂÁö È®ÀÎÇØ º¸ÀÚ. 2°³ÀÇ ¶óµð¿À ¹öư¿¡ ´ëÇØ¼´Â °°Àº ¼³¸íÀÌ Ç¥½ÃµÇ´Âµ¥, ÀÌ´Â »óÀ§ ÆÐ³Î¿¡¼ ¼³¸íÀ» ¼³Á¤Ç߱⠶§¹®ÀÌ´Ù.
±â´É¿¡ ´ëÇÑ ¼³¸íÀº ¾ÖÇø®ÄÉÀÌ¼Ç »ç¿ëÀ» ½±°Ô ÇÑ´Ù´Â Á¡¿¡¼ Áß¿äÇÑ ºÎºÐÀÌ´Ù. ½ºÀ® ÅøÆÁÀÇ ´ë¾ÈÀÎ »óÅÂÇ¥½ÃÁÙ ¼³¸í ¹æ¹ýÀº Àû¿ëÇϱ⵵ ½±´Ù. »ç¿ëÀÚµéÀº °áÄÚ ¸Þ´º¾óÀ» º¸Áö ¾Ê±â ¶§¹®¿¡ ÇÁ·Î±×·¥À» »ç¿ëÇϱ⠽±°í Á÷°üÀûÀ¸·Î ÀÌ¿ëÇÒ ¼ö ÀÖµµ·Ï ¸¸µé¾î¾ß ÇÏ´Â °ÍÀÌ °³¹ßÀÚµéÀÇ ÀÓ¹«Áö¸¸, ÀÚ¹Ù GUI¸¦ »ç¿ëÇÏ´Â °æ¿ì¶ó¸é »ó±âÇÑ »óÅÂÇ¥½ÃÁÙ ¼³¸íÀ̶ó´Â °£´ÜÇÑ µµ¿ò±â´ÉÀ» ³ÖÀ» ¼ö ÀÖÀ» °ÍÀÌ´Ù. @