mirror of
https://github.com/JFormDesigner/FlatLaf.git
synced 2026-02-11 22:47:13 -06:00
TabbedPane: support closable tabs (issue #40)
This commit is contained in:
@@ -18,9 +18,12 @@ package com.formdev.flatlaf.testing;
|
||||
|
||||
import static com.formdev.flatlaf.FlatClientProperties.*;
|
||||
import java.awt.*;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.util.function.BiConsumer;
|
||||
import javax.swing.*;
|
||||
import javax.swing.border.*;
|
||||
import com.formdev.flatlaf.FlatLaf;
|
||||
import com.formdev.flatlaf.extras.TriStateCheckBox;
|
||||
import com.formdev.flatlaf.icons.FlatInternalFrameCloseIcon;
|
||||
import com.formdev.flatlaf.util.ScaledImageIcon;
|
||||
import com.jgoodies.forms.layout.*;
|
||||
@@ -49,6 +52,9 @@ public class FlatContainerTest
|
||||
addInitialTabs( tabbedPane1, tabbedPane2, tabbedPane3, tabbedPane4 );
|
||||
initialTabCount = tabbedPane1.getTabCount();
|
||||
|
||||
tabsClosableCheckBox.setSelected( true );
|
||||
tabsClosableChanged();
|
||||
|
||||
tabScrollCheckBox.setSelected( true );
|
||||
tabScrollChanged();
|
||||
}
|
||||
@@ -236,10 +242,7 @@ public class FlatContainerTest
|
||||
case "arrowButtons": value = TABBED_PANE_HIDDEN_TABS_NAVIGATION_ARROW_BUTTONS; break;
|
||||
}
|
||||
|
||||
tabbedPane1.putClientProperty( TABBED_PANE_HIDDEN_TABS_NAVIGATION, value );
|
||||
tabbedPane2.putClientProperty( TABBED_PANE_HIDDEN_TABS_NAVIGATION, value );
|
||||
tabbedPane3.putClientProperty( TABBED_PANE_HIDDEN_TABS_NAVIGATION, value );
|
||||
tabbedPane4.putClientProperty( TABBED_PANE_HIDDEN_TABS_NAVIGATION, value );
|
||||
putTabbedPanesClientProperty( TABBED_PANE_HIDDEN_TABS_NAVIGATION, value );
|
||||
}
|
||||
|
||||
private void tabBackForegroundChanged() {
|
||||
@@ -270,6 +273,32 @@ public class FlatContainerTest
|
||||
}
|
||||
}
|
||||
|
||||
private void tabsClosableChanged() {
|
||||
boolean closable = tabsClosableCheckBox.isSelected();
|
||||
putTabbedPanesClientProperty( TABBED_PANE_TAB_CLOSABLE, closable ? true : null );
|
||||
|
||||
if( closable ) {
|
||||
putTabbedPanesClientProperty( TABBED_PANE_TAB_CLOSE_CALLBACK,
|
||||
(BiConsumer<JTabbedPane, Integer>) (tabbedPane, tabIndex) -> {
|
||||
AWTEvent e = EventQueue.getCurrentEvent();
|
||||
int modifiers = (e instanceof MouseEvent) ? ((MouseEvent)e).getModifiers() : 0;
|
||||
JOptionPane.showMessageDialog( this, "Closed tab '" + tabbedPane.getTitleAt( tabIndex ) + "'."
|
||||
+ "\n\n(modifiers: " + MouseEvent.getMouseModifiersText( modifiers ) + ")",
|
||||
"Tab Closed", JOptionPane.PLAIN_MESSAGE );
|
||||
} );
|
||||
}
|
||||
}
|
||||
|
||||
private void secondTabClosableChanged() {
|
||||
Boolean value = secondTabClosableCheckBox.getValue();
|
||||
|
||||
JTabbedPane[] tabbedPanes = new JTabbedPane[] { tabbedPane1, tabbedPane2, tabbedPane3, tabbedPane4 };
|
||||
for( JTabbedPane tabbedPane : tabbedPanes ) {
|
||||
Component c = tabbedPane.getComponentAt( 1 );
|
||||
((JComponent)c).putClientProperty( TABBED_PANE_TAB_CLOSABLE, value );
|
||||
}
|
||||
}
|
||||
|
||||
private void initComponents() {
|
||||
// JFormDesigner - Component initialization - DO NOT MODIFY //GEN-BEGIN:initComponents
|
||||
JPanel panel9 = new JPanel();
|
||||
@@ -306,6 +335,8 @@ public class FlatContainerTest
|
||||
tabBackForegroundCheckBox = new JCheckBox();
|
||||
leadingComponentCheckBox = new JCheckBox();
|
||||
trailingComponentCheckBox = new JCheckBox();
|
||||
tabsClosableCheckBox = new JCheckBox();
|
||||
secondTabClosableCheckBox = new TriStateCheckBox();
|
||||
CellConstraints cc = new CellConstraints();
|
||||
|
||||
//======== this ========
|
||||
@@ -518,6 +549,16 @@ public class FlatContainerTest
|
||||
trailingComponentCheckBox.setText("Trailing");
|
||||
trailingComponentCheckBox.addActionListener(e -> trailingComponentChanged());
|
||||
panel14.add(trailingComponentCheckBox, "cell 1 3");
|
||||
|
||||
//---- tabsClosableCheckBox ----
|
||||
tabsClosableCheckBox.setText("Tabs closable");
|
||||
tabsClosableCheckBox.addActionListener(e -> tabsClosableChanged());
|
||||
panel14.add(tabsClosableCheckBox, "cell 2 3");
|
||||
|
||||
//---- secondTabClosableCheckBox ----
|
||||
secondTabClosableCheckBox.setText("Second Tab closable");
|
||||
secondTabClosableCheckBox.addActionListener(e -> secondTabClosableChanged());
|
||||
panel14.add(secondTabClosableCheckBox, "cell 3 3");
|
||||
}
|
||||
panel9.add(panel14, cc.xywh(1, 11, 3, 1));
|
||||
}
|
||||
@@ -545,6 +586,8 @@ public class FlatContainerTest
|
||||
private JCheckBox tabBackForegroundCheckBox;
|
||||
private JCheckBox leadingComponentCheckBox;
|
||||
private JCheckBox trailingComponentCheckBox;
|
||||
private JCheckBox tabsClosableCheckBox;
|
||||
private TriStateCheckBox secondTabClosableCheckBox;
|
||||
// JFormDesigner - End of variables declaration //GEN-END:variables
|
||||
|
||||
//---- class Tab1Panel ----------------------------------------------------
|
||||
|
||||
@@ -327,6 +327,26 @@ new FormModel {
|
||||
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||
"value": "cell 1 3"
|
||||
} )
|
||||
add( new FormComponent( "javax.swing.JCheckBox" ) {
|
||||
name: "tabsClosableCheckBox"
|
||||
"text": "Tabs closable"
|
||||
auxiliary() {
|
||||
"JavaCodeGenerator.variableLocal": false
|
||||
}
|
||||
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "tabsClosableChanged", false ) )
|
||||
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||
"value": "cell 2 3"
|
||||
} )
|
||||
add( new FormComponent( "com.formdev.flatlaf.extras.TriStateCheckBox" ) {
|
||||
name: "secondTabClosableCheckBox"
|
||||
"text": "Second Tab closable"
|
||||
auxiliary() {
|
||||
"JavaCodeGenerator.variableLocal": false
|
||||
}
|
||||
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "secondTabClosableChanged", false ) )
|
||||
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||
"value": "cell 3 3"
|
||||
} )
|
||||
}, new FormLayoutConstraints( class com.jgoodies.forms.layout.CellConstraints ) {
|
||||
"gridY": 11
|
||||
"gridWidth": 3
|
||||
|
||||
@@ -284,6 +284,18 @@ TabbedPane.focusColor=#ddd
|
||||
TabbedPane.tabSeparatorColor=#00f
|
||||
TabbedPane.contentAreaColor=#bbb
|
||||
|
||||
TabbedPane.closeSize=16,16
|
||||
TabbedPane.closeArc=999
|
||||
TabbedPane.closeCrossPlainSize={float}12
|
||||
TabbedPane.closeCrossFilledSize={float}6.5
|
||||
TabbedPane.closeCrossLineWidth={float}2
|
||||
#TabbedPane.closeBackground=#faa
|
||||
TabbedPane.closeForeground=#f00
|
||||
TabbedPane.closeHoverBackground=#a00
|
||||
TabbedPane.closeHoverForeground=#fff
|
||||
TabbedPane.closePressedBackground=#0f0
|
||||
TabbedPane.closePressedForeground=#000
|
||||
|
||||
|
||||
#---- Table ----
|
||||
|
||||
|
||||
Reference in New Issue
Block a user