我在JEditorPane
中使用了JPanel
,我在下面的示例中将其称为contentPane
。内容窗格位于JScrollPane
内。我希望编辑器窗格填充尽可能少的空间(仅包含它的文本),内容窗格中可用的其余空间将留空到底部,并在任一侧。如果文本太大,编辑器窗格将会增长,最终滚动窗格将创建滚动条以浏览所有内容。但是,代替编辑器窗格仅占用其首选大小(它包含的文本大小),它将填满整个内容窗格,该窗格将填充滚动窗格的整个视图端口。这是一些示例代码来演示我的问题:
import java.awt.BorderLayout;
import java.awt.Color;
import javax.swing.BoxLayout;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
@SuppressWarnings("serial")
public class ScrollPaneExample extends JFrame {
public static void main(String[] args) {
new ScrollPaneExample();
}
public ScrollPaneExample() {
super("ScrollPaneExample");
setSize(400, 400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
JEditorPane editorPane = new JEditorPane("text/plain", "");
editorPane.setBackground(Color.YELLOW);
for (int i = 0; i < 5; i++)
editorPane.setText(editorPane.getText() + "Hello World\n");
JPanel contentPane = new JPanel();
contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS));
contentPane.setBackground(Color.BLUE);
contentPane.add(editorPane);
JScrollPane scrollPane = new JScrollPane(contentPane);
add(scrollPane, BorderLayout.CENTER);
setVisible(true);
}
}
运行时,这就是窗口的样子:
在黄色背景下,我们可以看到编辑器窗格占用了所有空间。这是我希望布局看起来像(Photoshop)的示例:
蓝色背景代表内容窗格,黄色代表编辑器窗格。
编辑:在我的工作程序中,contentPane
中不仅有一个编辑器窗格。这就是为BoxLayout
使用FlowLayout
代替contentPane
的原因;因为需要垂直页面流布局。
答案 0 :(得分:3)
只需在内容窗格中使用FlowLayout
即可。 BorderLayout
不会尊重首选尺寸,并会将组件拉伸以适应。在Laying out Components Withing a Container
如果要为编辑器窗格设置初始大小,就像使用Scollable
的任何其他组件一样,可以覆盖getPreferredScrollableViewportSize()
以设置滚动窗格视图的大小(当组件已添加)
此外,您应该将编辑器添加到滚动窗格,而不是面板。执行后者,编辑器将无法在滚动窗格中滚动。
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
@SuppressWarnings("serial")
public class ScrollPaneDemo extends JFrame {
public static void main(String[] args) {
new ScrollPaneDemo();
}
public ScrollPaneDemo() {
super("ScrollPaneExample");
setSize(400, 400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new FlowLayout());
JEditorPane editorPane = new JEditorPane("text/plain", "") {
@Override
public Dimension getPreferredScrollableViewportSize() {
return new Dimension(200, 200);
}
};
editorPane.setBackground(Color.YELLOW);
for (int i = 0; i < 50; i++) {
editorPane.setText(editorPane.getText()
+ "Hello World Hello World\n");
}
JScrollPane scrollPane = new JScrollPane(editorPane);
add(scrollPane);
setVisible(true);
}
}
<强>更新强>
在我的工作程序中,contentPane中不仅仅有一个编辑器窗格。这就是我为contentPane使用BoxLayout而不是FlowLayout的原因;因为需要垂直页面流布局。
BoxLayout就是问题所在。您需要为编辑器窗格设置最大大小。或者只是一起摆脱BoxLayout。 FlowLayout或GridBagLayout将尊重首选大小
更新2
以下是使用GridBagLayout的示例,它可能更适合您的扩展&#34;编辑器。
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.Timer;
@SuppressWarnings("serial")
public class ScrollPaneExample extends JFrame {
public static void main(String[] args) {
new ScrollPaneExample();
}
public ScrollPaneExample() {
super("ScrollPaneExample");
setSize(400, 400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
//getContentPane().setBackground(Color.BLUE);
final JEditorPane editorPane = new JEditorPane("text/plain", "") {
};
editorPane.setBackground(Color.YELLOW);
for (int i = 0; i < 5; i++)
editorPane.setText(editorPane.getText() + "Hello World\n");
JPanel contentPane = new JPanel();
contentPane.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weighty = 1;
contentPane.setBackground(Color.BLUE);
contentPane.add(editorPane, gbc);
gbc.gridy++;
contentPane.add(new JButton("Button"), gbc);
gbc.gridy++;
contentPane.add(new JButton("Button"), gbc);
JPanel panel = new JPanel();
panel.add(contentPane);
JScrollPane scrollPane = new JScrollPane(panel);
add(scrollPane);
setVisible(true);
Timer timer = new Timer(1000, new ActionListener(){
public void actionPerformed(ActionEvent e) {
editorPane.setText(editorPane.getText() + "Hello World\n");
setVisible(true);
}
});
timer.start();
}
}