我使用 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);
}
}
运行上述代码时的截图:
当我缩小窗口时,项目不适合(当然)然后我希望出现垂直滚动条(但不是水平滚动条,因为单词应该换行)
如您所见,“红色”边框位于窗口的“外部”,因此在此处放置一个滚动 Pane 似乎是个好主意。这是添加了滚动 Pane 的代码:
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);
}
}
但是结果并不是我想要的。现在添加了水平滚动条,使我的文本项成为一大行宽:
最佳答案
要将 JScrollPane
添加到组件,您只需使用该组件创建一个 JScrollPane
,然后将 JScrollPane
添加到面板你想要组件的地方。
所以代替:
panel.add(component, constraints);
使用
JScrollPane scrollPane = new JScrollPane(component);
panel.add(scrollPane, constraints);
当然你可以使用 scrollPane
变量来自定义 JScrollPane
一点点,检查它的文档,但是通过简单地将它放在你的代码中我们有:
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 GridBag extends JFrame
{
private static final long serialVersionUID = 1L;
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable() {
public void run()
{
new GridBag().setVisible(true);
}
});
}
public GridBag()
{
UIManager.put("swing.boldMetal", Boolean.FALSE);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("Grid Bag");
setSize(500, 300);
setLocationRelativeTo(null);
JPanel container = new JPanel(new GridBagLayout());
container.setBorder(new LineBorder(Color.RED, 2));
add(container);
GridBagConstraints c = new GridBagConstraints();
c.fill = GridBagConstraints.HORIZONTAL;
c.gridx = 0;
c.gridy = 0;
c.gridwidth = 1;
c.weightx = 1.0;
c.weighty = 1.0;
c.anchor = GridBagConstraints.LAST_LINE_START;
JPanel bottom = new JPanel();
bottom.setLayout(new BoxLayout(bottom, BoxLayout.Y_AXIS));
bottom.setBorder(new LineBorder(Color.GREEN, 2));
container.add(bottom, c);
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.BLACK, 2));
bottom.add(new JScrollPane(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(new JScrollPane(textPane2));
}
}
让它看起来像这样:
这可行但看起来不太好,所以让我向您展示一个示例,说明如何使用 GridBagConstraints.weighty
属性进行适当的高度分布。
我要做的是将两个面板添加到 GridBagLayout
(2 个单元格),一个放在另一个上面,并使用 weighty
数字告诉它们有多少空间采取。为此,我想将 c.fill
更改为 BOTH
。
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.JTextField;
import javax.swing.JTextPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.border.LineBorder;
public class GridBag extends JFrame
{
private static final long serialVersionUID = 1L;
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable() {
public void run()
{
new GridBag().setVisible(true);
}
});
}
public GridBag()
{
UIManager.put("swing.boldMetal", Boolean.FALSE);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setTitle("Grid Bag");
setSize(500, 300);
setLocationRelativeTo(null);
JPanel container = new JPanel(new GridBagLayout());
container.setBorder(new LineBorder(Color.RED, 2));
add(container);
GridBagConstraints c = new GridBagConstraints();
c.fill = GridBagConstraints.BOTH; //make it fill both directions
c.gridx = 0;
c.gridy = 0;
c.weightx = 1.0;
c.weighty = 1.0; //modify this number to change the proportion of the screen division
c.anchor = GridBagConstraints.CENTER; //for this example anything here goes.
JPanel topPanel = new JPanel();
topPanel.add(new JTextField("Put other components here"));
//topPanel.setBorder(new LineBorder(Color.YELLOW, 2));
container.add(topPanel, c);
c.gridy = 1;
c.weighty = 1.0; //modify this number to change the proportion of the screen division
JPanel bottom = new JPanel();
bottom.setLayout(new BoxLayout(bottom, BoxLayout.Y_AXIS));
bottom.setBorder(new LineBorder(Color.GREEN, 2));
container.add(bottom, c);
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.BLACK, 2));
bottom.add(new JScrollPane(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(new JScrollPane(textPane2));
}
}
看起来像这样:
顶部组件占屏幕的一半,两个文本面板占屏幕的一半,这是因为两个单元格(topPanel
和 bottom
) 是1.0,同样的值,所以比例是1:1。您可以更改这些数字以更改它们占用的空间。例如将第一个权重设置为 0.5 将使其比例为 1:2。
关于java - 在哪里插入 JScrollPane?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22422806/