- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写我的个人外观和感觉,现在我想将我的个人高度设置为 JTabbledPane 内的选项卡。我找到了这个post使用 UIDefauls 来设置 Insets,效果很好,这就是结果
但是我注意到垂直选项卡有一个错误,所以这就是问题
这是一个可重现的最小示例
import javax.swing.*;
import javax.swing.plaf.basic.BasicTabbedPaneUI;
import javax.swing.plaf.metal.MetalLookAndFeel;
import javax.swing.plaf.metal.MetalTabbedPaneUI;
import java.awt.*;
/**
* @author https://github.com/vincenzopalazzo
*/
public class MaterialMain extends JFrame {
public static MaterialMain SINGLETON = new MaterialMain();
static {
try {
UIManager.setLookAndFeel(new MaterialMain.LookAndFeelTest());
} catch (UnsupportedLookAndFeelException e) {
e.printStackTrace();
}
}
public void init() {
JMenuBar menuBar = new JMenuBar();
JMenu file = new JMenu("File");
menuBar.add(file);
this.setJMenuBar(menuBar);
JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.LEFT);
//JTabbedPane tabbedPane = new JTabbedPane();
tabbedPane.setUI(new LookAndFeelTest.TestTabbledPaneUI());
JPanel panel = new JPanel();
JPanel panelTwo = new JPanel();
panel.add(new JTextField("Hello guys, this is MaterialLookAndFeel"));
tabbedPane.add("Test", panel);
tabbedPane.add("TestTwo", panelTwo);
setTitle("Look and feel");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(630, 360);
add(tabbedPane);
setLocationRelativeTo(null);
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
SINGLETON.init();
}
});
}
public static class LookAndFeelTest extends MetalLookAndFeel {
@Override
protected void initClassDefaults(UIDefaults table) {
super.initClassDefaults(table);
}
@Override
protected void initComponentDefaults(UIDefaults table) {
super.initComponentDefaults(table);
table.put( "TabbedPane.tabInsets", new Insets(10,10,10,10) );
table.put( "TabbedPane.selectedTabPadInsets", new Insets(10,10,10,10) );
table.put( "TabbedPane.linePositionY", 45);
table.put( "TabbedPane.linePositionX", 0);
table.put( "TabbedPane.lineWith", 0);
}
static class TestTabbledPaneUI extends MetalTabbedPaneUI {
@Override
protected void paintTabBackground(Graphics g, int tabPlacement, int tabIndex, int x, int y, int w, int h, boolean isSelected) {
g.setColor(isSelected ? lightHighlight : tabPane.getBackground());
g.fillRect(x, y, w, h);
if (isSelected) {
paintLine(g, x, y, w, h);
}else{
}
}
protected void paintLine(Graphics graphics, int x, int y, int w, int h) {
if(graphics == null){
return;
}
graphics.setColor(Color.RED);
graphics.fillRoundRect(x + UIManager.getInt("TabbedPane.linePositionX"),
y + UIManager.getInt("TabbedPane.linePositionY"),
w - UIManager.getInt("TabbedPane.lineWith"), 1, 10, 10);
}
@Override
protected LayoutManager createLayoutManager() {
return new TestTabbedPaneLayout();
}
protected class TestTabbedPaneLayout extends BasicTabbedPaneUI.TabbedPaneLayout{
protected int spacer; // should be non-negative
protected int indent;
public TestTabbedPaneLayout() {
this.spacer = UIManager.getInt("TabbedPane.spacer");
this.indent = UIManager.getInt("TabbedPane.indent");
}
@Override
protected void calculateTabRects(int tabPlacement, int tabCount){
if(spacer < 0){
throw new IllegalArgumentException("The spacer inside the " +
this.getClass().getSimpleName() + " must be a negative value");
}
super.calculateTabRects(tabPlacement,tabCount);
for (int i = 0; i < rects.length; i++){
rects[i].x += i * spacer + indent;
}
}
}
}
}
}
我个人画线的方法
protected void paintLine(Graphics graphics, int x, int y, int w, int h) {
if(graphics == null){
return;
}
graphics.setColor(Color.RED);
graphics.fillRoundRect(x + UIManager.getInt("TabbedPane.linePositionX"),
y + UIManager.getInt("TabbedPane.linePositionY"),
w - UIManager.getInt("TabbedPane.lineWith"), 1, 10, 10);
}
我的个人布局
protected class TestTabbedPaneLayout extends BasicTabbedPaneUI.TabbedPaneLayout{
protected int spacer; // should be non-negative
protected int indent;
public TestTabbedPaneLayout() {
this.spacer = UIManager.getInt("TabbedPane.spacer");
this.indent = UIManager.getInt("TabbedPane.indent");
}
@Override
protected void calculateTabRects(int tabPlacement, int tabCount){
if(spacer < 0){
throw new IllegalArgumentException("The spacer inside the " +
this.getClass().getSimpleName() + " must be a negative value");
}
super.calculateTabRects(tabPlacement,tabCount);
for (int i = 0; i < rects.length; i++){
rects[i].x += i * spacer + indent;
}
}
}
我相信该错误存在于 Layaut 代码中,但我找不到一种明智的方法来做到这一点,因此我向比我了解更多的人征求意见。
最佳答案
我想添加这个问题的答案。
我的问题与 component 的错误有关
我已经解决了改变方法的问题,所以我重写了paintTabBackground方法
这是代码
@Override
protected void paintTabBackground(Graphics g, int tabPlacement, int tabIndex, int x, int y, int w, int h, boolean isSelected) {
Graphics2D g2D = (Graphics2D) g;
int xp[];
int yp[];
Polygon shape = null;
Rectangle shapeRect = null;
//Todo remove the shape and used the shapeRect
if(tabPlacement == TOP){
xp = new int[]{x, x, x, x + w, x + w, x + w, x + w, x};
yp = new int[]{(y + positionYLine + heightLine), y + positionYLine, y + positionYLine, y + positionYLine, y + positionYLine, y + positionYLine, y + positionYLine + heightLine, y + positionYLine + heightLine};
shape = new Polygon(xp, yp, xp.length);
}else if(tabPlacement == BOTTOM){
y += 20;
xp = new int[]{x, x, x, x + w, x + w, x + w, x + w, x};
yp = new int[]{(y + heightLine), y, y, y, y, y, y + heightLine, y + heightLine};
shape = new Polygon(xp, yp, xp.length);
}else if(tabPlacement == LEFT){
//xp = new int[]{0, 0, 0, h, h, h, h, 0};
//yp = new int[]{(y + heightLine), y, y, y, y, y, y + heightLine, y + heightLine};
shapeRect = new Rectangle(x + heightLine - 2, y + (heightLine), heightLine, w / (tabPane.getTabCount()));
}else{
//super.paintTabBackground(g, tabPlacement, tabIndex, x, y, w, h, isSelected);
shapeRect = new Rectangle(x + w - heightLine, y + (heightLine), heightLine, w / (tabPane.getTabCount()));
}
if (isSelected) {
g2D.setColor(selectedAreaContentBackground);
g2D.setPaint(selectedAreaContentBackground);
tabPane.setForegroundAt(tabIndex, selectedForeground);
} else {
if (tabPane.isEnabled() && tabPane.isEnabledAt(tabIndex)) {
g2D.setColor(areaContentBackground);
g2D.setPaint(areaContentBackground);
} else {
g2D.setColor(disableAreaContentBackground);
g2D.setPaint(disableAreaContentBackground);
}
tabPane.setForegroundAt(tabIndex, foreground);
}
if(shape != null){
g2D.fill(shape);
}else if (shapeRect != null){
g2D.fill(shapeRect);
}
}
关于java - 个性化 JTabbedPane 水平方向内的高度选项卡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57775271/
我编写了一个小程序,用于创建带有选项卡式 Pane 的简单 GUI。目前它有两个选项卡。在一个选项卡中我创建了一个按钮,在另一个选项卡中我创建了两个按钮(基于第三类中的字符串)。我无法做的是在第二个选
我想在单击负责使用 Action Listener 计算的按钮后将选定的 JTabbedPane“计算”更改为 TabbedPane“结果”。 最佳答案 class ButtonHandler imp
收到此错误: Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at Project.reportpane.a
我遇到的问题是,在 JTabbedPane 内部时,内部面板的背景颜色未设置(或未显示) 我有以下结构: JPanel BorderLayout: JTabbedPane (BorderLayo
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 9 年前。 Improve t
在我的 JTabbedPane 中,我以两种不同的方式删除标签: tabbedPane.remove(index) 和 tabbedPane.removeAll() 两者在关闭选项卡方面都可以正常工作
我有一个使用 JTabbedPane 来显示多个不同选项卡的应用程序。这些选项卡之一有一个正在运行的线程来显示其内容。我已经实现了一个 ComponentListener 来在选项卡不可见时停止线程。
我想让我的选项卡标签共享 JTabbedPane 宽度。如果有一个标签,适合整个宽度,如果两个标签共享宽度,如果三个,每个 1/3,依此类推... 我什至不知道是否可以在不将组件放在那里并调整其大小的
我想知道如何从左侧开始设置 JTabbedPane 的选项卡位置。默认情况下,它们处于中间位置,因为我使用的是 Mac OS X。 如果您需要更多信息,请告诉我。 查看此图像以了解我使用默认 JTab
在这个 JTabbedPane 截图中 我正在使用 Netbeans 的 DnD,我一直在修改它只是为了在选项卡之间放置空格。到现在我还是得不到我想要的。 有办法吗? 最佳答案 我不确定其他方法,但我
我对java相当陌生,正在创建一个windowbuilder程序。我想知道在使用 Jtabbedpane 并在程序窗口中的选项卡之间切换时是否可以使用 Action 监听器从单独的类获取内容。例如,我
给定一个 contentPane 布局设置为 null 的 JFrame,我想添加两个选项卡,一个用于发布者,另一个用于订阅者,例如: public class PubSubGUI extends J
在 JTabbedPane 中,选项卡的顺序是从下到上: 我希望它是从上到下的,这意味着 tab0 位于顶行,tab60 位于底行。 代码: import javax.swing.JFrame; im
这类似于问题How to build a Google-chrome tabs and menubar interface in Java Swing? (我想完成同样的任务),但更重要的是:如何将组
我想将 JTabbedPane 放在中间,单击我想要更改的任何选项卡将反射(reflect)在选项卡 Pane 的上方和下方面板中。 我尝试过,但它只适用于下面的面板。 如何克服这个问题?请帮助我。
我创建了一个 Java 选项卡式 Pane 。在选项卡式 Pane 中,我创建了一个名为“视频”的选项卡。我希望每当我单击视频选项卡时,视频都会自动在选项卡面板本身上播放。我可以这样做吗?如果是,请告
我有一个很长的数据列表要在 jtabbedpanel 上显示,向下滚动数据时,顶部的选项卡式面板名称将不可见。我怎样才能使选项卡式面板选项卡在顶部可见,甚至在向下滚动? 任何人都可以帮助我解决这个问题
我进行了快速研究来解决这个问题,但到目前为止我没有发现任何与此相关的信息。我将一张图像放入一个 TabbedPane 对象中,但是当我尝试将此图像与 TabbedPane 内的标签中心对齐时,它“不起
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve th
我是一名优秀的程序员,十分优秀!