【发布时间】:2014-03-15 10:52:15
【问题描述】:
我已经使用 GridBagLayout 进行了布局,以强制子组件从底部向上堆叠。
我唯一剩下的就是让“容器”组件可滚动。
我尝试将 JScrollPane 插入不同的位置,但我找不到工作点。
我的 2 个内部 JPanel 在底部正确对齐,并且在我调整窗口大小时它们会正确调整大小。但是,当我将窗口的大小调整得太小而无法容纳文本时,我希望“容器”组件能够滚动。
请帮助新手:)
更新 1:滚动应该针对整个 GridBagLayout。不适用于每个单独的文本窗格。
更新 2:将代码更改为使用 BorderLayout,因为它对我的滚动问题没有影响。
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.border.LineBorder;
public class BorderTest extends JFrame {
private static final long serialVersionUID = 1L;
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new BorderTest().setVisible(true);
}
});
}
public BorderTest() {
UIManager.put("swing.boldMetal", Boolean.FALSE);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("Grid Bag");
setSize(500, 300);
setLocationRelativeTo(null);
JPanel container = new JPanel();
container.setLayout(new BorderLayout());
container.setBorder(new LineBorder(Color.RED, 2));
add(container);
JPanel bottom = new JPanel();
bottom.setBorder(new LineBorder(Color.YELLOW, 2));
bottom.setLayout(new BoxLayout(bottom, BoxLayout.Y_AXIS));
container.add(bottom, BorderLayout.SOUTH);
JTextPane textPane = new JTextPane();
textPane.setText("Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et ");
textPane.setBorder(new LineBorder(Color.GREEN, 2));
bottom.add(textPane);
JTextPane textPane2 = new JTextPane();
textPane2.setText("Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et ");
textPane2.setBorder(new LineBorder(Color.BLUE, 2));
bottom.add(textPane2);
}
}
上面代码运行时的截图:
当我缩小窗口时,项目不适合(当然),然后我希望出现垂直滚动条(但不是水平的,因为单词应该只是换行)
如您所见,“红色”边框位于窗口“外部”,因此在此处放置滚动窗格似乎是个好主意。这是添加了滚动窗格的代码:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.border.LineBorder;
public class BorderTest extends JFrame {
private static final long serialVersionUID = 1L;
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new BorderTest().setVisible(true);
}
});
}
public BorderTest() {
UIManager.put("swing.boldMetal", Boolean.FALSE);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("Grid Bag");
setSize(500, 300);
setLocationRelativeTo(null);
JScrollPane scrollPane = new JScrollPane();
scrollPane.setBorder(new LineBorder(Color.CYAN, 2));
add(scrollPane);
JPanel container = new JPanel();
container.setLayout(new BorderLayout());
container.setBorder(new LineBorder(Color.RED, 2));
scrollPane.setViewportView(container);
JPanel innerContainer = new JPanel();
innerContainer.setLayout(new BorderLayout());
innerContainer.setBorder(new LineBorder(Color.PINK, 2));
scrollPane.setViewportView(innerContainer);
JPanel bottom = new JPanel();
bottom.setBorder(new LineBorder(Color.YELLOW, 2));
bottom.setLayout(new BoxLayout(bottom, BoxLayout.Y_AXIS));
innerContainer.add(bottom, BorderLayout.SOUTH);
JTextPane textPane = new JTextPane();
textPane.setText("Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et ");
textPane.setBorder(new LineBorder(Color.GREEN, 2));
bottom.add(textPane);
JTextPane textPane2 = new JTextPane();
textPane2.setText("Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et ");
textPane2.setBorder(new LineBorder(Color.BLUE, 2));
bottom.add(textPane2);
}
}
但结果不是我想要的。现在添加了水平 scoll 条,使我的文本项目成为一大行宽:
【问题讨论】:
-
那个 GridBagLayout 没有做太多,因为你只添加了 1 个组件与该布局(网格是 1x1)。我不认为你理解它是如何工作的。你为什么要把它放在
gridx = 0;、gridy = 2;上? -
GridBagLayout 帮助我将组件从下到上放置,而无需在内部组件上设置固定高度。我只是在哪里添加 JScrollPane 时遇到问题。我尝试添加到“容器”,但没有奏效。
-
不,帮助您将组件从下到上放置的是带有 Y_AXIS 的
bottom面板的 BoxLayout。 GridBagLayout 什么也没做。您可以将这些组件放在 BoirderLayout 的南侧位置以实现类似的效果。 -
对不起,那些是错字。我已经更新了它。但是,Y_AXIS 并未将其置于底部。它只是从上到下堆叠,没有 GridBagLayout,它会导致 2 个面板每个高 50% 并填满整个高度。
-
将 Y_AXIS 更改为 X_AXIS,您会看到 JPanel 仍在底部。这是 GridBagLayout 的帮助。
标签: java swing jscrollpane