I've been having a strange problem. I have adapted your demo DockingFrameworkDemo to add new frames to a window on demand (the user hits CTRL + N -> ENTER), and I am trying to add the new frame to exactly the same location as the previous frame. However, I am having two problems:
1) the new frame is not added to the same location and is therefore not tabbed, even though the initIndex, initMode and initSide are exactly the same?
2) If I change the docking side of the new tab to DOCK_SIDE_CENTER nothing gets added to the frame?
I've attached my code below.
- Code: Select all
import java.awt.Component;
import java.awt.Dimension;
import java.awt.HeadlessException;
import java.awt.KeyEventDispatcher;
import java.awt.KeyboardFocusManager;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowFocusListener;
import java.util.Collections;
import java.util.List;
import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.border.Border;
import com.google.common.collect.Lists;
import com.jidesoft.docking.DefaultDockableHolder;
import com.jidesoft.docking.DockContext;
import com.jidesoft.docking.DockableFrame;
import com.jidesoft.docking.DockingManager;
import com.jidesoft.icons.JideIconsFactory;
import com.jidesoft.plaf.LookAndFeelFactory;
import com.jidesoft.swing.ComboBoxSearchable;
import com.jidesoft.swing.JideScrollPane;
public class DockingFrameworkDemo2 extends DefaultDockableHolder {
private static DockingFrameworkDemo2 _frame;
public static String _lastDirectory = ".";
private static final String PROFILE_NAME = "jidesoft";
private static boolean _autohideAll = false;
private static WindowAdapter _windowListener;
public static JMenuItem _redoMenuItem;
public static JMenuItem _undoMenuItem;
public static long counter = System.currentTimeMillis();
public DockingFrameworkDemo2(String title) throws HeadlessException {
super(title);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
LookAndFeelFactory.installDefaultLookAndFeelAndExtension();
new DockingFrameworkDemo2("Test").showDemo(true);
}
});
}
public DefaultDockableHolder showDemo(final boolean exit) {
KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
manager.addKeyEventDispatcher(new MyDispatcher());
_frame = new DockingFrameworkDemo2("Demo of JIDE Docking Framework");
_frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
_frame.getDockingManager().setXmlFormat(true);
_frame.setIconImage(JideIconsFactory.getImageIcon(JideIconsFactory.JIDE32).getImage());
// add a window listener to do clear up when windows closing.
_windowListener = new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
super.windowClosing(e);
clearUp();
if (exit) {
System.exit(0);
}
}
};
_frame.addWindowListener(_windowListener);
_frame.getDockingManager().setProfileKey(PROFILE_NAME);
_frame.getDockingManager().setOutlineMode(DockingManager.FULL_OUTLINE_MODE);
_frame.setJMenuBar(createMenuBar());
_frame.getDockingManager().setUndoLimit(10);
_frame.getDockingManager().beginLoadLayoutData();
_frame.getDockingManager().setInitSplitPriority(DockingManager.SPLIT_EAST_WEST_SOUTH_NORTH);
_frame.getDockingManager().addFrame(createSampleCommandFrame());
_frame.getDockingManager().getWorkspace().setAcceptDockableFrame(false);
_frame.getDockingManager().getWorkspace().setAdjustOpacityOnFly(true);
_frame.getDockingManager().loadLayoutData();
_frame.toFront();
return _frame;
}
private static void clearUp() {
_frame.removeWindowListener(_windowListener);
_windowListener = null;
if (_frame.getDockingManager() != null) {
_frame.getDockingManager().saveLayoutData();
}
_frame.dispose();
_frame = null;
}
protected static DockableFrame createDockableFrame(String key, Icon icon) {
DockableFrame frame = new DockableFrame(key, icon);
frame.setPreferredSize(new Dimension(200, 200));
return frame;
}
protected DockableFrame createSampleCommandFrame() {
DockableFrame frame = createDockableFrame("Command" + counter++, JideIconsFactory.getImageIcon(JideIconsFactory.DockableFrame.FRAME7));
frame.getContext().setInitMode(DockContext.STATE_FRAMEDOCKED);
frame.getContext().setInitSide(DockContext.DOCK_SIDE_SOUTH);
frame.getContext().setInitIndex(0);
JTextArea textArea = new JTextArea();
frame.add(createScrollPane(textArea));
textArea.setText(">");
return frame;
}
protected static JMenuBar createMenuBar() {
return new JMenuBar();
}
private static JScrollPane createScrollPane(Component component) {
JScrollPane pane = new JideScrollPane(component);
pane.setVerticalScrollBarPolicy(JideScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
return pane;
}
private void addPanel(DockableFrame frame) {
frame.getContext().setInitMode(DockContext.STATE_FRAMEDOCKED);
frame.getContext().setInitSide(DockContext.DOCK_SIDE_SOUTH);
frame.getContext().setInitIndex(0);
_frame.getDockingManager().beginLoadLayoutData();
_frame.getDockingManager().addFrame(frame);
_frame.getDockingManager().activateFrame(frame.getKey());
_frame.getDockingManager().loadLayoutData();
}
class NewPaneAction extends AbstractAction {
private final JFrame quickSelectorFrame = new JFrame("Quick Pane Creator");
private final List<String> frameNames = Lists.newArrayList("Dummy");
private JComboBox panelsComboBox;
public NewPaneAction() {
super("Quick Pane");
Collections.sort(frameNames);
init();
}
/**
* Creates the actual quick pane window.
*/
private void init() {
// Create a simple combobox with the frame names and wrap it in a
// Jide searchable wrapper.
// for (NewPaneType type : NewPaneType.values()) {
// frameNames.add(type.getTitle());
// }
panelsComboBox = new JComboBox(frameNames.toArray());
final ComboBoxSearchable comboBoxSearchable = new ComboBoxSearchable(panelsComboBox);
comboBoxSearchable.setWildcardEnabled(true);
comboBoxSearchable.setCaseSensitive(false);
final KeyListener keyHandler = new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ESCAPE && !comboBoxSearchable.isPopupVisible())
quickSelectorFrame.setVisible(false);
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
// Extract the frame name from the long name and create
// a new frame.
final String longFrameName = (String) panelsComboBox.getSelectedItem();
if (longFrameName != null) {
addPanel(createSampleCommandFrame());
}
quickSelectorFrame.setVisible(false);
}
}
};
panelsComboBox.addKeyListener(keyHandler);
quickSelectorFrame.addKeyListener(keyHandler);
Border framedBorder = BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), "Select a pane to create");
Border emptyBorder = BorderFactory.createEmptyBorder(5, 5, 5, 5);
panelsComboBox.setBorder(BorderFactory.createCompoundBorder(emptyBorder, framedBorder));
// We hide the window if it loses focus.
quickSelectorFrame.addWindowFocusListener(new WindowFocusListener() {
@Override
public void windowLostFocus(WindowEvent e) {
quickSelectorFrame.setVisible(false);
}
@Override
public void windowGainedFocus(WindowEvent e) {
}
});
quickSelectorFrame.add(panelsComboBox);
quickSelectorFrame.pack();
quickSelectorFrame.setResizable(false);
}
@Override
public void actionPerformed(ActionEvent e) {
Point center = _frame.getLocationOnScreen();
center.x += _frame.getSize().width / 2 - quickSelectorFrame.getSize().width / 2;
center.y += _frame.getSize().height / 2 - quickSelectorFrame.getSize().height / 2;
panelsComboBox.requestFocusInWindow();
quickSelectorFrame.setLocation(center);
quickSelectorFrame.setVisible(true);
}
}
private class MyDispatcher implements KeyEventDispatcher {
@Override
public boolean dispatchKeyEvent(KeyEvent e) {
if (e.getKeyCode() == (KeyEvent.VK_N) && e.isControlDown()) {
new NewPaneAction().actionPerformed(null);
}
return false;
}
}
}
Many thanks