JXCollapsiblePane от SwingX, не работи правилно

Наскоро намерих swingx и исках да експериментирам с JXCollapsiblePane. Но не мога да го накарам да работи. Намерих този код:

   Action toggleAction = collapsiblePane.getActionMap().
   get(JXCollapsiblePane.TOGGLE_ACTION);
   toggleButton.setAction(toggleAction);

Но щракването върху бутона не прави нищо. Ако задам прозореца да се свие първоначално, при щракване върху бутона панелът се затваря БЕЗ анимация и последващите кликвания не правят нищо. Ужасен съм в програмирането, моля, дайте съвет.

РЕДАКТИРАНЕ Използвам IDE Netbeans за плъзгане и пускане на компонент в рамката

collapsiblePane = new org.jdesktop.swingx.JXCollapsiblePane();
collapsiblePane.setCollapsed(true);

EDIT2 Добре, проблемът беше, че беше настроено да превключва НАГОРЕ, но нямаше място за свиване, промених го на ДЯСНО и донякъде работи, но все още нямаше анимация. Опитах се просто да създам рамка и панел ръчно и работи добре. Предполагам, че проблемът е в начина, по който плъгинът на gui добавя сгъваем панел към рамката.

Може би някой с опит в работата с JXCollapsiblePane и Netbeans може да помогне

РЕДАКТИРАНЕ3 въведете описание на изображението тук

въведете описание на изображението тук

Когато сгъваемият панел се отваря, други неща в рамката не се движат. Създавам панел от gui builder, поставям JPanel в него, някои бутони и текстови полета в панела; и етикет и бутон от код:

initComponents();
        setLayout(new BorderLayout());            
         add(new JLabel("JLabelFromCode", JLabel.CENTER)); 
         JPanel buttonPanel = new JPanel(); 
         add(buttonPanel, BorderLayout.SOUTH); 
         collapsingButtonFromCode = new JButton(); 
         collapsingButtonFromCode.setText("toggleButtonFromCode"); 
         buttonPanel.add(collapsingButtonFromCode);                     
         buttonFromCode.addActionListener(collapsiblePane.getActionMap().get( 
                JXCollapsiblePane.TOGGLE_ACTION));
         collapsingButtonFromCode.addActionListener(collapsiblePane.getActionMap().get( 
                JXCollapsiblePane.TOGGLE_ACTION));
         setVisible(true);

initComponents() е методът, създаден от IDE, който дефинира оформлението, не мога да го редактирам и мисля, че този метод е проблемът:

java.awt.GridBagConstraints gridBagConstraints;

        buttonFromCode = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();
        collapsiblePane = new org.jdesktop.swingx.JXCollapsiblePane();
        jPanel1 = new javax.swing.JPanel();
        jButton1 = new javax.swing.JButton();
        jLabel2 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        jTextField1 = new javax.swing.JTextField();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        buttonFromCode.setText("CollapseButtonFromGuiBuilder");

        jLabel1.setText("jLabel1");

        jPanel1.setBackground(new java.awt.Color(102, 102, 102));
        jPanel1.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.LOWERED));

        jButton1.setText("jButton1");

        jLabel2.setText("jLabel2");

        jLabel3.setText("jLabel3");

        jTextField1.setText("jTextField1");

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGap(34, 34, 34)
                .addComponent(jButton1)
                .addGap(76, 76, 76)
                .addComponent(jLabel2)
                .addGap(186, 186, 186)
                .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(193, Short.MAX_VALUE))
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
                .addContainerGap(337, Short.MAX_VALUE)
                .addComponent(jLabel3)
                .addGap(296, 296, 296))
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGap(30, 30, 30)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jButton1)
                    .addComponent(jLabel2)
                    .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jLabel3)
                .addContainerGap(22, Short.MAX_VALUE))
        );

        collapsiblePane.getContentPane().add(jPanel1);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addGap(10, 10, 10)
                        .addComponent(jLabel1)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(buttonFromCode, javax.swing.GroupLayout.PREFERRED_SIZE, 249, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(44, 44, 44))
                    .addComponent(collapsiblePane, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 661, javax.swing.GroupLayout.PREFERRED_SIZE)))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(collapsiblePane, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(buttonFromCode)
                    .addComponent(jLabel1))
                .addContainerGap(22, Short.MAX_VALUE))
        );

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

