Java 在多层窗格中排列新叶的问题(使用SSCCE)

Java 在多层窗格中排列新叶的问题(使用SSCCE),java,swing,jtable,swingx,jxmultisplitpane,Java,Swing,Jtable,Swingx,Jxmultisplitpane,我正在创建一个应用程序,它将表格添加到表单中,并以特定的布局进行排列。每次需要将新表添加到表单时,我都会在MultiplitPane中创建一个新叶,并且我会将新表添加到叶。一切正常,直到我移动了一个分隔器,然后尝试添加新的叶子,里面有一张桌子 有人知道是什么导致了这场混乱,我该如何修复它吗 这是一个可以复制的可用SSCCE: import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; im

我正在创建一个应用程序,它将表格添加到表单中,并以特定的布局进行排列。每次需要将新表添加到表单时,我都会在MultiplitPane中创建一个新叶,并且我会将新表添加到叶。一切正常,直到我移动了一个分隔器,然后尝试添加新的叶子,里面有一张桌子

有人知道是什么导致了这场混乱,我该如何修复它吗

这是一个可以复制的可用SSCCE:

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Event;
import java.awt.GraphicsConfiguration;
import java.awt.PopupMenu;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import org.jdesktop.swingx.MultiSplitLayout;
import org.jdesktop.swingx.MultiSplitPane;

/**
 * @author Igor
*/
public class Example extends javax.swing.JFrame {

/**
 * Creates new form Example
 */
@Override
public void add(Component cmpnt, Object o) {
    super.add(cmpnt, o);
}

@Override
public void add(PopupMenu pm) {
    super.add(pm);
}

@Override
public boolean action(Event event, Object o) {
    return super.action(event, o);
}

public Example(GraphicsConfiguration gc) {
    super(gc);
}

@Override
public Component add(Component cmpnt, int i) {
    return super.add(cmpnt, i);
}

@Override
public Component add(Component cmpnt) {
    return super.add(cmpnt);
}
// Initialize a MultiSplitPane
MultiSplitPane multiSplitPane = new MultiSplitPane();
int boxCount = 0;
String left = " (LEAF name=left0 weight=1)";
String right = "(LEAF name=right0 weight=0)";
String layoutDef = "(ROW" + left + " " + right + ")";
MultiSplitLayout.Node modelRoot = MultiSplitLayout.parseModel(layoutDef);

public Example() {
    initComponents();

    multiSplitPane.getMultiSplitLayout().setModel(modelRoot);
    setLayout(new BorderLayout());
    add(new JScrollPane(multiSplitPane), BorderLayout.CENTER);
    add(new JButton("Go") {
        {
            addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    Example.this.addNode();
                }
            });
        }
    }, BorderLayout.SOUTH);

    setDefaultCloseOperation(EXIT_ON_CLOSE);
    pack();

}
//a function that adds a new Leaf to the multiSplitPane
private void addNode() {

    if (boxCount == 1) {
        left = " (LEAF name=left0 weight=0.5)";
        right = " (LEAF name=right0 weight=0.5)";
    } else if (boxCount == 2) {
        left = "(COLUMN weight=0.5 left0 left" + new Integer(boxCount - 1).toString() + ")";
    } else if (boxCount == 3) {
        right = "(COLUMN weight=0.5 right0 right" + new Integer(boxCount - 2).toString() + ")";
    } else if ((boxCount % 2 == 0) && (boxCount != 0)) {
        left = left.substring(0, left.length() - 1);
        left += " left" + new Integer(boxCount / 2).toString() + ")";
    } else if ((boxCount % 2 != 0)) {
        right = right.substring(0, right.length() - 1);
        right += " right" + new Integer(boxCount / 2).toString() + ")";
    }
    String layoutDef = "(ROW " + left + " " + right + ")";
    MultiSplitLayout.Node modelRoot = MultiSplitLayout.parseModel(layoutDef);
    multiSplitPane.getMultiSplitLayout().setModel(modelRoot);

    JTable t = new JTable(1, 1);
    t.getColumnModel().getColumn(0).setHeaderValue("Box Title" + boxCount);
    Dimension dimension = new Dimension(190, 190);
    t.setPreferredScrollableViewportSize(dimension);
    t.setRowHeight(800);

    if (boxCount == 0) {
        multiSplitPane.add(new JScrollPane(t), "left0");
    } else if (boxCount == 1) {
        multiSplitPane.add(new JScrollPane(t), "right0");
    } else if (boxCount == 2) {
        multiSplitPane.add(new JScrollPane(t), "left1");
    } else if (boxCount == 3) {
        multiSplitPane.add(new JScrollPane(t), "right1");
    } else if (boxCount % 2 == 0) {
        multiSplitPane.add(new JScrollPane(t), "left" + new Integer(boxCount / 2).toString());
    } else if (boxCount % 2 != 0) {
        multiSplitPane.add(new JScrollPane(t), "right" + new Integer(boxCount / 2).toString());
    }

    multiSplitPane.revalidate();
    boxCount++;
}// End of AddNode *****************

/**
 * This method is called from within the constructor to initialize the form.
 * WARNING: Do NOT modify this code. The content of this method is always
 * regenerated by the Form Editor.
 */
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 400, Short.MAX_VALUE)
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 300, Short.MAX_VALUE)
    );

    pack();
}// </editor-fold>

/**
 * @param args the command line arguments
 */
