我正在用Substance LAF做一些实验,并且试图删除选项卡之间的填充。对于默认的ui,我使用了:
UIManager.getDefaults().put("TabbedPane.contentBorderInsets", new Insets(0,0,0,0));
UIManager.getDefaults().put("TabbedPane.tabsOverlapBorder", true);
,但这不适用于Substance,似乎提供了它自己的值。如何用物质达到相同的效果。
最佳答案
使用JTabbedPane的UIManager无法覆盖此值,
这是一个非常普遍的问题,即大多数方法都受到保护(无论它们是否作为UIManager中的键发布)都没有覆盖自己的BasicTabbedPaneUI
物质
javax.swing.plaf.InsetsUIResource[top=4,left=4,bottom=4,right=4]
false
金属(跨平台)
java.awt.Insets[top=4,left=2,bottom=3,right=3]
false
雨云
null
null
系统(Java6上的win8)
javax.swing.plaf.InsetsUIResource[top=2,left=2,bottom=3,right=3]
true
键的值是否采用
Instets(0,0,0,0)
或InsetsUIResource(0,0,0,0)的形式都没关系基里尔制作的修改后的代码
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import org.pushingpixels.substance.api.DecorationAreaType;
import org.pushingpixels.substance.api.SubstanceLookAndFeel;
import org.pushingpixels.substance.api.skin.BusinessBlueSteelSkin;
import org.pushingpixels.substance.api.skin.OfficeBlack2007Skin;
import org.pushingpixels.substance.api.skin.OfficeBlue2007Skin;
/**
* Test application that shows the use of the
* {@link SubstanceLookAndFeel#getDecorationType(java.awt.Component)} API called
* on different components.
*
* @author Kirill Grouchnikov
* @see SubstanceLookAndFeel#getDecorationType(java.awt.Component)
*/
public class GetDecorationType /*extends JFrame*/ {
private static final long serialVersionUID = 1L;
private static JFrame frame = new JFrame();
/**
* Creates the main frame for
* <code>this</code> sample.
*/
public GetDecorationType() {
frame.setTitle("Get decoration type");
frame.setLayout(new BorderLayout());
final JTabbedPane tabs = new JTabbedPane();
SubstanceLookAndFeel.setDecorationType(tabs, DecorationAreaType.HEADER);
JPanel tab1 = new JPanel(new FlowLayout());
tab1.add(new JTextField("sample"));
final JComboBox combo = new JComboBox(new Object[]{"sample"});
tab1.add(combo);
SubstanceLookAndFeel.setDecorationType(tab1, DecorationAreaType.GENERAL);
JPanel tab2 = new JPanel(new FlowLayout());
tab2.add(new JTextField("sample2"));
tab2.add(new JComboBox(new Object[]{"sample2"}));
SubstanceLookAndFeel.setDecorationType(tab2, DecorationAreaType.GENERAL);
tabs.addTab("tab1", tab1);
tabs.addTab("tab2", tab2);
frame.add(tabs, BorderLayout.CENTER);
JPanel controlPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
JButton getTypes = new JButton("Get types");
getTypes.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
DecorationAreaType tabsType = SubstanceLookAndFeel.getDecorationType(tabs);
DecorationAreaType comboType = SubstanceLookAndFeel.getDecorationType(combo);
JOptionPane.showMessageDialog(frame, "Tabbed pane: " + tabsType.getDisplayName()
+ "\n" + "Combo box: " + comboType.getDisplayName());
}
});
}
});
controlPanel.add(getTypes);
frame.add(controlPanel, BorderLayout.SOUTH);
frame.setSize(400, 200);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
/**
* The main method for
* <code>this</code> sample. The arguments are ignored.
*
* @param args Ignored.
*/
public static void main(String[] args) {
JFrame.setDefaultLookAndFeelDecorated(true);
JDialog.setDefaultLookAndFeelDecorated(true);
try {
for (UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
UIManager.setLookAndFeel(info.getClassName());
break;
}
}
/*UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());*/
} catch (Exception e) {
return;
}
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
//SubstanceLookAndFeel.setSkin(new BusinessBlueSteelSkin());
//SubstanceLookAndFeel.setSkin(new OfficeBlack2007Skin());
SubstanceLookAndFeel.setSkin(new OfficeBlue2007Skin());
UIManager.put("TabbedPane.contentOpaque", Boolean.TRUE);
System.out.println(UIManager.getDefaults().get("TabbedPane.contentBorderInsets"));
System.out.println(UIManager.getDefaults().get("TabbedPane.tabsOverlapBorder"));
UIManager.getDefaults().put("TabbedPane.contentBorderInsets", new javax.swing.plaf.InsetsUIResource(0, 0, 0, 0));
UIManager.getDefaults().put("TabbedPane.tabsOverlapBorder", true);
SwingUtilities.updateComponentTreeUI(frame);
new GetDecorationType()/*.setVisible(true)*/;
}
});
}
}