123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- package holeg.ui.view.component;
- import java.awt.BasicStroke;
- import java.awt.Color;
- import java.awt.Component;
- import java.awt.Dimension;
- import java.awt.FlowLayout;
- import java.awt.Graphics;
- import java.awt.Graphics2D;
- import java.awt.event.ActionEvent;
- import java.awt.event.ActionListener;
- import java.awt.event.MouseAdapter;
- import java.awt.event.MouseEvent;
- import java.awt.event.MouseListener;
- import javax.swing.AbstractButton;
- import javax.swing.BorderFactory;
- import javax.swing.JButton;
- import javax.swing.JLabel;
- import javax.swing.JPanel;
- import javax.swing.JTabbedPane;
- import javax.swing.plaf.basic.BasicButtonUI;
- /**
- * Component to be used as tabComponent; Contains a JLabel to show the text and a JButton to close
- * the tab it belongs to
- */
- public class ButtonTabComponent extends JPanel {
- private final static MouseListener buttonMouseListener = new MouseAdapter() {
- public void mouseEntered(MouseEvent e) {
- Component component = e.getComponent();
- if (component instanceof AbstractButton button) {
- button.setBorderPainted(true);
- }
- }
- public void mouseExited(MouseEvent e) {
- Component component = e.getComponent();
- if (component instanceof AbstractButton button) {
- button.setBorderPainted(false);
- }
- }
- };
- private final JTabbedPane pane;
- public ButtonTabComponent(final JTabbedPane pane) {
- // unset default FlowLayout' gaps
- super(new FlowLayout(FlowLayout.LEFT, 0, 0));
- if (pane == null) {
- throw new NullPointerException("TabbedPane is null");
- }
- this.pane = pane;
- setOpaque(false);
- // make JLabel read titles from JTabbedPane
- JLabel label = new JLabel() {
- public String getText() {
- int i = pane.indexOfTabComponent(ButtonTabComponent.this);
- if (i != -1) {
- return pane.getTitleAt(i);
- }
- return null;
- }
- };
- add(label);
- // add more space between the label and the button
- label.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 5));
- // tab button
- JButton button = new TabButton();
- add(button);
- // add more space to the top of the component
- setBorder(BorderFactory.createEmptyBorder(2, 0, 0, 0));
- }
- /**
- * removes both Tabs
- */
- public void removeTabs() {
- int i = pane.indexOfTabComponent(ButtonTabComponent.this);
- if (i != -1) {
- pane.remove(i);
- }
- }
- private class TabButton extends JButton implements ActionListener {
- public TabButton() {
- int size = 17;
- setPreferredSize(new Dimension(size, size));
- setToolTipText("close this tab");
- // Make the button looks the same for all Laf's
- setUI(new BasicButtonUI());
- // Make it transparent
- setContentAreaFilled(false);
- // No need to be focusable
- setFocusable(false);
- setBorder(BorderFactory.createEtchedBorder());
- setBorderPainted(false);
- // Making nice rollover effect
- // we use the same listener for all buttons
- addMouseListener(buttonMouseListener);
- setRolloverEnabled(true);
- // Close the proper tab by clicking the button
- addActionListener(this);
- }
- public void actionPerformed(ActionEvent e) {
- removeTabs();
- }
- // we don't want to update UI for this button
- public void updateUI() {
- }
- // paint the cross
- protected void paintComponent(Graphics g) {
- super.paintComponent(g);
- Graphics2D g2 = (Graphics2D) g.create();
- // shift the image for pressed buttons
- if (getModel().isPressed()) {
- g2.translate(1, 1);
- }
- g2.setStroke(new BasicStroke(2));
- g2.setColor(Color.BLACK);
- if (getModel().isRollover()) {
- g2.setColor(Color.MAGENTA);
- }
- int delta = 6;
- g2.drawLine(delta, delta, getWidth() - delta - 1, getHeight() - delta - 1);
- g2.drawLine(getWidth() - delta - 1, delta, delta, getHeight() - delta - 1);
- g2.dispose();
- }
- }
- }
|