Created
December 6, 2013 23:16
-
-
Save resarahadian/7833810 to your computer and use it in GitHub Desktop.
Membuat Tombol Close TabbedPane
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.awt.BasicStroke; | |
import java.awt.Color; | |
import java.awt.Component; | |
import java.awt.Cursor; | |
import java.awt.Graphics; | |
import java.awt.Graphics2D; | |
import java.awt.Rectangle; | |
import java.awt.event.MouseEvent; | |
import java.awt.event.MouseListener; | |
import java.awt.event.MouseMotionListener; | |
import javax.swing.*; | |
@SuppressWarnings("serial") | |
public class ClExitTab extends JTabbedPane{ | |
private TabCloseUI closeUI = new TabCloseUI(this); | |
public void paint(Graphics g){ | |
super.paint(g); | |
closeUI.paint(g); | |
} | |
public void addTab(String title, Component component) { | |
super.addTab(title+" ", component); | |
} | |
public String getTabTitleAt(int index) { | |
return super.getTitleAt(index).trim(); | |
} | |
private class TabCloseUI implements MouseListener, MouseMotionListener { | |
private ClExitTab tabbedPane; | |
private int closeX = 0 ,closeY = 0, meX = 0, meY = 0; | |
private int selectedTab; | |
private final int width = 8, height = 8; | |
private Rectangle rectangle = new Rectangle(0,0,width, height); | |
@SuppressWarnings("unused") | |
private TabCloseUI(){} | |
public TabCloseUI(ClExitTab pane) { | |
tabbedPane = pane; | |
tabbedPane.addMouseMotionListener(this); | |
tabbedPane.addMouseListener(this); | |
} | |
public void mouseEntered(MouseEvent me) {} | |
public void mouseExited(MouseEvent me) {} | |
public void mousePressed(MouseEvent me) {} | |
public void mouseClicked(MouseEvent me) {} | |
public void mouseDragged(MouseEvent me) {} | |
public void mouseReleased(MouseEvent me) { | |
if(closeUnderMouse(me.getX(), me.getY())){ | |
boolean isToCloseTab = tabAboutToClose(selectedTab); | |
if (isToCloseTab && selectedTab > -1){ | |
tabbedPane.removeTabAt(selectedTab); | |
} | |
selectedTab = tabbedPane.getSelectedIndex(); | |
} | |
} | |
public void mouseMoved(MouseEvent me) { | |
meX = me.getX(); | |
meY = me.getY(); | |
if(mouseOverTab(meX, meY)){ | |
controlCursor(); | |
tabbedPane.repaint(); | |
} | |
} | |
private void controlCursor() { | |
if(tabbedPane.getTabCount()>0) | |
if(closeUnderMouse(meX, meY)){ | |
tabbedPane.setCursor(new Cursor(Cursor.HAND_CURSOR)); | |
if(selectedTab > -1) | |
tabbedPane.setToolTipTextAt(selectedTab, "Close " +tabbedPane.getTitleAt(selectedTab)); | |
} | |
else{ | |
tabbedPane.setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); | |
if(selectedTab > -1) | |
tabbedPane.setToolTipTextAt(selectedTab,""); | |
} | |
} | |
private boolean closeUnderMouse(int x, int y) { | |
rectangle.x = closeX; | |
rectangle.y = closeY; | |
return rectangle.contains(x,y); | |
} | |
public void paint(Graphics g) { | |
int tabCount = tabbedPane.getTabCount(); | |
for(int j = 0; j < tabCount; j++) | |
if(tabbedPane.getComponent(j).isShowing()){ | |
int x = tabbedPane.getBoundsAt(j).x + tabbedPane.getBoundsAt(j).width -width-5; | |
int y = tabbedPane.getBoundsAt(j).y +5; | |
drawClose(g,x,y); | |
break; | |
} | |
if(mouseOverTab(meX, meY)){ | |
drawClose(g,closeX,closeY); | |
} | |
} | |
private void drawClose(Graphics g, int x, int y) { | |
if(tabbedPane != null && tabbedPane.getTabCount() > 0){ | |
Graphics2D g2 = (Graphics2D)g; | |
drawColored(g2, isUnderMouse(x,y)? Color.RED : Color.WHITE, x, y); | |
} | |
} | |
private void drawColored(Graphics2D g2, Color color, int x, int y) { | |
g2.setStroke(new BasicStroke(5,BasicStroke.JOIN_ROUND,BasicStroke.CAP_ROUND)); | |
g2.setColor(Color.BLACK); | |
g2.drawLine(x, y, x + width, y + height); | |
g2.drawLine(x + width, y, x, y + height); | |
g2.setColor(color); | |
g2.setStroke(new BasicStroke(3, BasicStroke.JOIN_ROUND, BasicStroke.CAP_ROUND)); | |
g2.drawLine(x, y, x + width, y + height); | |
g2.drawLine(x + width, y, x, y + height); | |
} | |
private boolean isUnderMouse(int x, int y) { | |
if(Math.abs(x-meX)<width && Math.abs(y-meY)<height ) | |
return true; | |
return false; | |
} | |
private boolean mouseOverTab(int x, int y) { | |
int tabCount = tabbedPane.getTabCount(); | |
for(int j = 0; j < tabCount; j++) | |
if(tabbedPane.getBoundsAt(j).contains(meX, meY)){ | |
selectedTab = j; | |
closeX = tabbedPane.getBoundsAt(j).x + tabbedPane.getBoundsAt(j).width -width-5; | |
closeY = tabbedPane.getBoundsAt(j).y +5; | |
return true; | |
} | |
return false; | |
} | |
} | |
public boolean tabAboutToClose(int tabIndex) { | |
return true; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.awt.EventQueue; | |
import java.awt.event.ActionEvent; | |
import java.awt.event.ActionListener; | |
import javax.swing.JFrame; | |
import javax.swing.JPanel; | |
import javax.swing.border.EmptyBorder; | |
import javax.swing.ImageIcon; | |
import javax.swing.JLabel; | |
import javax.swing.JMenuBar; | |
import javax.swing.JMenu; | |
import javax.swing.JMenuItem; | |
import javax.swing.UIManager; | |
@SuppressWarnings("serial") | |
public class frameExitTab extends JFrame { | |
private JPanel contentPane; | |
private JMenuBar menuBar; | |
private JMenu mnFile; | |
private JMenuItem tabBaru; | |
private JMenuItem miDeleteTab; | |
private JPanel panel1; | |
ImageIcon iconTab; | |
private JLabel lblWall; | |
private ClExitTab tabbedPane; | |
/** | |
* Create the frame. | |
*/ | |
public frameExitTab() { | |
setTitle("Exit Button TabbedPane"); | |
setResizable(false); | |
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); | |
setBounds(100, 100, 756, 501); | |
menuBar = new JMenuBar(); | |
setJMenuBar(menuBar); | |
mnFile = new JMenu("File"); | |
menuBar.add(mnFile); | |
tabBaru = new JMenuItem("New Tab"); | |
tabBaru.setIcon(new ImageIcon("/home/resa/Aplikasi Java/SwingJava/src/exitButtonTab/newTab.png")); | |
tabBaru.addActionListener(new exitButtonTabAct()); | |
mnFile.add(tabBaru); | |
miDeleteTab = new JMenuItem("Delete Tab"); | |
miDeleteTab.setIcon(new ImageIcon("/home/resa/Aplikasi Java/SwingJava/src/exitButtonTab/deleteTab.png")); | |
miDeleteTab.addActionListener(new exitButtonTabAct()); | |
mnFile.add(miDeleteTab); | |
contentPane = new JPanel(); | |
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); | |
setContentPane(contentPane); | |
contentPane.setLayout(null); | |
tabbedPane = new ClExitTab(); | |
tabbedPane.setBounds(0, 0, 754, 470); | |
contentPane.add(tabbedPane); | |
iconTab = new ImageIcon("src/exitButtonTab/newTab.png"); | |
panel1 = new JPanel(); | |
tabbedPane.addTab("New tab", iconTab, panel1, null); | |
panel1.setLayout(null); | |
lblWall = new JLabel(""); | |
lblWall.setIcon(new ImageIcon("/home/resa/Aplikasi Java/SwingJava/src/exitButtonTab/wall.jpg")); | |
lblWall.setBounds(0, -14, 754, 434); | |
panel1.add(lblWall); | |
setLocationRelativeTo(null); | |
} | |
public class exitButtonTabAct implements ActionListener | |
{ | |
@Override | |
public void actionPerformed(ActionEvent act) { | |
// TODO Auto-generated method stub | |
String tab = act.getActionCommand(); | |
if(tab.equals("New Tab")) | |
{ | |
tab = "New Tab"; | |
if(!tab.equals("")) | |
{ | |
JPanel panel2 = new JPanel(); | |
JLabel lbl = new JLabel(); | |
lbl.setIcon(new ImageIcon("/home/resa/Aplikasi Java/SwingJava/src/exitButtonTab/wall.jpg")); | |
panel2.add(lbl); | |
tabbedPane.addTab("New tab", iconTab, panel2, null); | |
} | |
} | |
else if(tab.equals("Delete Tab")) | |
{ | |
tabbedPane.remove(tabbedPane.getTabCount()-1); | |
} | |
} | |
} | |
/** | |
* Launch the application. | |
*/ | |
public static void main(String[] args) { | |
EventQueue.invokeLater(new Runnable() { | |
public void run() { | |
try { | |
UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"); | |
frameExitTab frame = new frameExitTab(); | |
frame.setVisible(true); | |
} catch (Exception e) { | |
e.printStackTrace(); | |
} | |
} | |
}); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment