提交 ce890c55 编写于 作者: S serb

7160627: [macosx] TextArea has wrong initial size

7124213: [macosx] pack() does ignore size of a component; doesn't on the other platforms
Reviewed-by: anthony, art
上级 3bca7263
/* /*
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -26,26 +26,27 @@ ...@@ -26,26 +26,27 @@
package sun.lwawt; package sun.lwawt;
import java.awt.AWTException;
import java.awt.BufferCapabilities; import java.awt.BufferCapabilities;
import java.awt.Canvas;
import java.awt.Component; import java.awt.Component;
import java.awt.Dimension;
import java.awt.GraphicsConfiguration; import java.awt.GraphicsConfiguration;
import java.awt.Image; import java.awt.Image;
import java.awt.peer.CanvasPeer; import java.awt.peer.CanvasPeer;
import javax.swing.JComponent; import javax.swing.JComponent;
final class LWCanvasPeer extends LWComponentPeer<Component, JComponent> class LWCanvasPeer<T extends Component, D extends JComponent>
implements CanvasPeer { extends LWComponentPeer<T, D> implements CanvasPeer {
LWCanvasPeer(final Canvas target, PlatformComponent platformComponent) { LWCanvasPeer(final T target, final PlatformComponent platformComponent) {
super(target, platformComponent); super(target, platformComponent);
} }
// ---- PEER METHODS ---- // // ---- PEER METHODS ---- //
@Override @Override
public void createBuffers(int numBuffers, BufferCapabilities caps) { public void createBuffers(int numBuffers, BufferCapabilities caps)
throws AWTException {
// TODO // TODO
} }
...@@ -67,10 +68,20 @@ final class LWCanvasPeer extends LWComponentPeer<Component, JComponent> ...@@ -67,10 +68,20 @@ final class LWCanvasPeer extends LWComponentPeer<Component, JComponent>
} }
@Override @Override
public GraphicsConfiguration getAppropriateGraphicsConfiguration( public final GraphicsConfiguration getAppropriateGraphicsConfiguration(
GraphicsConfiguration gc) GraphicsConfiguration gc)
{ {
// TODO // TODO
return gc; return gc;
} }
@Override
public final Dimension getPreferredSize() {
return getMinimumSize();
}
@Override
public final Dimension getMinimumSize() {
return getBounds().getSize();
}
} }
/* /*
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -185,6 +185,11 @@ final class LWCheckboxPeer ...@@ -185,6 +185,11 @@ final class LWCheckboxPeer
rb.setBounds(0, 0, w, h); rb.setBounds(0, 0, w, h);
} }
@Override
public Dimension getPreferredSize() {
return getCurrentButton().getPreferredSize();
}
@Override @Override
@Transient @Transient
public Dimension getMinimumSize() { public Dimension getMinimumSize() {
......
...@@ -123,7 +123,7 @@ public abstract class LWComponentPeer<T extends Component, D extends JComponent> ...@@ -123,7 +123,7 @@ public abstract class LWComponentPeer<T extends Component, D extends JComponent>
// private volatile boolean paintPending; // private volatile boolean paintPending;
private volatile boolean isLayouting; private volatile boolean isLayouting;
private D delegate = null; private final D delegate;
private Container delegateContainer; private Container delegateContainer;
private Component delegateDropTarget; private Component delegateDropTarget;
private final Object dropTargetLock = new Object(); private final Object dropTargetLock = new Object();
...@@ -133,6 +133,11 @@ public abstract class LWComponentPeer<T extends Component, D extends JComponent> ...@@ -133,6 +133,11 @@ public abstract class LWComponentPeer<T extends Component, D extends JComponent>
private final PlatformComponent platformComponent; private final PlatformComponent platformComponent;
/**
* Character with reasonable value between the minimum width and maximum.
*/
static final char WIDE_CHAR = '0';
private final class DelegateContainer extends Container { private final class DelegateContainer extends Container {
{ {
enableEvents(0xFFFFFFFF); enableEvents(0xFFFFFFFF);
...@@ -267,10 +272,8 @@ public abstract class LWComponentPeer<T extends Component, D extends JComponent> ...@@ -267,10 +272,8 @@ public abstract class LWComponentPeer<T extends Component, D extends JComponent>
} }
protected final D getDelegate() { protected final D getDelegate() {
synchronized (getStateLock()) {
return delegate; return delegate;
} }
}
protected Component getDelegateFocusOwner() { protected Component getDelegateFocusOwner() {
return getDelegate(); return getDelegate();
...@@ -698,26 +701,23 @@ public abstract class LWComponentPeer<T extends Component, D extends JComponent> ...@@ -698,26 +701,23 @@ public abstract class LWComponentPeer<T extends Component, D extends JComponent>
} }
@Override @Override
public FontMetrics getFontMetrics(Font f) { public FontMetrics getFontMetrics(final Font f) {
// Borrow the metrics from the top-level window // Borrow the metrics from the top-level window
// return getWindowPeer().getFontMetrics(f); // return getWindowPeer().getFontMetrics(f);
// Obtain the metrics from the offscreen window where this peer is // Obtain the metrics from the offscreen window where this peer is
// mostly drawn to. // mostly drawn to.
// TODO: check for "use platform metrics" settings // TODO: check for "use platform metrics" settings
Graphics g = getWindowPeer().getGraphics(); final Graphics g = getOnscreenGraphics();
try {
if (g != null) { if (g != null) {
try {
return g.getFontMetrics(f); return g.getFontMetrics(f);
} else {
synchronized (getDelegateLock()) {
return delegateContainer.getFontMetrics(f);
}
}
} finally { } finally {
if (g != null) {
g.dispose(); g.dispose();
} }
} }
synchronized (getDelegateLock()) {
return delegateContainer.getFontMetrics(f);
}
} }
@Override @Override
...@@ -847,31 +847,46 @@ public abstract class LWComponentPeer<T extends Component, D extends JComponent> ...@@ -847,31 +847,46 @@ public abstract class LWComponentPeer<T extends Component, D extends JComponent>
} }
/** /**
* Should be overridden in subclasses to forward the request * Determines the preferred size of the component. By default forwards the
* to the Swing helper component, if required. * request to the Swing helper component. Should be overridden in subclasses
* if required.
*/ */
@Override @Override
public Dimension getPreferredSize() { public Dimension getPreferredSize() {
// It looks like a default implementation for all toolkits final Dimension size;
return getMinimumSize(); synchronized (getDelegateLock()) {
size = getDelegate().getPreferredSize();
}
return validateSize(size);
} }
/* /**
* Should be overridden in subclasses to forward the request * Determines the minimum size of the component. By default forwards the
* to the Swing helper component. * request to the Swing helper component. Should be overridden in subclasses
* if required.
*/ */
@Override @Override
public Dimension getMinimumSize() { public Dimension getMinimumSize() {
D delegate = getDelegate(); final Dimension size;
if (delegate == null) {
// Is it a correct default value?
return getBounds().getSize();
} else {
synchronized (getDelegateLock()) { synchronized (getDelegateLock()) {
return delegate.getMinimumSize(); size = getDelegate().getMinimumSize();
}
return validateSize(size);
} }
/**
* In some situations delegates can return empty minimum/preferred size.
* (For example: empty JLabel, etc), but awt components never should be
* empty. In the XPeers or WPeers we use some magic constants, but here we
* try to use something more useful,
*/
private Dimension validateSize(final Dimension size) {
if (size.width == 0 || size.height == 0) {
final FontMetrics fm = getFontMetrics(getFont());
size.width = fm.charWidth(WIDE_CHAR);
size.height = fm.getHeight();
} }
return size;
} }
@Override @Override
......
/* /*
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -41,7 +41,7 @@ import java.util.List; ...@@ -41,7 +41,7 @@ import java.util.List;
import javax.swing.JComponent; import javax.swing.JComponent;
abstract class LWContainerPeer<T extends Container, D extends JComponent> abstract class LWContainerPeer<T extends Container, D extends JComponent>
extends LWComponentPeer<T, D> extends LWCanvasPeer<T, D>
implements ContainerPeer implements ContainerPeer
{ {
// List of child peers sorted by z-order from bottom-most // List of child peers sorted by z-order from bottom-most
......
/* /*
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -26,37 +26,26 @@ ...@@ -26,37 +26,26 @@
package sun.lwawt; package sun.lwawt;
import java.awt.Dimension;
import java.awt.FontMetrics;
import java.awt.Label; import java.awt.Label;
import java.awt.peer.LabelPeer; import java.awt.peer.LabelPeer;
import javax.swing.JLabel; import javax.swing.JLabel;
import javax.swing.SwingConstants; import javax.swing.SwingConstants;
import javax.tools.annotation.GenerateNativeHeader;
/** /**
* Lightweight implementation of {@link LabelPeer}. Delegates most of the work * Lightweight implementation of {@link LabelPeer}. Delegates most of the work
* to the {@link JLabel}. * to the {@link JLabel}.
*/ */
/* No native methods here, but the constants are needed in the supporting JNI code */
@GenerateNativeHeader
final class LWLabelPeer extends LWComponentPeer<Label, JLabel> final class LWLabelPeer extends LWComponentPeer<Label, JLabel>
implements LabelPeer { implements LabelPeer {
private static final int TEXT_XPAD = 5;
private static final int TEXT_YPAD = 1;
LWLabelPeer(final Label target, final PlatformComponent platformComponent) { LWLabelPeer(final Label target, final PlatformComponent platformComponent) {
super(target, platformComponent); super(target, platformComponent);
} }
@Override @Override
protected JLabel createDelegate() { protected JLabel createDelegate() {
final JLabel label = new JLabel(); return new JLabel();
label.setVerticalAlignment(SwingConstants.TOP);
return label;
} }
@Override @Override
...@@ -80,24 +69,6 @@ final class LWLabelPeer extends LWComponentPeer<Label, JLabel> ...@@ -80,24 +69,6 @@ final class LWLabelPeer extends LWComponentPeer<Label, JLabel>
} }
} }
@Override
public Dimension getMinimumSize() {
int w = TEXT_XPAD;
int h = TEXT_YPAD;
final FontMetrics fm = getFontMetrics(getFont());
if (fm != null) {
final String text;
synchronized (getDelegateLock()) {
text = getDelegate().getText();
}
if (text != null) {
w += fm.stringWidth(text);
}
h += fm.getHeight();
}
return new Dimension(w, h);
}
/** /**
* Converts {@code Label} alignment constant to the {@code JLabel} constant. * Converts {@code Label} alignment constant to the {@code JLabel} constant.
* If wrong Label alignment provided returns default alignment. * If wrong Label alignment provided returns default alignment.
......
/* /*
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -32,10 +32,22 @@ import java.awt.event.*; ...@@ -32,10 +32,22 @@ import java.awt.event.*;
import java.awt.peer.ListPeer; import java.awt.peer.ListPeer;
import java.util.Arrays; import java.util.Arrays;
final class LWListPeer /**
extends LWComponentPeer<List, LWListPeer.ScrollableJList> * Lightweight implementation of {@link ListPeer}.
*/
final class LWListPeer extends LWComponentPeer<List, LWListPeer.ScrollableJList>
implements ListPeer { implements ListPeer {
/**
* The default number of visible rows.
*/
private static final int DEFAULT_VISIBLE_ROWS = 4; // From java.awt.List,
/**
* This text is used for cell bounds calculation.
*/
private static final String TEXT = "0123456789abcde";
LWListPeer(final List target, final PlatformComponent platformComponent) { LWListPeer(final List target, final PlatformComponent platformComponent) {
super(target, platformComponent); super(target, platformComponent);
if (!getTarget().isBackgroundSet()) { if (!getTarget().isBackgroundSet()) {
...@@ -134,6 +146,16 @@ final class LWListPeer ...@@ -134,6 +146,16 @@ final class LWListPeer
} }
} }
@Override
public Dimension getPreferredSize() {
return getMinimumSize();
}
@Override
public Dimension getMinimumSize() {
return getMinimumSize(DEFAULT_VISIBLE_ROWS);
}
@Override @Override
public Dimension getPreferredSize(final int rows) { public Dimension getPreferredSize(final int rows) {
return getMinimumSize(rows); return getMinimumSize(rows);
...@@ -142,16 +164,26 @@ final class LWListPeer ...@@ -142,16 +164,26 @@ final class LWListPeer
@Override @Override
public Dimension getMinimumSize(final int rows) { public Dimension getMinimumSize(final int rows) {
synchronized (getDelegateLock()) { synchronized (getDelegateLock()) {
final int margin = 2; final Dimension size = getCellSize();
final int space = 1; size.height *= rows;
// Always take vertical scrollbar into account.
// TODO: count ScrollPane's scrolling elements if any. final JScrollBar vbar = getDelegate().getVerticalScrollBar();
final FontMetrics fm = getFontMetrics(getFont()); size.width += vbar != null ? vbar.getMinimumSize().width : 0;
final int itemHeight = (fm.getHeight() - fm.getLeading()) + (2 * space); // JScrollPane and JList insets
final Insets pi = getDelegate().getInsets();
return new Dimension(20 + (fm == null ? 10 * 15 : fm.stringWidth("0123456789abcde")), final Insets vi = getDelegate().getView().getInsets();
(fm == null ? 10 : itemHeight) * rows + (2 * margin)); size.width += pi.left + pi.right + vi.left + vi.right;
size.height += pi.top + pi.bottom + vi.top + vi.bottom;
return size;
}
} }
private Dimension getCellSize() {
final JList<String> jList = getDelegate().getView();
final ListCellRenderer<? super String> cr = jList.getCellRenderer();
final Component cell = cr.getListCellRendererComponent(jList, TEXT, 0,
false, false);
return cell.getPreferredSize();
} }
private void revalidate() { private void revalidate() {
...@@ -165,10 +197,10 @@ final class LWListPeer ...@@ -165,10 +197,10 @@ final class LWListPeer
private boolean skipStateChangedEvent; private boolean skipStateChangedEvent;
private DefaultListModel<Object> model = private final DefaultListModel<String> model =
new DefaultListModel<Object>() { new DefaultListModel<String>() {
@Override @Override
public void add(final int index, final Object element) { public void add(final int index, final String element) {
if (index == -1) { if (index == -1) {
addElement(element); addElement(element);
} else { } else {
...@@ -181,7 +213,7 @@ final class LWListPeer ...@@ -181,7 +213,7 @@ final class LWListPeer
ScrollableJList() { ScrollableJList() {
getViewport().setScrollMode(JViewport.SIMPLE_SCROLL_MODE); getViewport().setScrollMode(JViewport.SIMPLE_SCROLL_MODE);
final JList<Object> list = new JListDelegate(); final JList<String> list = new JListDelegate();
list.addListSelectionListener(this); list.addListSelectionListener(this);
getViewport().setView(list); getViewport().setView(list);
...@@ -223,11 +255,11 @@ final class LWListPeer ...@@ -223,11 +255,11 @@ final class LWListPeer
} }
} }
public JList getView() { public JList<String> getView() {
return (JList) getViewport().getView(); return (JList<String>) getViewport().getView();
} }
public DefaultListModel<Object> getModel() { public DefaultListModel<String> getModel() {
return model; return model;
} }
...@@ -254,7 +286,7 @@ final class LWListPeer ...@@ -254,7 +286,7 @@ final class LWListPeer
} }
} }
private final class JListDelegate extends JList<Object> { private final class JListDelegate extends JList<String> {
JListDelegate() { JListDelegate() {
super(ScrollableJList.this.model); super(ScrollableJList.this.model);
...@@ -272,7 +304,7 @@ final class LWListPeer ...@@ -272,7 +304,7 @@ final class LWListPeer
final int index = locationToIndex(e.getPoint()); final int index = locationToIndex(e.getPoint());
if (0 <= index && index < getModel().getSize()) { if (0 <= index && index < getModel().getSize()) {
LWListPeer.this.postEvent(new ActionEvent(getTarget(), ActionEvent.ACTION_PERFORMED, LWListPeer.this.postEvent(new ActionEvent(getTarget(), ActionEvent.ACTION_PERFORMED,
getModel().getElementAt(index).toString(), e.getWhen(), e.getModifiers())); getModel().getElementAt(index), e.getWhen(), e.getModifiers()));
} }
} }
} }
...@@ -281,10 +313,10 @@ final class LWListPeer ...@@ -281,10 +313,10 @@ final class LWListPeer
protected void processKeyEvent(final KeyEvent e) { protected void processKeyEvent(final KeyEvent e) {
super.processKeyEvent(e); super.processKeyEvent(e);
if (e.getID() == KeyEvent.KEY_PRESSED && e.getKeyCode() == KeyEvent.VK_ENTER) { if (e.getID() == KeyEvent.KEY_PRESSED && e.getKeyCode() == KeyEvent.VK_ENTER) {
final Object selectedValue = getSelectedValue(); final String selectedValue = getSelectedValue();
if(selectedValue != null){ if(selectedValue != null){
LWListPeer.this.postEvent(new ActionEvent(getTarget(), ActionEvent.ACTION_PERFORMED, LWListPeer.this.postEvent(new ActionEvent(getTarget(), ActionEvent.ACTION_PERFORMED,
selectedValue.toString(), e.getWhen(), e.getModifiers())); selectedValue, e.getWhen(), e.getModifiers()));
} }
} }
} }
......
...@@ -26,7 +26,6 @@ ...@@ -26,7 +26,6 @@
package sun.lwawt; package sun.lwawt;
import java.awt.Dimension;
import java.awt.Panel; import java.awt.Panel;
import java.awt.peer.PanelPeer; import java.awt.peer.PanelPeer;
...@@ -43,9 +42,4 @@ final class LWPanelPeer extends LWContainerPeer<Panel, JPanel> ...@@ -43,9 +42,4 @@ final class LWPanelPeer extends LWContainerPeer<Panel, JPanel>
public JPanel createDelegate() { public JPanel createDelegate() {
return new JPanel(); return new JPanel();
} }
@Override
public Dimension getMinimumSize() {
return getBounds().getSize();
}
} }
...@@ -27,7 +27,6 @@ ...@@ -27,7 +27,6 @@
package sun.lwawt; package sun.lwawt;
import java.awt.Adjustable; import java.awt.Adjustable;
import java.awt.Dimension;
import java.awt.Scrollbar; import java.awt.Scrollbar;
import java.awt.event.AdjustmentEvent; import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener; import java.awt.event.AdjustmentListener;
...@@ -93,13 +92,6 @@ final class LWScrollBarPeer extends LWComponentPeer<Scrollbar, JScrollBar> ...@@ -93,13 +92,6 @@ final class LWScrollBarPeer extends LWComponentPeer<Scrollbar, JScrollBar>
} }
} }
@Override
public Dimension getPreferredSize() {
synchronized (getDelegateLock()) {
return getDelegate().getPreferredSize();
}
}
// Peer also registered as a listener for ComponentDelegate component // Peer also registered as a listener for ComponentDelegate component
@Override @Override
public void adjustmentValueChanged(final AdjustmentEvent e) { public void adjustmentValueChanged(final AdjustmentEvent e) {
......
/* /*
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -29,6 +29,7 @@ package sun.lwawt; ...@@ -29,6 +29,7 @@ package sun.lwawt;
import java.awt.Component; import java.awt.Component;
import java.awt.Cursor; import java.awt.Cursor;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.Insets;
import java.awt.Point; import java.awt.Point;
import java.awt.TextArea; import java.awt.TextArea;
import java.awt.event.TextEvent; import java.awt.event.TextEvent;
...@@ -41,11 +42,22 @@ import javax.swing.ScrollPaneConstants; ...@@ -41,11 +42,22 @@ import javax.swing.ScrollPaneConstants;
import javax.swing.text.Document; import javax.swing.text.Document;
import javax.swing.text.JTextComponent; import javax.swing.text.JTextComponent;
/**
* Lightweight implementation of {@link TextAreaPeer}. Delegates most of the
* work to the {@link JTextArea} inside JScrollPane.
*/
final class LWTextAreaPeer final class LWTextAreaPeer
extends LWTextComponentPeer<TextArea, LWTextAreaPeer.ScrollableJTextArea> extends LWTextComponentPeer<TextArea, LWTextAreaPeer.ScrollableJTextArea>
implements TextAreaPeer { implements TextAreaPeer {
/**
* The default number of visible columns.
*/
private static final int DEFAULT_COLUMNS = 60; private static final int DEFAULT_COLUMNS = 60;
/**
* The default number of visible rows.
*/
private static final int DEFAULT_ROWS = 10; private static final int DEFAULT_ROWS = 10;
LWTextAreaPeer(final TextArea target, LWTextAreaPeer(final TextArea target,
...@@ -86,27 +98,42 @@ final class LWTextAreaPeer ...@@ -86,27 +98,42 @@ final class LWTextAreaPeer
return getTextComponent(); return getTextComponent();
} }
@Override
public Dimension getPreferredSize() {
return getMinimumSize();
}
@Override @Override
public Dimension getMinimumSize() { public Dimension getMinimumSize() {
return getMinimumSize(DEFAULT_ROWS, DEFAULT_COLUMNS); return getMinimumSize(DEFAULT_ROWS, DEFAULT_COLUMNS);
} }
@Override @Override
public Dimension getMinimumSize(final int rows, final int columns) { public Dimension getPreferredSize(final int rows, final int columns) {
return getPreferredSize(rows, columns); return getMinimumSize(rows, columns);
} }
@Override @Override
public Dimension getPreferredSize(final int rows, final int columns) { public Dimension getMinimumSize(final int rows, final int columns) {
final Dimension size = super.getPreferredSize(rows, columns); final Dimension size = super.getMinimumSize(rows, columns);
synchronized (getDelegateLock()) { synchronized (getDelegateLock()) {
// JScrollPane insets
final Insets pi = getDelegate().getInsets();
size.width += pi.left + pi.right;
size.height += pi.top + pi.bottom;
// Take scrollbars into account.
final int vsbPolicy = getDelegate().getVerticalScrollBarPolicy();
if (vsbPolicy == ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS) {
final JScrollBar vbar = getDelegate().getVerticalScrollBar(); final JScrollBar vbar = getDelegate().getVerticalScrollBar();
size.width += vbar != null ? vbar.getMinimumSize().width : 0;
}
final int hsbPolicy = getDelegate().getHorizontalScrollBarPolicy();
if (hsbPolicy == ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS) {
final JScrollBar hbar = getDelegate().getHorizontalScrollBar(); final JScrollBar hbar = getDelegate().getHorizontalScrollBar();
final int scrollbarW = vbar != null ? vbar.getWidth() : 0; size.height += hbar != null ? hbar.getMinimumSize().height : 0;
final int scrollbarH = hbar != null ? hbar.getHeight() : 0; }
return new Dimension(size.width + scrollbarW,
size.height + scrollbarH);
} }
return size;
} }
@Override @Override
......
/* /*
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -48,10 +48,7 @@ abstract class LWTextComponentPeer<T extends TextComponent, D extends JComponent ...@@ -48,10 +48,7 @@ abstract class LWTextComponentPeer<T extends TextComponent, D extends JComponent
extends LWComponentPeer<T, D> extends LWComponentPeer<T, D>
implements DocumentListener, TextComponentPeer, InputMethodListener { implements DocumentListener, TextComponentPeer, InputMethodListener {
/**
* Character with reasonable value between the minimum width and maximum.
*/
protected static final char WIDE_CHAR = 'w';
private volatile boolean firstChangeSkipped; private volatile boolean firstChangeSkipped;
LWTextComponentPeer(final T target, LWTextComponentPeer(final T target,
...@@ -95,18 +92,16 @@ abstract class LWTextComponentPeer<T extends TextComponent, D extends JComponent ...@@ -95,18 +92,16 @@ abstract class LWTextComponentPeer<T extends TextComponent, D extends JComponent
*/ */
abstract JTextComponent getTextComponent(); abstract JTextComponent getTextComponent();
public Dimension getPreferredSize(final int rows, final int columns) { public Dimension getMinimumSize(final int rows, final int columns) {
final Insets insets; final Insets insets;
synchronized (getDelegateLock()) { synchronized (getDelegateLock()) {
insets = getDelegate().getInsets(); insets = getTextComponent().getInsets();
} }
final int borderHeight = insets.top + insets.bottom; final int borderHeight = insets.top + insets.bottom;
final int borderWidth = insets.left + insets.right; final int borderWidth = insets.left + insets.right;
final FontMetrics fm = getFontMetrics(getFont()); final FontMetrics fm = getFontMetrics(getFont());
final int charWidth = (fm != null) ? fm.charWidth(WIDE_CHAR) : 10; return new Dimension(fm.charWidth(WIDE_CHAR) * columns + borderWidth,
final int itemHeight = (fm != null) ? fm.getHeight() : 10; fm.getHeight() * rows + borderHeight);
return new Dimension(columns * charWidth + borderWidth,
rows * itemHeight + borderHeight);
} }
@Override @Override
...@@ -187,6 +182,7 @@ abstract class LWTextComponentPeer<T extends TextComponent, D extends JComponent ...@@ -187,6 +182,7 @@ abstract class LWTextComponentPeer<T extends TextComponent, D extends JComponent
} }
} }
//TODO IN XAWT we just return true..
@Override @Override
public final boolean isFocusable() { public final boolean isFocusable() {
return getTarget().isFocusable(); return getTarget().isFocusable();
......
/* /*
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -37,16 +37,10 @@ import java.awt.peer.TextFieldPeer; ...@@ -37,16 +37,10 @@ import java.awt.peer.TextFieldPeer;
import javax.swing.JPasswordField; import javax.swing.JPasswordField;
import javax.swing.text.JTextComponent; import javax.swing.text.JTextComponent;
import javax.tools.annotation.GenerateNativeHeader;
/* No native methods here, but the constants are needed in the supporting JNI code */
@GenerateNativeHeader
final class LWTextFieldPeer final class LWTextFieldPeer
extends LWTextComponentPeer<TextField, JPasswordField> extends LWTextComponentPeer<TextField, JPasswordField>
implements TextFieldPeer, ActionListener { implements TextFieldPeer, ActionListener {
private static final int DEFAULT_COLUMNS = 1;
LWTextFieldPeer(final TextField target, LWTextFieldPeer(final TextField target,
final PlatformComponent platformComponent) { final PlatformComponent platformComponent) {
super(target, platformComponent); super(target, platformComponent);
...@@ -83,17 +77,12 @@ final class LWTextFieldPeer ...@@ -83,17 +77,12 @@ final class LWTextFieldPeer
@Override @Override
public Dimension getPreferredSize(final int columns) { public Dimension getPreferredSize(final int columns) {
return getPreferredSize(1, columns); return getMinimumSize(columns);
} }
@Override @Override
public Dimension getMinimumSize(final int columns) { public Dimension getMinimumSize(final int columns) {
return getPreferredSize(columns); return getMinimumSize(1, columns);
}
@Override
public Dimension getMinimumSize() {
return getMinimumSize(DEFAULT_COLUMNS);
} }
@Override @Override
......
...@@ -310,7 +310,7 @@ public abstract class LWToolkit extends SunToolkit implements Runnable { ...@@ -310,7 +310,7 @@ public abstract class LWToolkit extends SunToolkit implements Runnable {
@Override @Override
public CanvasPeer createCanvas(Canvas target) { public CanvasPeer createCanvas(Canvas target) {
PlatformComponent platformComponent = createPlatformComponent(); PlatformComponent platformComponent = createPlatformComponent();
LWCanvasPeer peer = new LWCanvasPeer(target, platformComponent); LWCanvasPeer<?, ?> peer = new LWCanvasPeer<>(target, platformComponent);
targetCreatedPeer(target, peer); targetCreatedPeer(target, peer);
peer.initialize(); peer.initialize();
return peer; return peer;
......
/*
* Copyright (c) 2012, 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. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* 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.
*/
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.ScrollPane;
import java.awt.Toolkit;
import sun.awt.SunToolkit;
/**
* @test
* @bug 7124213
* @author Sergey Bylokhov
*/
public final class ScrollPanePreferredSize {
public static void main(final String[] args) {
final Dimension expected = new Dimension(300, 300);
final Frame frame = new Frame();
final ScrollPane sp = new ScrollPane();
sp.setSize(expected);
frame.add(sp);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
sleep();
final Dimension size = frame.getSize();
if (size.width < expected.width || size.height < expected.height) {
throw new RuntimeException(
"Expected size: >= " + expected + ", actual size: " + size);
}
frame.dispose();
}
private static void sleep() {
((SunToolkit) Toolkit.getDefaultToolkit()).realSync();
try {
Thread.sleep(500L);
} catch (InterruptedException ignored) {
}
}
}
/*
* Copyright (c) 2012, 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. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* 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.
*/
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.Toolkit;
import sun.awt.SunToolkit;
/**
* @test
* @bug 7160627
* @summary We shouldn't get different frame size when we call Frame.pack()
* twice.
* @author Sergey Bylokhov
*/
public final class TextAreaTwicePack {
public static void main(final String[] args) {
final Frame frame = new Frame();
final TextArea ta = new TextArea();
frame.add(ta);
frame.pack();
frame.setVisible(true);
sleep();
final Dimension before = frame.getSize();
frame.pack();
final Dimension after = frame.getSize();
if (!after.equals(before)) {
throw new RuntimeException(
"Expected size: " + before + ", actual size: " + after);
}
frame.dispose();
}
private static void sleep() {
((SunToolkit) Toolkit.getDefaultToolkit()).realSync();
try {
Thread.sleep(500L);
} catch (InterruptedException ignored) {
}
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册