问题描述
我有一个JPanel,我想设置其宽度,但让高度由其内容确定。包含的JPanel应该保持其大小。如果我在“内容”中放置多行文本,则它当然应该自动跨越更大的高度。如果所需的高度超过了容器的可用高度,则滚动条将是理想的选择(但这并不重要)。
这可能真的很简单,但是我只是想不通...
import java.awt.BorderLayout;
import java.awt.Color;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class JPanelContentSizedDemo {
public static void main(String[] args) {
SwingUtilities.invokeLater(JPanelContentSizedDemo::new);
}
JPanelContentSizedDemo() {
JFrame frame = new JFrame("Demo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400,300);
frame.setResizable(false);
frame.setLayout(null);
// the containing panel
JPanel panelContainer = new JPanel();
panelContainer.setBorder(BorderFactory.createEmptyBorder(10,10,10));
panelContainer.setBounds(50,50,300,200);
panelContainer.setBackground(Color.RED);
frame.add(panelContainer);
// what to do...
//panelContainer.setLayout(new BoxLayout(panelContainer,BoxLayout.Y_AXIS));
panelContainer.setLayout(new BorderLayout());
// the panel that I want to size to its content
JPanel dialog = new JPanel(new BorderLayout());
dialog.setBackground(Color.GREEN);
dialog.setBorder(BorderFactory.createLineBorder(Color.BLACK));
dialog.add(new JLabel("This is some content!"));
panelContainer.add(dialog);
frame.setVisible(true);
}
}
解决方法
这可能有效:
// what to do...
panelContainer.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 1.0;
c.weighty = 1.0;
c.anchor = GridBagConstraints.CENTER;
c.gridx = 0;
c.gridy = 0;
c.gridwidth = 1;
c.gridheight = 1;
...
panelContainer.add(dialog,c);