person bunnyjesse112    schedule 08.12.2011    source източник
comment
(все пак не съм съвсем сигурен дали вече сте го решили?) трябва да работи - както @Robin вече каза - време е за SSCCE, за да видите какво става   -  person kleopatra    schedule 09.12.2011
comment
моля вижте последната редакция   -  person bunnyjesse112    schedule 12.12.2011
comment
това не е sscce :-) Освен това, ако инструментът ви пречи, не го използвайте ...   -  person kleopatra    schedule 12.12.2011
comment
често срещано ... Google е на една ръка разстояние ...   -  person kleopatra    schedule 12.12.2011
comment
между другото, тази (основно произведена от netbeans) бъркотия изглежда така, сякаш смесвате оформлението на builder (направено в initComponents) с някои ръчно кодирани (нещата след извикване на initComponents) - това е наистина лоша идея: или нека строителят прави всичко или ръчно кодира всичко (което бих препоръчал, тъй като е трудно да се разбере какво прави строителят, този код не е предназначен за четене от хора ;-)   -  person kleopatra    schedule 12.12.2011
comment
Но това е проблемът. Със строителя CollapsiblePane не работи както се предполага.   -  person bunnyjesse112    schedule 12.12.2011


Отговори (2)


ето кодов фрагмент, който може да симулира проблема (няма да докосне GroupLayout по каквато и да е причина): сгъваемият елемент се поставя вътре в контейнер с BoxLayout (който разпределя излишната височина между компонентите, докато се достигне тяхната максимална). Като следствие, той оразмерява компонент с нулев преф-размер - като сгънат сгъваем - въпреки това до нещо... което води до трудно предвидимо поведение. Разкоментирането на замяната го прави добре работещ. Може да са подобни в групата.

Като алтернатива, поставете сгъваемия елемент в оформление, което винаги се оразмерява според предпочитанията - това е може би най-безопасният вариант, тъй като анимацията повече или по-малко разчита на това да бъде оразмерена според предпочитанията по всяко време.

    JXCollapsiblePane top = new JXCollapsiblePane() {

//            @Override
//            public Dimension getMaximumSize() {
//                return getPreferredSize();
//            }

    };
    top.add(new JLabel("some random label"));
    top.add(new JLabel("and another"));
    top.add(new JButton(top.getActionMap().get(JXCollapsiblePane.TOGGLE_ACTION)));
    top.setCollapsed(true);
    JXFrame frame = new JXFrame("collapsible in top", true);
    frame.setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.PAGE_AXIS));
    frame.add(top, BorderLayout.NORTH);
    frame.add(new JScrollPane(new JXTable(50, 4)));
    frame.add(new JButton(top.getActionMap().get(JXCollapsiblePane.TOGGLE_ACTION)), BorderLayout.SOUTH);
    frame.pack();
    frame.setVisible(true);

Редактиране

имаме отворен проблем в SwingX, който може да показва свързан „проблем“. Въпреки че, като се замисля сега, бих казал, че това всъщност не е грешка: Оразмеряването на сгъваемия винаги (разгънат/свит или по време на анимация) предоставя LayoutManager, който зачита prefSize, поне не нараства отвъд (с/извън макс. подвързани, няма толкова голямо значение - те така или иначе са свободни да оразмеряват каквото си искат). В противен случай не мога да измисля надежден начин да има едновременно анимация и нулев свит размер. Идеи са добре дошли :-)

person kleopatra    schedule 12.12.2011
comment
не, само пример (между другото: какво се случи, когато го премахнахте? Или с други думи: просто опитайте - заменете с какъвто контейнер искате - за това са предназначени примерните фрагменти :-) - person kleopatra; 12.12.2011
comment
Ако задам оформление за сгъваем панел, той започва да работи правилно. Благодаря, че ми помогна още веднъж, клеопатра! ти си страхотен! - person bunnyjesse112; 13.12.2011

Тъй като публикуваният от вас код е само копие от javadoc на JXCollapsiblePane, изглежда добре и проблемът най-вероятно се намира някъде другаде.

За анимацията проверихте ли дали анимацията на вашия сгъваем панел действително е активирана (вижте isAnimated). Можете да го настроите на анимиран чрез обаждане

collapsiblePane.setAnimated( true );

Тъй като бутонът работи за свиване на панела, а действието, отговорно за свиването/разгъването, има доста проста реализация (вижте изходен код) Мисля, че проблемът се намира другаде. Можете ли да публикувате код за това къде добавяте панела към потребителския си интерфейс. Може би родителският контейнер не позволява на компонента да се разшири, след като бъде свит.

person Robin    schedule 08.12.2011