gpt4 book ai didi

java - JTabbedPane:如何从上到下而不是从下到上对选项卡进行排序?

转载 作者:行者123 更新时间:2023-12-02 11:18:20 27 4
gpt4 key购买 nike

JTabbedPane 中,选项卡的顺序是从下到上: enter image description here

我希望它是从上到下的,这意味着 tab0 位于顶行,tab60 位于底行。

代码:

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.UIManager;

public class Class1 {

public static JTabbedPane jtp;

public static void main(String[] args) {
JFrame window = new JFrame();
window.setTitle("Parent frame");
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setSize(600, 400);
window.setLocationRelativeTo(null);

try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
e.printStackTrace();
}

jtp = new JTabbedPane();
window.add(jtp);

/*WindowsTabbedPaneUI btpui = new WindowsTabbedPaneUI() {
@Override protected void paintTabArea(Graphics g, int tabPlacement, int selectedIndex) {
int tabCount = tabPane.getTabCount();

Rectangle iconRect = new Rectangle(),
textRect = new Rectangle();
Rectangle clipRect = g.getClipBounds();

// Paint tabRuns of tabs from front to back
for (int i = 0; i < runCount; i++) {
int start = tabRuns[i];
int next = tabRuns[(i == runCount - 1)? 0 : i + 1];
int end = (next != 0? next - 1: tabCount - 1);
for (int j = start; j <= end; j++) {
if (j != selectedIndex && rects[j].intersects(clipRect)) {
paintTab(g, tabPlacement, rects, j, iconRect, textRect);
}
}
}

// Paint selected tab if its in the front run
// since it may overlap other tabs
if (selectedIndex >= 0 && rects[selectedIndex].intersects(clipRect)) {
paintTab(g, tabPlacement, rects, selectedIndex, iconRect, textRect);
}
}
};
jtp.setUI(btpui);*/

//jtp.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);

for (int i = 0; i <= 60; i++) {
jtp.addTab("tab"+i, new JPanel());
}
window.setVisible(true);
}
}

我尝试重写 WindowsTabbedPaneUI 中的 paintTabArea() 方法以从上到下绘制,但它似乎没有执行任何操作。

我找到了两种解决方法:

  • 将选项卡放在底部,以便它们以正确的方式对齐(但我想将它们保留在顶部)

  • 以相反的顺序排列选项卡,然后将组件从右到左对齐。然而,这会产生视觉问题:左侧的选项卡太靠近边框,左侧的选项卡与其他选项卡之间有空间,右侧的选项卡会在边框上留下凹痕。我还必须重写 addTab() 方法,并在只有一行时放入 LTR,这感觉就像一种 hack。

有什么办法可以做到这一点而不出现故障吗?我想我必须重写 BasicTabbedPaneUI 中的某些方法,但我找不到哪个方法。

最佳答案

我终于找到了解决办法。

正如 @Joe Coder 所说,您必须覆盖 calculateTabRects()方法。但是,该方法位于内部类中。没有办法扩展BasicTabbedPaneUI ,或内部类,因为有太多的 protected 和私有(private)字段。解决方案是通过复制粘贴所有代码来重新创建相关类。

源码来自here .

相关修改在 calculateTabRects()方法,更具体地说是 for 循环:

// Step through runs from back to front to calculate
// tab y locations and to pad runs appropriately
for (i = runCount - 1; i >= 0; i--) {
//...
}

只需反向迭代即可解决问题:for (i = 0; i < runCount; i++) {...}

现在,如果您复制粘贴 BasicTabbedPaneUI 的代码,您会发现还需要复制粘贴 LazyActionMapBasicGraphicsUtils

为了方便起见,这里是您需要复制粘贴的所有代码。如果包 javax.swing.plaf.basic 中没有,请确保不要覆盖该包这是行不通的。

FixedTabbedPaneUI.java:https://pastebin.com/W8RBD4vg

LazyActionMap2.java:https://pastebin.com/RKtDgJB5

BasicGraphicsUtils2.java:https://pastebin.com/Au4hcSyp

但是,就我而言,我需要一个 WindowsTabbedPaneUI 。这是 WindowsTabbedPaneUI2.java:https://pastebin.com/89UedgbQ

..XPStyle2.java:https://pastebin.com/xCsm8DZc

..和AnimationController2.java:https://pastebin.com/7Pm0s5eG

OOP hell 到此结束,但在当前状态下,“runs”(制表符行)之间的线消失了: enter image description here

解决方案是在选择带有UIManager.setLookAndFeel()的UI后添加以下内容:

    UIManager.getDefaults().put("TabbedPane.tabRunOverlay", 0);
UIManager.getDefaults().put("TabbedPane.focus", new Color(0, 0, 0, 0));

结果:

enter image description here

关于java - JTabbedPane:如何从上到下而不是从下到上对选项卡进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50110214/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com