JideSplitButton rounded border

This is the forum for JIDE Common Layer which is open sourced at https://github.com/jidesoft/jide-oss. Please note, JIDE technical support doesn't monitor this forum as often as other forums. Please consider subscribe for technical support for JIDE Common Layer so that you can use customer only forum to get a timely response.

Moderator: JIDE Support

Forum rules
Community driven forum for open source JIDE Common Layer. JIDE technical support doesn't monitor this forum as often as other forums. If you only use JIDE Common Layer, please consider subscribing for technical support for JIDE Common Layer so that you can use customer only forum to get a timely response.

JideSplitButton rounded border

Postby sgr » Tue Feb 11, 2014 2:18 am

Hello,

I have been trying to make JideSplitButton(without modifying BasicJideSplitButtonUI) to use a rounded border, same as the one used by the basic JButton but with no success.
I have inspected a bit the BasicJideSplitButtonUI class and observed that custom borders are ignored completely by the painting code.

So the question is: How can I customize the JideSplitButton or any jide button to look more like the rest of the non-jide buttons?
I am running on Windows 7 Prof x64 with JDK 1.7.0_45. Ideally I think the BasicJideSplitButtonUI class should use the proper border based on the current L&F and/or button style.

I have modified the JideSplitButtonDemo to add a new JButton and use the setBorder() method on JideSplitButton as follows to show you what I am trying to do:
Code: Select all
/*
 * @(#)JideSplitButtonDemo.java 3/19/2005
 *
 * Copyright 2002 - 2005 JIDE Software Inc. All rights reserved.
 */

import com.jidesoft.plaf.LookAndFeelFactory;
import com.jidesoft.swing.JideSplitButton;
import com.jidesoft.swing.JideSwingUtilities;
import com.jidesoft.swing.JideToggleSplitButton;

import javax.swing.*;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

/**
 * Demoed Component: {@link com.jidesoft.swing.JideButton} <br> Required jar files: jide-common.jar, jide-components.jar
 * <br> Required L&F: Jide L&F extension required
 */
public class JideSplitButtonDemo extends AbstractDemo {
    private static final long serialVersionUID = -8707660318949717143L;
    private JideSplitButton[] _buttons;

    public JideSplitButtonDemo() {
    }

    public String getName() {
        return "JideSplitButton Demo";
    }

    public String getProduct() {
        return PRODUCT_NAME_COMMON;
    }

    @Override
    public String getDescription() {
        return "JideSplitButton is a combination of button and menu. It has a button part just like JideButton but it also has a menu part where a popup menu could be added.\n" +
                "\n" +
                "Demoed classes:\n" +
                "com.jidesoft.swing.JideSplitButton\n";
    }

    public Component getDemoPanel() {
        int numberOfButtons = 8;
        JPanel panel = new JPanel(new GridLayout(numberOfButtons+1, 1, 2, 2));
        _buttons = new JideSplitButton[numberOfButtons];
        int i = 0;
        _buttons[i++] = createJideSplitButton("Copy the text", ButtonsIconsFactory.getImageIcon(ButtonsIconsFactory.Buttons.COPY));
        _buttons[i++] = createJideSplitButton("Cut the text", ButtonsIconsFactory.getImageIcon(ButtonsIconsFactory.Buttons.CUT));
        _buttons[i++] = createJideSplitButton("Paste the text", ButtonsIconsFactory.getImageIcon(ButtonsIconsFactory.Buttons.PASTE));
        _buttons[i++] = createJideSplitButton("Delete the text", ButtonsIconsFactory.getImageIcon(ButtonsIconsFactory.Buttons.DELETE));
        _buttons[i++] = createJideSplitButton("Refresh the content", ButtonsIconsFactory.getImageIcon(ButtonsIconsFactory.Buttons.REFRESH));
        _buttons[i++] = createJideSplitButton("Undo the action", ButtonsIconsFactory.getImageIcon(ButtonsIconsFactory.Buttons.UNDO));
        _buttons[i++] = createJideSplitButton("Redo the action", ButtonsIconsFactory.getImageIcon(ButtonsIconsFactory.Buttons.REDO));
        _buttons[i] = createJideSplitButton("Action history", ButtonsIconsFactory.getImageIcon(ButtonsIconsFactory.Buttons.HISTORY));

        for (JideSplitButton button : _buttons) {
            panel.add(button);
        }
       
        panel.add(new JButton("JButton"));

        return JideSwingUtilities.createTopPanel(panel);
    }

