我有一个JPanel
(名为mainJP),它有几个按钮和标签(使用BorderLayout
)。接下来,它会添加另一个JPanel
(名为JP1),并在其中添加一个ScrollPane
,其中包含JTable
。我希望能够调整JP2的大小,以及其所有子组件(ScrollPane
和JTable
)的大小。这样我就可以看到JTable
的更多行,而不必滚动。另外为了调整JP1的大小,JP1的其他兄弟姐妹应该自己调整。不知道如何实现这一目标。
如图所示,我已经实现了一些功能 - 完全删除JP1,展开/折叠JP1视图,删除和添加JTable
中的行。
基本上我希望能够在JP1的底部边框拖动鼠标,以垂直增加JP1及其子组件(ScrollPane
和JTable
)的大小。
如下面的一些解决方案所述,我仍然感到困惑,我应该在哪个级别加入JSpiltPane
- 因为它只允许添加2个组件。我认为所有JP1都应该在JSplitPane
。但是,可以有多个JP1组件,它们是动态添加的。
答案 0 :(得分:1)
向JSplitPane添加额外组件非常简单。将JPanel放在要显示组件的每个窗格中,然后将组件添加到此面板 - 您可以根据需要自定义布局。
这样的东西会将JSplitPane放入已创建的JFrame中,向每个窗格添加一个JPanel,然后在左侧添加一些JLabel,在右侧添加一个JTextField。 splitpane将扩展到它所在的JFrame的大小。
JSplitPane splitPane = new JSplitPane();
JPanel leftPanel = new JPanel();
JPanel rightPanel = new JPanel();
JLabel label1 = new JLabel();
JLabel label2 = new JLabel();
JTextField textField = new JTextField();
GridBagConstraints gBC = new GridBagConstraints();
getContentPane().setLayout(new GridBagLayout());
leftPanel.setLayout(new GridBagLayout());
rightPanel.setLayout(new GridBagLayout());
// I'm not going to bother doing any layout of the label or textfield here
leftPanel.add(label1, new GridBagConstraints());
leftPanel.add(label2, new GridBagConstraints());
rightPanel.add(textField, new GridBagConstraints());
splitPane.setLeftComponent(leftPanel);
splitPane.setRightComponent(rightPanel);
gBC.fill = GridBagConstraints.BOTH;
gBC.weightx = 1.0;
gBC.weighty = 1.0;
getContentPane().add(splitPane, gBC);
pack();
答案 1 :(得分:0)
这是两个不同的问题。在鼠标拖动时调整JPanel的大小 - 最简单的方法是使用两个嵌套的JSplitPanes。您可以使用一个,以便水平拖动,另一个垂直拖动。
或者,如果您不想要拆分窗格,可以尝试使用此方法,并创建自定义JPanel。边界是为了使效果更加明显。我个人不喜欢它,因为它过于复杂。
public class ResizablePanel extends JPanel {
private boolean drag = false;
private Point dragLocation = new Point();
public ResizablePanel() {
setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
setPreferredSize(new Dimension(500, 500));
final JFrame f = new JFrame("Test");
addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
drag = true;
dragLocation = e.getPoint();
}
@Override
public void mouseReleased(MouseEvent e) {
drag = false;
}
});
addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseDragged(MouseEvent e) {
if (drag) {
if (dragLocation.getX()> getWidth()-10 && dragLocation.getY() > getHeight()-10) {
System.err.println("in");
setSize((int)(getWidth()+(e.getPoint().getX()-dragLocation.getX())),
(int)(getHeight()+(e.getPoint().getY()-dragLocation.getY())));
dragLocation = e.getPoint();
}
}
}
});
f.getContentPane().setLayout(new BorderLayout());
f.getContentPane().add(this,BorderLayout.CENTER);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.pack();
f.setVisible(true);
}
public static void main(String[] args) {
new ResizablePanel();
}
public void paintComponent(Graphics g) {
g.setColor(Color.red);
g.fillRect(0, 0, getWidth(), getHeight());
}
}
答案 2 :(得分:0)
至于孩子用它的父母调整大小,使用GridBagLayout很容易。
GridBagConstraints中要记住的重要部分是fill,weightx和weighty。
你可以在你的框架中做这样的事情 - 它会在其中放置一个带有JTable的滚动窗格,它将随框架调整大小:
JScrollPane jScrollPane1 = new JScrollPane();
JTable jTable1 = new JTable();
GridBagConstraints gBC = new GridBagConstraints();
getContentPane().setLayout(new GridBagLayout());
jScrollPane1.setViewPortView(jTable1);
gBC.fill = GridBagConstraints.BOTH;
gBC.weightx = 1.0;
gBC.weighty = 1.0;
getContentPane().add(jScrollPane1, gBC);