package dev.kske.chess.ui; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.*; import javax.swing.plaf.basic.BasicButtonUI; /** * Renders the title and the closing button of a {@link JTabbedPane}.
*
* Project: Chess
* File: GameTabComponent.java
* Created: 11 Dec 2019
* * @author Kai S. K. Engelbart */ public class GameTabComponent extends JPanel { private final JTabbedPane tabbedPane; private static final long serialVersionUID = 9022979950018125935L; /** * Creates an instance of {@link GameTabComponent}. * * @param tabbedPane the tabbed pane which contains this * {@link GameTabComponent} */ public GameTabComponent(JTabbedPane tabbedPane) { super(new FlowLayout(FlowLayout.LEFT, 0, 0)); if (tabbedPane == null) throw new NullPointerException("TabbedPane is null"); this.tabbedPane = tabbedPane; // Create title JLabel JLabel label = new JLabel() { private static final long serialVersionUID = 7902391411509551586L; @Override public String getText() { int i = tabbedPane.indexOfTabComponent(GameTabComponent.this); return i != -1 ? tabbedPane.getTitleAt(i) : ""; } }; label.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 5)); add(label); // Create close JButton add(new TabButton()); setBorder(BorderFactory.createEmptyBorder(2, 0, 0, 0)); } private class TabButton extends JButton { private static final long serialVersionUID = -2757857832337636731L; public TabButton() { final int size = 17; setPreferredSize(new Dimension(size, size)); setToolTipText("Close this tab"); setUI(new BasicButtonUI()); setContentAreaFilled(false); setFocusable(false); setBorder(BorderFactory.createEtchedBorder()); setBorderPainted(false); addMouseListener(new MouseAdapter() { @Override public void mouseEntered(MouseEvent evt) { setBorderPainted(true); } @Override public void mouseExited(MouseEvent evt) { setBorderPainted(false); } }); setRolloverEnabled(true); addActionListener(evt -> { int i = tabbedPane.indexOfTabComponent(GameTabComponent.this); if (i != -1) tabbedPane.remove(i); }); } @Override public void updateUI() {} @Override public 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); final 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(); } } }