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。
您可以通过 rows
和 columns
属性控制 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,它会消除猜测工作,通常会得到更好的答案以获取更多详细信息
所以我正在使用 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。
您可以通过 rows
和 columns
属性控制 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,它会消除猜测工作,通常会得到更好的答案以获取更多详细信息