簡體   English   中英

Java Swing:嵌套的選項卡和布局

[英]Java Swing: Nested Tabs and Layouts

我對下一個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不能使標簽的文本區域大小嗎? 這僅在嵌套選項卡中發生:如果我僅使用單個級別的選項卡,則文本區域將正確適合。

您需要將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傳遞到帶有其add(...)方法的已創建JScrollPane中,因為這將刪除滾動窗格的veiwport,這將阻止其正常工作。

您根本沒有使用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更多信息,請參JScrollPane Java跟蹤 另外,作為參考,還可以參考《 Swing Components可視化指南》

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM