gpt4 book ai didi

java哪个布局管理器适合这个任务?

转载 作者:搜寻专家 更新时间:2023-11-01 01:11:19 25 4
gpt4 key购买 nike

我有一个 JPanel parent ,里面有 3 个 JPanel child 。它们目前都使用 GridLayout 并一起代表一个 UML 类。问题是当我添加一个新的属性或方法时,所有 3 个 JPanel 都会增长到相同的大小。

希望的行为是:

  1. 每当添加方法或属性时,标题框的大小始终保持不变。
  2. 添加方法后,只有方法面板变大,标题和属性面板的大小保持不变。
  3. 添加属性时,只有属性面板会变大,其他面板大小保持不变。

每当添加方法/属性时,父 JPanel 已经可以自动增长/收缩。我正在玩弄 GridBagLayout atm,但我离期望的结果还很远。

有没有一种简单(或更简单)的方法可以解决这个问题?!

这里有几张照片来展示我的情况。

一个新创建的 UML 类 => enter image description here这就是它目前的行为方式 => enter image description here

但我想要这个 => enter image description here或者这个=> enter image description here或者这个 => enter image description here

Edit2:为清晰起见添加了新图片。如果原始版本具有误导性,我深表歉意。

Edit3:是的!我整理好了!感觉永远!这是 SSEEC:

子面板

    import java.awt.Component;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.MouseEvent;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.event.MouseInputAdapter;
import javax.swing.event.MouseInputListener;

public class APanel extends JPanel{
private JTextField tf;

public APanel() {
this.setLayout(new GridLayout(0,1));
this.addMouseListener(mouseInputListener);
}

MouseInputListener mouseInputListener = new MouseInputAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("Adding a new text field!");
tf = MyTF.create("Double click");
addNewTF(tf);
Component source = (Component) e.getSource();
Container c = source.getParent();
while(true) {
if(c instanceof PPanel)
break;
else
c=c.getParent();
}
PPanel p = (PPanel) c;
p.expand();
}
};

public void addNewTF(JTextField tf) {
this.add(tf);
this.setSize(this.getWidth(), this.getHeight()+tf.getHeight());
this.revalidate();
this.repaint();

}
}

父面板:

    import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class PPanel extends JPanel{
//private APanel panel1;
private JPanel panel1;
private APanel panel2;
private APanel panel3;
public PPanel() {

this.setLayout(new BoxLayout(this , BoxLayout.Y_AXIS));
this.setBackground(Color.black);

panel1 = new JPanel();
panel1.setLayout(new GridLayout(0,1));
panel1.add(new JTextField("title"));
panel2 = new APanel();
panel2.setBorder(BorderFactory.createLineBorder(Color.red));
panel3 = new APanel();
panel3.setBorder(BorderFactory.createLineBorder(Color.black));

this.add(panel1);
this.add(Box.createRigidArea(new Dimension(0,1)));
this.add(panel2);
this.add(panel3);


}
public void expand() {
this.setSize(this.getWidth(), this.getHeight()+33);
this.revalidate();
this.repaint();
}
public static void main(String[] args) {
JFrame frame = new JFrame();
PPanel panel = new PPanel();
panel.setBounds(10, 10, 100, 150);
JPanel c = new JPanel(null);
c.add(panel);
frame.add(c);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(new Dimension(350, 300));
frame.setTitle("Demo");
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}

帮助类:

    import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.event.MouseEvent;
import javax.swing.JTextField;
import javax.swing.event.MouseInputAdapter;
import javax.swing.event.MouseInputListener;

public class MyTF {
public static JTextField create(String name) {
final JTextField tf = new JTextField(name);
System.out.println(tf.getPreferredSize());
tf.setPreferredSize(new Dimension(100,33));
tf.addMouseListener(mouseInputListener);
return tf;
}

static MouseInputListener mouseInputListener = new MouseInputAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
Component source = (Component) e.getSource();
Container c = source.getParent();
while(true) {
if(c instanceof PPanel)
break;
else if(c instanceof APanel)
{
c.dispatchEvent(e);
c = c.getParent();
break;

}
else
c=c.getParent();
}
c.dispatchEvent(e);
}

};
}

我放弃了使用 GridBagLayout 的努力,这对我来说实在是太多了。然后我按照建议尝试了 borderLayout,但也无法像我想要的那样工作。最后是 BoxLayout,它应该可以工作,但我的代码中有一个错误!所以当我尝试 0verbose code suggest 并尝试使用它时,它失败了!直到,我完成了 SSEEC,做了最后的编译并在我决定发布之前运行它(我在这一点上几乎放弃了)然后我意识到它有效......可以在自己的空间中生长的面板,他们不要互相干扰。

我就像 WTF!

回到我的代码并与 SSEEC 进行比较,发现有一个错误,用于扩展面板高度的代码在错误的位置,所以它们有点像互相吞噬空间。

更好!我可以用一个像素指定中间框与其上方和下方框之间的距离。这意味着我仍然可以使用 mKorbel 的技巧来绘制分隔这些框的后线!

编辑 4:我有办法设置组件的大小吗?如果您运行 SSEEC,您会注意到一旦添加了 JTextField,它就会变得很大!它比容器大...

最佳答案

我建议你使用 BoxLayout。这是一个 tutorial .玩弄胶水和刚性区域,您可以获得几乎所有需要的布局。在你的情况下,代码应该是这样的:

JPanel container = new JPanel();
container .setLayout(new BoxLayout(container , BoxLayout.Y_AXIS));

JPanel childTop = new JPanel();
JPanel childCenter = new JPanel();
JPanel childBottom = new JPanel();


childTop.setMaximumSize(...);
childBottom.setMaximumSize(...);

container.add(childTop);
container.add(Box.createVerticalGlue());
container.add(childCenter);
container.add(Box.createVerticalGlue());
container.add(childBottom);

当你需要插入一个新的 child 时,记得把它插入到正确的位置:在其中一个胶水和childCenter之间。例如:

container.add(newChild, 2) ;

关于java哪个布局管理器适合这个任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7224072/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com