我遇到了下一个让我难过的JTabbedPanes的问题。我已将问题分离为一个简短的演示应用程序(基于oracle选项卡式窗格教程):
package main.java;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
public class TabbedPaneDemo extends JPanel {
public static JTabbedPane topTabs = new JTabbedPane();
public TabbedPaneDemo() {
super(new BorderLayout());
topTabs.setPreferredSize(new Dimension(400, 200));
topTabs.add(makeReadoutPanel("\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15"));
add(topTabs);
}
private static JTabbedPane makeReadoutPanel(String text) {
// Create tabbed pane
JTabbedPane tabs = new JTabbedPane();
tabs.setName("Tabs");
// Create text field
JTextArea textArea = new JTextArea(text);
textArea.setEditable(false);
textArea.setFont(new Font("Monospaced", Font.PLAIN, 14));
// Create first panel for text field
JPanel textPanel = new JPanel();
textPanel.setLayout(new BorderLayout());
textPanel.setName("Text Panel");
textPanel.add(textArea, BorderLayout.CENTER);
// Add text field panel to tabs
tabs.add(textPanel);
return tabs;
}
private static void createAndShowGUI() {
//Create and set up the window.
JFrame frame = new JFrame("TabbedPaneDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Add content to the window.
frame.add(new TabbedPaneDemo(), BorderLayout.CENTER);
//Display the window.
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
//Schedule a job for the event dispatch thread:
//creating and showing this application's GUI.
SwingUtilities.invokeLater(new Runnable() {
public void run() {
//Turn off metal's use of bold fonts
UIManager.put("swing.boldMetal", Boolean.FALSE);
createAndShowGUI();
}
});
}
}
运行此选项时,JTextArea会在没有滚动条的情况下被切断,而不是垂直安装到面板上。 textPanel中的BorderLayout不应该将文本区域大小设置为选项卡吗?这只发生在嵌套选项卡上:如果我只使用一个级别的选项卡,则文本区域适合。
答案 0 :(得分:4)
您需要将JTextArea添加到JScrollBar的视口中,然后将其添加到JTabbedPane所持有的组件中。
JPanel textPanel = new JPanel();
textPanel.setLayout(new BorderLayout());
textPanel.setName("Text Panel");
// **** note change:
textPanel.add(new JScrollPane(textArea), BorderLayout.CENTER);
请注意,有两种常用方法可以在视口中添加组件(此处为JTextArea)。一种是将其传递给JSrollPane的构造函数,如上所述,另一种是在已经创建的JScrollPane上调用setViewportView(...)
,将组件传入方法的参数。无论你做什么,都不要将JTextArea传递给已经创建的JScrollPane及其add(...)
方法,因为你将删除滚动窗格的veiwport,这将阻止它正常工作。
答案 1 :(得分:2)
您根本没有使用JScrollPane
。改变这个:
JPanel textPanel = new JPanel();
textPanel.setLayout(new BorderLayout());
textPanel.setName("Text Panel");
textPanel.add(textArea, BorderLayout.CENTER);
对此:
JPanel textPanel = new JPanel();
textPanel.setLayout(new BorderLayout());
textPanel.setName("Text Panel");
textPanel.add(new JScrollPane(textArea), BorderLayout.CENTER); // Changed
不使用JScrollPane
,您将无法获得滚动条。有关JScrollPane
的更多信息,请参阅this Java trail。另外,作为参考,Visual Guide to Swing Components。