
NegativeArraySizeException at net.miginfocom.layout.Grid
I am getting this exception:
Code:
Exception in thread "AWT-EventQueue-0" java.lang.NegativeArraySizeException
at net.miginfocom.layout.Grid$FlowSizeSpec.expandSizes(Unknown Source)
at net.miginfocom.layout.Grid$FlowSizeSpec.access$3600(Unknown Source)
at net.miginfocom.layout.Grid.adjustMinPrefForSpanningComps(Unknown Source)
at net.miginfocom.layout.Grid.calcRowsOrColsSizes(Unknown Source)
at net.miginfocom.layout.Grid.checkSizeCalcs(Unknown Source)
at net.miginfocom.layout.Grid.getWidth(Unknown Source)
at net.miginfocom.swing.MigLayout.getSizeImpl(Unknown Source)
at net.miginfocom.swing.MigLayout.preferredLayoutSize(Unknown Source)
at java.awt.Container.preferredSize(Container.java:1599)
at java.awt.Container.getPreferredSize(Container.java:1584)
at javax.swing.JComponent.getPreferredSize(JComponent.java:1636)
at java.awt.BorderLayout.preferredLayoutSize(BorderLayout.java:702)
at java.awt.Container.preferredSize(Container.java:1599)
at java.awt.Container.getPreferredSize(Container.java:1584)
at javax.swing.JComponent.getPreferredSize(JComponent.java:1636)
at javax.swing.JRootPane$RootLayout.preferredLayoutSize(JRootPane.java:907)
at java.awt.Container.preferredSize(Container.java:1599)
at java.awt.Container.getPreferredSize(Container.java:1584)
at javax.swing.JComponent.getPreferredSize(JComponent.java:1636)
at java.awt.BorderLayout.preferredLayoutSize(BorderLayout.java:702)
at java.awt.Container.preferredSize(Container.java:1599)
at java.awt.Container.getPreferredSize(Container.java:1584)
at java.awt.Window.pack(Window.java:706)
at com.muxlab.vitex.desktop.client.MainFrame.initComponents(MainFrame.java:43)
at com.muxlab.vitex.desktop.client.MainFrame.<init>(MainFrame.java:24)
at com.muxlab.vitex.desktop.client.MainFrame$1.run(MainFrame.java:79)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:641)
at java.awt.EventQueue.access$000(EventQueue.java:84)
at java.awt.EventQueue$1.run(EventQueue.java:602)
at java.awt.EventQueue$1.run(EventQueue.java:600)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:611)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Here is a simple testcase:
Code:
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSlider;
import javax.swing.JSpinner;
import javax.swing.JTabbedPane;
import javax.swing.JTree;
import javax.swing.SpinnerNumberModel;
import javax.swing.border.EmptyBorder;
import net.miginfocom.layout.AC;
import net.miginfocom.layout.CC;
import net.miginfocom.layout.LC;
import net.miginfocom.swing.MigLayout;
public class MainPanel2 extends JPanel
{
private final JTree deviceTree = new JTree();
private final JScrollPane devicePane = new JScrollPane(deviceTree);
private final JButton addDevice = new JButton("+");
private final JButton removeDevice = new JButton("-");
private final DefaultListModel groupsListModel = new DefaultListModel();
private final JList groupsList = new JList(groupsListModel);
private final JScrollPane groupsPane = new JScrollPane(groupsList);
private final JTabbedPane right = new JTabbedPane();
private final JPanel propertiesPanel = new JPanel();
private final JPanel scriptsPanel = new JPanel();
private final JLabel redSkewLabel = new JLabel("Red Skew");
private final JSlider redSkewSlider = new JSlider(0, 127);
private final SpinnerNumberModel redSkewValue = new SpinnerNumberModel(0, 0, 127, 1);
private final JSpinner redSkewSpinner = new JSpinner(redSkewValue);
private final JLabel greenSkewLabel = new JLabel("Green Skew");
private final JSlider greenSkewSlider = new JSlider(0, 127);
private final SpinnerNumberModel greenSkewValue = new SpinnerNumberModel(0, 0, 127, 1);
private final JSpinner greenSkewSpinner = new JSpinner(greenSkewValue);
private final JLabel blueSkewLabel = new JLabel("Blue Skew");
private final JSlider blueSkewSlider = new JSlider(0, 127);
private final SpinnerNumberModel blueSkewValue = new SpinnerNumberModel(0, 0, 127, 1);
private final JSpinner blueSkewSpinner = new JSpinner(blueSkewValue);
private final JLabel brightnessLabel = new JLabel("Brightness");
private final JSlider brightnessSlider = new JSlider(0, 127);
private final SpinnerNumberModel brightnessValue = new SpinnerNumberModel(0, 0, 127, 1);
private final JSpinner brightnessSpinner = new JSpinner(brightnessValue);
private final JLabel sharpnessLabel = new JLabel("Sharpness");
private final JSlider sharpnessSlider = new JSlider(0, 127);
private final SpinnerNumberModel sharpnessValue = new SpinnerNumberModel(0, 0, 127, 1);
private final JSpinner sharpnessSpinner = new JSpinner(sharpnessValue);
public MainPanel2()
{
setLayout(new MigLayout(new LC(), new AC().size("150:300:", 0).grow(100, 0).grow(0, 1), new AC().grow(100, 0).grow(0, 1)));
deviceTree.setOpaque(false);
devicePane.setBorder(javax.swing.BorderFactory.createTitledBorder("Devices"));
add(devicePane, new CC().grow());
add(right, new CC().spanX().spanY().alignY("top").wrap());
groupsList.setBorder(javax.swing.BorderFactory.createTitledBorder("Groups"));
groupsList.setOpaque(false);
groupsListModel.add(groupsListModel.size(), "Kitchen");
groupsListModel.add(groupsListModel.size(), "Bar");
groupsListModel.add(groupsListModel.size(), "Auditorium");
add(groupsPane, new CC().growX().growY(0f));
groupsPane.setBorder(new EmptyBorder(0, 0, 0, 0));
add(addDevice, new CC().growY(0f).alignX("right").split());
add(removeDevice, new CC().growY(0f).wrap());
right.addTab("Properties", propertiesPanel);
propertiesPanel.setLayout(new MigLayout());
propertiesPanel.add(redSkewLabel);
propertiesPanel.add(redSkewSlider);
propertiesPanel.add(redSkewSpinner, new CC().wrap());
// new JSliderJSpinnerSynchronizer(redSkewSlider, redSkewSpinner).start();
propertiesPanel.add(greenSkewLabel);
propertiesPanel.add(greenSkewSlider);
propertiesPanel.add(greenSkewSpinner, new CC().wrap());
// new JSliderJSpinnerSynchronizer(greenSkewSlider, greenSkewSpinner).start();
propertiesPanel.add(blueSkewLabel);
propertiesPanel.add(blueSkewSlider);
propertiesPanel.add(blueSkewSpinner, new CC().wrap());
// new JSliderJSpinnerSynchronizer(blueSkewSlider, blueSkewSpinner).start();
propertiesPanel.add(brightnessLabel);
propertiesPanel.add(brightnessSlider);
propertiesPanel.add(brightnessSpinner, new CC().wrap());
// new JSliderJSpinnerSynchronizer(brightnessSlider, brightnessSpinner).start();
propertiesPanel.add(sharpnessLabel);
propertiesPanel.add(sharpnessSlider);
propertiesPanel.add(sharpnessSpinner, new CC().wrap());
// new JSliderJSpinnerSynchronizer(sharpnessSlider, sharpnessSpinner).start();
right.addTab("Scripts", scriptsPanel);
}
public static void main(String[] args)
{
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(new MainPanel2());
frame.pack();
frame.setVisible(true);
}
}
The problem is a missing wrap() on this line:
Code:
add(groupsPane, new CC().growX().growY(0f));
but obviously the layout should either work or we should be getting a better error message.
Gili