Java 选项卡上的 swing jtextarea 不填充选项卡,即使添加了滚动条也无法填充

Java swing jtextarea on a tab does not fill out the tab, cannot get it to fill even with scrollbar added

所以我正在使用 Oracle 选项卡式示例创建一个 Java swing 应用程序,以帮助从一家非常小的公司的内部数据库中快速检索数据,我在 Java 还是个新手(虽然体面的脚本)。我的问题是从数据库中检索到的数据超出了选项卡边界 enter image description here。通过阅读一个问题,我了解到我应该使用文本区域,所以我修改为使用文本区域但后来我无法滚动。我修复了滚动条,但现在数据只是在选项卡上的一个小 window 中。我可以放大标签,我有我的卷轴,但我无法填写文本区域。

这是文档示例中的网格布局: super(new GridLayout(8, 40));

这是显示信息的窗格,其中 inv 是一个数组列表,定义如下: ArrayList<String> inv = new ArrayList<String>();

使用以下代码将数据拉入窗格(注意尺寸不会改变文本区域,事实上,我不认为这对代码有任何影响,所以在期间将其注释掉我的测试:

    JComponent panel2 = makeTextPanel(inv.toString());
    //panel2.setPreferredSize(new Dimension(100, 50));
    tabbedPane.addTab("Customers", null, panel2,
            "Displays Customer Details");
    tabbedPane.setMnemonicAt(0, KeyEvent.VK_1);
    } catch (SQLException sqlException) {
        System.out.println(sqlException);
    }

这是使用滚动标签、文本区域等的面板代码,是复制代码的修改版本:

    //Add the tabbed pane to this panel.
    add(tabbedPane);
     
    //The following line enables to use scrolling tabs.
    tabbedPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
}
 
protected JComponent makeTextPanel(String text) {
    JPanel panel = new JPanel(false);
    JTextArea filler = new JTextArea(text, 100, 50);
    JScrollPane scroll = new JScrollPane (filler, 
        JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
    //filler.setHorizontalAlignment(JTextArea.CENTER);
    panel.setLayout(new GridLayout(1, 1));
    //panel.add(filler);
    panel.add(scroll);
    return panel;
}

然后使用我没有做任何更改的原始代码显示选项卡式窗格:

private static void createAndShowGUI() {
    //Create and set up the window.
    JFrame frame = new JFrame("TabbedPane");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    //Add content to the window.
    frame.add(new TabbedPane(), BorderLayout.CENTER);
     
    //Display the window.
    frame.pack();
    frame.setVisible(true);
}

问题是,我怎样才能让文本区域填满窗格,而不只是大小的 1/4(无论我如何在代码或 GUI 中调整 window 的大小?该文档似乎并没有为我提供太多(基于搜索)工作,因为我已经像文档指定的那样在文本区域中设置滚动条。我像另一个问题一样尝试了 setLineWrap(true) 但这也没有帮助。见我遇到的问题的示例图片。有什么想法吗?

我会使用 BorderLayout 来控制 JScrollPane 的布局,以便它可以自动填充可用的 space。

您可以通过 rowscolumns 属性控制 JTextArea 的可见尺寸

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringJoiner;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Main {

    public static void main(String[] args) {
        new Main();
    }

    public Main() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                // Replace this with your text retrieval process
                List<String> text = new ArrayList<String>(128);
                try (BufferedReader br = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("/resources/StarWarANewHope.txt")))) {
                    String line = null;
                    while ((line = br.readLine()) != null) {
                        text.add(line);
                    }
                } catch (IOException ex) {
                    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                }

                // Use this to format the results for the text area
                StringJoiner joiner = new StringJoiner("\n");
                for (String line : text) {
                    joiner.add(line);
                }

                JTabbedPane tabbedPane = new JTabbedPane();
                tabbedPane.addTab("Customers", null, new TestPane(joiner.toString()), "Displays customer details");

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(tabbedPane);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane(String text) {
            JTextArea filler = new JTextArea(text, 25, 25);
            filler.setWrapStyleWord(true);
            filler.setLineWrap(true);
            JScrollPane scroll = new JScrollPane(filler);
            //filler.setHorizontalAlignment(JTextArea.CENTER);
            setLayout(new BorderLayout());
            //panel.add(filler);
            add(scroll);
        }
    }

}

如果您仍然遇到问题,请考虑提供一个 minimal reproducible example,它会消除猜测工作,通常会得到更好的答案以获取更多详细信息