JTabbedPane 选项卡标题在字体更改时留下填充
JTabbedPane Tab Title Leaves Padding when font is changed
我正在编写自定义 BasicTabbedPaneUI
我已经覆盖 paintText
并更改了其中的 fontSize,但是这会在选项卡右侧留下不需要的额外填充。
如您所见,填充相当大,我希望它与左侧的填充相同。所以这是我的代码
import sun.swing.SwingUtilities2;
import javax.swing.*;
import javax.swing.plaf.basic.BasicTabbedPaneUI;
import java.awt.*;
public class UITest {
public static void main(String[] args) {
JFrame jFrame = new JFrame();
JTabbedPane jTabbedPane = new JTabbedPane();
jTabbedPane.add(new JPanel(), "This is a test title");
jTabbedPane.add(new JPanel(), "This is also a test title");
jTabbedPane.setUI(new LynxTabbedPane());
jFrame.setContentPane(jTabbedPane);
jFrame.setSize(300, 100);
jFrame.setVisible(true);
}
public static class LynxTabbedPane extends BasicTabbedPaneUI {
@Override
protected void paintText(Graphics g, int tabPlacement, Font font, FontMetrics metrics, int tabIndex, String title, Rectangle textRect, boolean isSelected) {
Font myFont = new Font(font.getFontName(), Font.BOLD, 10);
g.setFont(myFont);
g.setColor(Color.WHITE);
SwingUtilities2.drawStringUnderlineCharAt(tabPane,
g, title,
tabPane.getDisplayedMnemonicIndexAt(tabIndex),
textRect.x, metrics.getAscent() + 2);
}
}
}
我本以为我需要计算 tabWidth,所以我试图覆盖它并从中减去 5,但是它并没有改变,所以现在我一无所知。
@Override
protected int calculateTabWidth(int tabPlacement, int tabIndex, FontMetrics metrics) {
return super.calculateTabWidth(tabPlacement, tabIndex, metrics) - 5;
}
实施很好,但当您将参数传递给 paintText 方法时,我感觉标题的末尾有额外的 space。尝试 title.trim() 删除多余的 space 并检查行为
最终在 JTabbedPane
对象上使用 setFont
,因为它会自动处理选项卡必须达到的大小
Font myFont = new Font(tabbedPane.getFont().getFontName(), Font.BOLD, 10);
tabbedPane.setFont(myFont);
我正在编写自定义 BasicTabbedPaneUI
我已经覆盖 paintText
并更改了其中的 fontSize,但是这会在选项卡右侧留下不需要的额外填充。
如您所见,填充相当大,我希望它与左侧的填充相同。所以这是我的代码
import sun.swing.SwingUtilities2;
import javax.swing.*;
import javax.swing.plaf.basic.BasicTabbedPaneUI;
import java.awt.*;
public class UITest {
public static void main(String[] args) {
JFrame jFrame = new JFrame();
JTabbedPane jTabbedPane = new JTabbedPane();
jTabbedPane.add(new JPanel(), "This is a test title");
jTabbedPane.add(new JPanel(), "This is also a test title");
jTabbedPane.setUI(new LynxTabbedPane());
jFrame.setContentPane(jTabbedPane);
jFrame.setSize(300, 100);
jFrame.setVisible(true);
}
public static class LynxTabbedPane extends BasicTabbedPaneUI {
@Override
protected void paintText(Graphics g, int tabPlacement, Font font, FontMetrics metrics, int tabIndex, String title, Rectangle textRect, boolean isSelected) {
Font myFont = new Font(font.getFontName(), Font.BOLD, 10);
g.setFont(myFont);
g.setColor(Color.WHITE);
SwingUtilities2.drawStringUnderlineCharAt(tabPane,
g, title,
tabPane.getDisplayedMnemonicIndexAt(tabIndex),
textRect.x, metrics.getAscent() + 2);
}
}
}
我本以为我需要计算 tabWidth,所以我试图覆盖它并从中减去 5,但是它并没有改变,所以现在我一无所知。
@Override
protected int calculateTabWidth(int tabPlacement, int tabIndex, FontMetrics metrics) {
return super.calculateTabWidth(tabPlacement, tabIndex, metrics) - 5;
}
实施很好,但当您将参数传递给 paintText 方法时,我感觉标题的末尾有额外的 space。尝试 title.trim() 删除多余的 space 并检查行为
最终在 JTabbedPane
对象上使用 setFont
,因为它会自动处理选项卡必须达到的大小
Font myFont = new Font(tabbedPane.getFont().getFontName(), Font.BOLD, 10);
tabbedPane.setFont(myFont);