期望的行为是:
1. 标题框的大小始终保持不变,无论何时添加方法或属性。 2. 添加方法时,仅方法面板增大,标题和属性面板的大小保持不变。 3. 添加属性时,仅属性面板增大,其他面板的大小保持不变。
父面板已经可以在添加方法/属性时自动增长/缩小。我正在尝试使用GridBagLayout,但是远未达到期望的结果。
是否有更简单的方法解决这个问题?以下是几张图片展示我的情况。
新创建的UML类 => 当前的行为 => 但我想要这样 => 或这样=> 或这样 => 编辑2:为了更清晰,添加了新图片。如果原始版本有误导性,我非常抱歉。
编辑3:太好了!我解决了这个问题! 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代码建议并尝试调整它时,它失败了!直到我完成SSEEC,进行最终编译和运行之前(实际上在这一点上我已经放弃了),我才意识到它实际上可以工作...这个面板可以在自己的空间内增长,它们不会互相干扰。
我就像是怎么回事啊!
回到我的代码中,将其与SSEEC进行比较,发现有一个bug,面板高度扩展的代码位置错了,因此它们会相互侵占空间。
更好的是!我可以通过一个像素指定中间框与上下框之间的距离。这意味着我仍然可以使用mKorbel的技巧来绘制分隔这些框的背景线!
编辑4:有没有办法设置组件的大小?如果你运行SSEEC,你会注意到一旦添加JTextField,它就非常巨大!它比容器还要大...