Can you make the JToolBar inexplicable?

I would like to make my JToolBar impossible to detach from its container, but still allow the user to drag it to one side of the container.

I know about

public void setFloatable( boolean b )

      

but this will prevent the user from moving the JToolBar completely.

Is there a way to do this without overwriting the ToolBarUI?

Also, is there an option to highlight your new position before deleting it?

+3


source to share


2 answers


It's not the most elegant solution, but it works.

public class Example extends JFrame {

    BasicToolBarUI ui;

    Example() {

        JToolBar tb = new JToolBar();
        tb.add(new JButton("AAAAA"));
        tb.setBackground(Color.GREEN);
        ui = (BasicToolBarUI) tb.getUI();

        getContentPane().addContainerListener(new Listener());
        getContentPane().add(tb, BorderLayout.PAGE_START);

        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(300, 300);
        setLocationRelativeTo(null);
        setVisible(true);
    }

    class Listener implements ContainerListener {

        @Override
        public void componentAdded(ContainerEvent e) {}

        @Override
        public void componentRemoved(ContainerEvent e) {

            if (ui.isFloating()) {
                SwingUtilities.invokeLater(new Runnable() {

                    @Override
                    public void run() {

                        ui.setFloating(false, null);
                    }
                }); 
            }
        }
    }

    public static void main(String[] args) {

        new Example();
    }
}

      

Explanation:



Whenever the toolbar is floated, it is instructed not to do so. The only problem is that you have to wait for the EDT to complete the process of creating the floating window, and only then can you say that it is not floating. As a result, you see that the window is created and then hidden.

Note:

I think that overriding the UI for the toolbar is the best solution, although it is possible that with a more complex approach doing something similar to what I have done will work well as well.

+2


source


  • works for me perfectly correctly on WinOS, old code from SunForum

enter image description here



import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class CaptiveToolBar {

    private Robot robot;
    private JDialog dialog;
    private JFrame frame;

    public static void main(String[] args) {
        //JFrame.setDefaultLookAndFeelDecorated(true);
        //JDialog.setDefaultLookAndFeelDecorated(true);
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new CaptiveToolBar().makeUI();
            }
        });
    }

    public void makeUI() {
        try {
            robot = new Robot();
        } catch (AWTException ex) {
            ex.printStackTrace();
        }
        final JToolBar toolBar = new JToolBar();
        for (int i = 0; i < 3; i++) {
            toolBar.add(new JButton("" + i));
        }
        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 400);
        frame.setLocationRelativeTo(null);
        frame.add(toolBar, BorderLayout.NORTH);

        final ComponentListener dialogListener = new ComponentAdapter() {

            @Override
            public void componentMoved(ComponentEvent e) {
                dialog = (JDialog) e.getSource();
                setLocations(false);
            }
        };
        toolBar.addHierarchyListener(new HierarchyListener() {

            @Override
            public void hierarchyChanged(HierarchyEvent e) {
                Window window = SwingUtilities.getWindowAncestor(toolBar);
                if (window instanceof JDialog) {
                    boolean listenerAdded = false;
                    for (ComponentListener listener : window.getComponentListeners()) {
                        if (listener == dialogListener) {
                            listenerAdded = true;
                            break;
                        }
                    }
                    if (!listenerAdded) {
                        window.addComponentListener(dialogListener);
                    }
                }
            }
        });
        frame.addComponentListener(new ComponentAdapter() {

            @Override
            public void componentMoved(ComponentEvent e) {
                if (dialog != null && dialog.isShowing()) {
                    setLocations(true);
                }
            }
        });
        frame.setVisible(true);
    }

    private void setLocations(boolean moveDialog) {
        int dialogX = dialog.getX();
        int dialogY = dialog.getY();
        int dialogW = dialog.getWidth();
        int dialogH = dialog.getHeight();
        int frameX = frame.getX();
        int frameY = frame.getY();
        int frameW = frame.getWidth();
        int frameH = frame.getHeight();
        boolean needToMove = false;
        if (dialogX < frameX) {
            dialogX = frameX;
            needToMove = true;
        }
        if (dialogY < frameY) {
            dialogY = frameY;
            needToMove = true;
        }
        if (dialogX + dialogW > frameX + frameW) {
            dialogX = frameX + frameW - dialogW;
            needToMove = true;
        }
        if (dialogY + dialogH > frameY + frameH) {
            dialogY = frameY + frameH - dialogH;
            needToMove = true;
        }
        if (needToMove) {
            if (!moveDialog && robot != null) {
                robot.mouseRelease(InputEvent.BUTTON1_MASK);
            }
            dialog.setLocation(dialogX, dialogY);
        }
    }
}

      

+2


source







All Articles