public static void main(String args[]) {
    /* Set the Nimbus look and feel */
    //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
    /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
     * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
     */
    try {
        for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                javax.swing.UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }
    } catch (ClassNotFoundException ex) {
        java.util.logging.Logger.getLogger(Example.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
        java.util.logging.Logger.getLogger(Example.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        java.util.logging.Logger.getLogger(Example.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(Example.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    }
    //</editor-fold>

    /* Create and display the form */
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new Example().setVisible(true);
        }
    });
}
// Variables declaration - do not modify
// End of variables declaration
}
导入java.awt.BorderLayout;
导入java.awt.Component;
导入java.awt.Dimension;
导入java.awt.Event;
导入java.awt.GraphicsConfiguration;
导入java.awt.PopupMenu;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.*;
导入org.jdesktop.swingx.multiplitlayout;
导入org.jdesktop.swingx.multiplitpane;
/**
*@作者伊戈尔
*/
公共类示例扩展了javax.swing.JFrame{
/**
*创建新表单示例
*/
@凌驾
公共无效添加(组件cmpnt,对象o){
super.add(cmpnt,o);
}
@凌驾
公共无效添加(弹出菜单pm){
super.add(pm);
}
@凌驾
公共布尔操作(事件,对象o){
返回超级动作(事件,o);
}
公共示例(图形配置gc){
超级(gc);
}
@凌驾
公共组件添加(组件cmpnt,int i){
返回super.add(cmpnt,i);
}
@凌驾
公共组件添加(组件cmpnt){
返回super.add(cmpnt);
}
//初始化MultiplitPane
MultiplitPane MultiplitPane=新的MultiplitPane();
int-boxCount=0;
字符串left=“(叶名称=left0权重=1)”;
字符串right=“(叶名称=right0权重=0)”;
字符串layoutDef=“(行“+左+”+右+”);
multiplitlayout.Node modelRoot=multiplitlayout.parseModel(layoutDef);
公共示例(){
初始化组件();
multiplitpane.getmultiplitlayout().setModel(modelRoot);
setLayout(新的BorderLayout());
添加(新的JScrollPane(MultiplitPane),BorderLayout.CENTER);
添加(新的JButton(“Go”){
{
addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
Example.this.addNode();
}
});
}
},边界布局(南部);
setDefaultCloseOperation(关闭时退出);
包装();
}
//向MultiplitPane添加新叶的函数
私有void addNode(){
如果(boxCount==1){
left=“(叶名称=left0权重=0.5)”;
right=“(叶名称=right0重量=0.5)”;
}else if(boxCount==2){
left=“(列权重=0.5 left0 left”+新整数(boxCount-1).toString()+”;
}否则如果(boxCount==3){
right=“(列权重=0.5 right0 right”+新整数(boxCount-2).toString()+”;
}否则如果((boxCount%2==0)和(&(boxCount!=0)){
left=left.substring(0,left.length()-1);
左+=“左”+新整数(boxCount/2).toString()+”;
}否则如果((箱数%2!=0)){
right=right.substring(0,right.length()-1);
右+=“右”+新整数(boxCount/2).toString()+”;
}
字符串layoutDef=“(行“+左+”+右+”);
multiplitlayout.Node modelRoot=multiplitlayout.parseModel(layoutDef);
multiplitpane.getmultiplitlayout().setModel(modelRoot);
JTable t=新的JTable(1,1);
t、 getColumnModel().getColumn(0).setHeaderValue(“框标题”+boxCount);
尺寸=新尺寸(190190);
t、 setPreferredScrollableViewportSize(维度);
t、 设置行高(800);
如果(boxCount==0){
添加(新的JScrollPane(t),“left0”);
}else if(boxCount==1){
添加(新的JScrollPane(t),“right0”);
}else if(boxCount==2){
添加(新的JScrollPane(t),“left1”);
}否则如果(boxCount==3){
添加(新的JScrollPane(t),“right1”);
}else if(箱数%2==0){
add(新的JScrollPane(t),“left”+新的整数(boxCount/2).toString());
}否则如果(箱数%2!=0){
add(新的JScrollPane(t),“right”+新的整数(boxCount/2).toString());
}
multiplitpane.revalidate();
boxCount++;
}//AddNode的结尾*****************
/**
*从构造函数中调用此方法来初始化表单。
*警告:不要修改此代码。此方法的内容始终为
*由表单编辑器重新生成。
*/
@抑制警告(“未选中”)
// 
私有组件(){
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
javax.swing.GroupLayout=newjavax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(布局);
layout.setHorizontalGroup(
createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0,400,短。最大值)
);
layout.setVerticalGroup(
createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0,300,短。最大值)
);
包装();
}// 
/**
*@param指定命令行参数
*/
公共静态void main(字符串参数[]){
/*设置Nimbus的外观和感觉*/
//
/*如果Nimbus(在JavaSE6中引入)不可用,请使用默认的外观。
*详情请参阅http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
*/
试一试{
for(javax.swing.UIManager.LookAndFeelInfo:javax.swing.UIManager.getInstalledLookAndFeels()){
if(“Nimbus”.equals(info.getName())){
setLookAndFeel(info.getClassName());
打破
}
}
}捕获(ClassNotFoundException ex){
java.util.logging.Logger.getLogger(例如.class.getName()).log(java.util.logging.Level.SEVERE,null,ex);
}catch(实例化异常){
java.util.logging.Logger.getLogger(例如.class.getName()).log(java.util.loggi
import org.jdesktop.swingx.MultiSplitPane;