- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在写这个问题时,我找到了一种方法让它按照我想要的方式运行。基于this ,我仍然发布问题,因为其他人可能会遇到类似的问题。
对于用于水平拉伸(stretch)但具有固定高度的内容的 JTabbedPane 大小,我有以下问题。 setTabLayoutPolicy()
的两个选项似乎都会改变内容的高度,并且不会始终以其首选或最小高度显示它。
使用默认的 WRAP_TAB_LAYOUT
,选项卡 Pane 的首选大小不考虑选项卡目前是实际堆叠还是彼此相邻显示,如讨论的那样 here , here在this bug report .如果选项卡式 Pane 基于堆叠选项卡进行布局,则当有足够的空间让选项卡彼此相邻显示时,每添加一个选项卡,内容的高度就会增加大约 20 像素(一个选项卡的高度)。如果选项卡式 Pane 的布局是基于彼此相邻显示的选项卡,则当必须堆叠选项卡时,内容高度会降低。
当策略设置为 SCROLL_TAB_LAYOUT
时,标签栏的高度是固定的,布局基本正确。但是,根据外观,选项卡内容的大小会减少几个像素。我已经能够发现这是由于 L&F 定义的选项卡区域的插入,这没有被考虑到选项卡 Pane 的首选大小计算中(参见 this bug report )。设置 UIManager.getDefaults().put("TabbedPane.tabAreaInsets", new Insets(0,0,0,0))
适用于某些 L&F(例如 Metal)但不适用于其他(例如 Nimbus) .
好像只有下面几个选项:
BasicTabbedPaneUI
,这看起来不太好是否有一种简洁的方法来强制选项卡式 Pane 的内容始终以固定高度显示?
下面的代码和截图说明了问题
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.UIManager;
public class TabbedPaneTest extends JFrame {
TabbedPaneTest() {
JPanel mainPanel = new JPanel();
mainPanel.setBackground(Color.white);
JTabbedPane tabs = new JTabbedPane();
//tabs.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT); // content cut off by a few pixels
tabs.setTabPlacement(JTabbedPane.BOTTOM);
Dimension min = new Dimension(100,200);
Dimension max = new Dimension(Short.MAX_VALUE,Short.MAX_VALUE);
//Dimension pref = new Dimension(Short.MAX_VALUE,200); // content cut off when small
Dimension pref = new Dimension(0,200); // content gets extra space when large
int tabCount = 3;
for (int i = 0; i < tabCount; i++) {
JLabel content = new JLabel();
content.setMinimumSize(min);
content.setMaximumSize(max);
content.setPreferredSize(pref);
tabs.addTab("lorem ipsum dolor sit amet", content);
}
// set up and render window
getContentPane().add(mainPanel, BorderLayout.CENTER);
getContentPane().add(tabs, BorderLayout.PAGE_END);
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle("JScrollPane Test");
pack();
setSize(700,400);
tabs.addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e) {
JTabbedPane tabbedPane = (JTabbedPane) e.getComponent();
int tabCount = tabbedPane.getTabCount();
for (int i = 0; i < tabCount; i++) {
Component c = tabbedPane.getComponentAt(i);
((JLabel) c).setText("<html>"
+ getSizes(c, "content")
+ getSizes(tabbedPane, "tabs")
+ "</html>");
}
}
});
}
private static String getSizes(Component c, String name) {
return "<p>" + name + " - "
+ " minimum:" + Integer.toString(c.getMinimumSize().width)
+ "x" + Integer.toString(c.getMinimumSize().height)
+ " maximum:" + Integer.toString(c.getMaximumSize().width)
+ "x" + Integer.toString(c.getMaximumSize().height)
+ " preferred:" + Integer.toString(c.getPreferredSize().width)
+ "x" + Integer.toString(c.getPreferredSize().height)
+ " actual:" + Integer.toString(c.getSize().width)
+ "x" + Integer.toString(c.getSize().height)
+ "</p>";
}
public static void main(String args[]) {
/* Set the Nimbus look and feel */
//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
/* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
* For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
*/
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(TabbedPaneTest.class
.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//</editor-fold>
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
@Override public void run() {
new TabbedPaneTest().setVisible(true);
}
});
}
}
对于滚动标签,内容被截断了几个像素(此处为 193 像素而不是 200 像素):
对于堆叠的选项卡和宽内容,当窗口较小时内容被截断(此处为 160px 而不是 200px):
对于堆叠的选项卡和狭窄的内容,当窗口较大时内容会变大(此处为 240 像素而不是 200 像素):
最佳答案
在详细了解选项卡式 Pane 的首选大小的计算方式后,我已经能够为 WRAP_TAB_LAYOUT
案例提出以下解决方案。
问题在于,对于选项卡式 Pane ,首选的高度和宽度是耦合的。首选高度是针对首选宽度而不是实际的当前宽度计算的。如果父级的布局管理器尊重首选高度而不是首选宽度,这是有问题的。
我想到的解决方案是设置一个监听器,将每个选项卡内容的首选宽度设置为其当前宽度。这样,选项卡式 Pane 可以正确计算其首选高度,并且可以进行布局,例如使用 BorderLayout。
tabs.addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e) {
JTabbedPane tabbedPane = (JTabbedPane) e.getComponent();
int tabCount = tabbedPane.getTabCount();
for (int i = 0; i < tabCount; i++) {
Component c = tabbedPane.getComponentAt(i);
c.setPreferredSize(new Dimension(c.getSize().width, c.getPreferredSize().height));
}
}
});
对于 SCROLL_TAB_LAYOUT
案例,我还没有找到令人满意的解决方案,所以如果有人有想法,我们将不胜感激。
关于java - JTabbedPane 和固定高度内容的大小问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34944950/
我编写了一个小程序,用于创建带有选项卡式 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
我是一名优秀的程序员,十分优秀!