    @Override
    public String getDemoFolder() {
        return "B4.JideButton";
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                LookAndFeelFactory.installDefaultLookAndFeelAndExtension();
                showAsFrame(new JideSplitButtonDemo());
            }
        });
    }

    @Override
    public Component getOptionsPanel() {
        JPanel switchPanel = new JPanel(new GridLayout(0, 1, 2, 2));

        final JRadioButton style1 = new JRadioButton("Toolbar Style");
        final JRadioButton style2 = new JRadioButton("Toolbox Style");
        final JRadioButton style3 = new JRadioButton("Flat Style");

        ButtonGroup buttonGroup = new ButtonGroup();
        buttonGroup.add(style1);
        buttonGroup.add(style2);
        buttonGroup.add(style3);

        switchPanel.add(new JLabel("Styles:"));
        switchPanel.add(style1);
        switchPanel.add(style2);
        switchPanel.add(style3);
        style1.setSelected(true);

        ItemListener itemListener = new ItemListener() {
            public void itemStateChanged(ItemEvent e) {
                if (style1.isSelected()) {
                    for (JideSplitButton button : _buttons) {
                        button.setButtonStyle(JideSplitButton.TOOLBAR_STYLE);
                    }
                }
                else if (style2.isSelected()) {
                    for (JideSplitButton button : _buttons) {
                        button.setButtonStyle(JideSplitButton.TOOLBOX_STYLE);
                    }
                }
                else if (style3.isSelected()) {
                    for (JideSplitButton button : _buttons) {
                        button.setButtonStyle(JideSplitButton.FLAT_STYLE);
                    }
                }
            }
        };
        style1.addItemListener(itemListener);
        style2.addItemListener(itemListener);
        style3.addItemListener(itemListener);

        switchPanel.add(new JLabel("Options: "));

        final JCheckBox option1 = new JCheckBox("Button part enabled");
        final JCheckBox option2 = new JCheckBox("Both parts enabled");
        final JCheckBox option3 = new JCheckBox("Button part selected");
        final JCheckBox option4 = new JCheckBox("Always Dropdown");

        switchPanel.add(option1);
        switchPanel.add(option2);
        switchPanel.add(option3);
        switchPanel.add(option4);

        option1.setSelected(true);
        option1.addItemListener(new ItemListener() {
            public void itemStateChanged(ItemEvent e) {
                for (JideSplitButton button : _buttons) {
                    button.setButtonEnabled(option1.isSelected());
                }
            }
        });

        option2.setSelected(true);
        option2.addItemListener(new ItemListener() {
            public void itemStateChanged(ItemEvent e) {
                for (JideSplitButton button : _buttons) {
                    button.setEnabled(option2.isSelected());
                }
            }
        });

        option3.addItemListener(new ItemListener() {
            public void itemStateChanged(ItemEvent e) {
                for (JideSplitButton button : _buttons) {
                    button.setButtonSelected(option3.isSelected());
                }
            }
        });

        option4.addItemListener(new ItemListener() {
            public void itemStateChanged(ItemEvent e) {
                for (JideSplitButton button : _buttons) {
                    button.setAlwaysDropdown(option4.isSelected());
                }
            }
        });

        return switchPanel;
    }

    static JideSplitButton createJideSplitButton(String name, Icon icon) {
        final JideSplitButton button = new JideSplitButton(name);
        button.setIcon(icon);
        button.add(new AbstractAction("Sample Menu Item") {
            public void actionPerformed(ActionEvent e) {
            }
        });
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                System.out.println("button is clicked");
            }
        });
        button.getPopupMenu().addPopupMenuListener(new PopupMenuListener() {
            public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
                System.out.println("menu is clicked");
            }

            public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
            }

            public void popupMenuCanceled(PopupMenuEvent e) {
            }
        });
        button.setFocusable(false);
       
        button.setBorderPainted(true);
        button.setBorder(UIManager.getBorder("Button.border"));
       
        return button;
    }

    static JideSplitButton createJideToggleSplitButton(String name, Icon icon) {
        final JideSplitButton button = new JideToggleSplitButton(name);
        button.setIcon(icon);
        button.add(new AbstractAction("Sample Menu Item") {
            public void actionPerformed(ActionEvent e) {
            }
        });
        button.setFocusable(false);
        return button;
    }
}


And here's a screenshot of the end result on my environment:
JideSplitButtonDemo-ss.png
JideSplitButtonDemo
JideSplitButtonDemo-ss.png (53.38 KiB) Viewed 14771 times
sgr
 
Posts: 104
Joined: Wed Jul 26, 2006 4:53 am
Location: Greece

Re: JideSplitButton rounded border

Postby JIDE Support » Tue Feb 11, 2014 8:11 am

Unfortunately you will have to write your own SplitButtonUI to do it. The two parts can be pressed separately prevents the split button to use a simple border.
JIDE Software Technical Support Team
JIDE Support
Site Admin
 
Posts: 37219
Joined: Sun Sep 14, 2003 10:49 am

Re: JideSplitButton rounded border

Postby sgr » Sat Feb 15, 2014 1:49 am

Hello,

Not really the answer I was hoping for.... :)

Since this is not really a show-stopper and I currently do not have the time to do it my self I will have to live with it,
at least until the users start to really to complaint about it...
Anyways, I will let you know in case I have a successful attempt at this.

Thanks,
sgr
 
Posts: 104
Joined: Wed Jul 26, 2006 4:53 am
Location: Greece


Return to JIDE Common Layer Open Source Project Discussion (Community Driven)

Who is online

Users browsing this forum: Google [Bot] and 12 guests

cron