Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

4797982: Setting negative size of JSplitPane divider leads to unexpected results. #9566

Closed
wants to merge 9 commits into from
6 changes: 6 additions & 0 deletions src/java.desktop/share/classes/javax/swing/JSplitPane.java
Expand Up @@ -418,12 +418,18 @@ public String getUIClassID() {

/**
* Sets the size of the divider.
* @implNote Divider sizes < 1 are ignored.
* {@code SplitPane.dividerSize} L&amp;F specific value
* will instead be used.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This isn't the same as ignoring it. Suppose we do
setDividerSize(5);
setDividerSize(-1);

what is the value after both of these - per your ignoring code 5, but per your doc it will be whatever the default was before you started to change it.

I think it sufficient to say it will be ignored and drop the 2nd clause.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok. Modified javadoc and CSR

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My apologies, but because I focused on the rest of it, I overlooked you had made this an implNote.
That seems odd. Do you really intend to imply that some other implementation of Java should be allowed
to do something with negative values ? If so that would be a compatibility issue ..

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, actually I was thinking in that sense, as I was not sure if other impl. will allow -ve values and just wanted to mention that our impl dont.
But, I guess as you pointed, we should make it disallowed for all. Modified PR and CSR.

*
* @param newSize an integer giving the size of the divider in pixels
*/
@BeanProperty(description
= "The size of the divider.")
public void setDividerSize(int newSize) {
if (newSize <= 0) {
return;
}
int oldSize = dividerSize;

dividerSizeSet = true;
Expand Down
Expand Up @@ -219,10 +219,16 @@ public BasicSplitPaneUI getBasicSplitPaneUI() {
* Sets the size of the divider to {@code newSize}. That is
* the width if the splitpane is {@code HORIZONTAL_SPLIT}, or
* the height of {@code VERTICAL_SPLIT}.
* @implNote Divider sizes < 1 are ignored.
* {@code SplitPane.dividerSize} L&amp;F specific value
* will instead be used.
*
* @param newSize a new size
*/
public void setDividerSize(int newSize) {
if (newSize <= 0) {
return;
}
dividerSize = newSize;
}

Expand Down
72 changes: 72 additions & 0 deletions test/jdk/javax/swing/JSplitPane/JSplitPaneTestNegDivSize.java
@@ -0,0 +1,72 @@
/*
* Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/

/* @test
* @key headful
* @bug 4797982
* @summary Verifies if negative size of JSplitPane divider can be set.
* @run main JSplitPaneTestNegDivSize
*/
import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JSplitPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.plaf.basic.BasicSplitPaneUI;

public class JSplitPaneTestNegDivSize {

private static volatile int divSize;
private static volatile int basicDivSize;
private static JFrame frame;
private static JSplitPane sp;

public static void main(String[] args) throws Exception {
SwingUtilities.invokeAndWait(() -> {
frame = new JFrame();
sp = new JSplitPane(JSplitPane.VERTICAL_SPLIT, true,
new JTextArea("I am top text area!"),
new JTextArea("I am bottom text area!"));
frame.getContentPane().add(sp, BorderLayout.CENTER);
sp.setDividerSize(-50);
divSize = sp.getDividerSize();
((BasicSplitPaneUI)sp.getUI()).getDivider().setDividerSize(-50);
basicDivSize = ((BasicSplitPaneUI)sp.getUI()).getDivider().
getDividerSize();
frame.setSize(new Dimension(400,200));
frame.setVisible(true);
});
try {
Thread.sleep(1000);
} catch(Exception e){}
SwingUtilities.invokeAndWait(()->frame.dispose());
System.out.println(divSize);
System.out.println(basicDivSize);
System.out.println((Integer)UIManager.get("SplitPane.dividerSize"));
if (divSize < 0 || basicDivSize < 0) {
throw new RuntimeException("Negative divider size");
}
}
}