1

この質問、Java Swing:固定幅と可変高さの垂直レイアウトは、ApachePivotを試す機会を与えてくれました。私はPivotでちょうど1日の経験があります。

これが私が作成できたGUIです。

セグメントGUI

私の質問は次のとおりです。

  1. 、、、がウィンドウの幅を埋め、任意の量のテキストを保持するのに十分な高さになるように、のTextArea一部のサイズを設定するにはどうすればよいですか?ExpanderExpanderScrollPaneTextAreaTextArea

  2. すべてのテキスト領域が展開されたときに3がウィンドウの高さに合うように、の高ScrollPaneさのサイズを設定するにはどうすればよいですか?ExpanderExpander

GUIを作成したソースコードは次のとおりです。ApachePivotのバージョン2.0.2を使用しています。

import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;

import org.apache.pivot.collections.Map;
import org.apache.pivot.wtk.Application;
import org.apache.pivot.wtk.BoxPane;
import org.apache.pivot.wtk.DesktopApplicationContext;
import org.apache.pivot.wtk.Display;
import org.apache.pivot.wtk.Expander;
import org.apache.pivot.wtk.Orientation;
import org.apache.pivot.wtk.ScrollPane;
import org.apache.pivot.wtk.TextArea;
import org.apache.pivot.wtk.Window;

public class Segments implements Application {

    protected SectionCollection collection;

    protected Window window;

    @Override
    public void startup(Display display, Map<String, String> properties) {
        collection = new SectionCollection();
        new SectionCollectionCreator(collection);

        window = new Window();
        window.setTitle("Segments");
        window.setMaximized(true);

        BoxPane boxPane = new BoxPane();
        boxPane.setOrientation(Orientation.VERTICAL);

        for (int i = 0; i < collection.size(); i++) {
            SectionText sectionText = collection.get(i);

            TextArea textArea = new TextArea();
            textArea.setEditable(false);
            textArea.setPreferredSize(400, 220);
            try {
                textArea.setText(sectionText.getTopic());
            } catch (IOException e) {
                e.printStackTrace();
            }

            ScrollPane textScrollPane = new ScrollPane();
            textScrollPane.setPreferredSize(420, 100);
            textScrollPane.setVerticalScrollBarPolicy(
                    ScrollPane.ScrollBarPolicy.AUTO);
            textScrollPane.setView(textArea);

            Expander expander = new Expander();
            expander.setTitle(sectionText.getTitle());
            expander.setContent(textScrollPane);
            expander.setExpanded(false);

            boxPane.add(expander);  
        }

        ScrollPane expanderScrollPane = new ScrollPane();
        expanderScrollPane.setHorizontalScrollBarPolicy(
                ScrollPane.ScrollBarPolicy.AUTO);
        expanderScrollPane.setVerticalScrollBarPolicy(
                ScrollPane.ScrollBarPolicy.AUTO);
        expanderScrollPane.setView(boxPane);

        window.setContent(expanderScrollPane);
        window.open(display);
    }

    @Override
    public boolean shutdown(boolean optional) {
        if (window != null) {
            window.close();
        }
        return false;
    }

    @Override
    public void suspend() {
    }

    @Override
    public void resume() {
    }

    public static void main(String[] args) {
        DesktopApplicationContext.main(Segments.class, args);
    }

    public class SectionText {
        protected String title;
        protected Reader topic;

        public SectionText(String title, Reader topic) {
            this.title = title;
            this.topic = topic;
        }

        public String getTitle() {
            return title;
        }

        public Reader getTopic() {
            return topic;
        }
    }

    public class SectionCollection {
        protected List<SectionText> collection;

        public SectionCollection() {
            this.collection = new ArrayList<SectionText>();
        }

        public void add(SectionText sectionText) {
            collection.add(sectionText);
        }

        public int size() {
            return collection.size();
        }

        public SectionText get(int index) {
            return collection.get(index);
        }
    }   

    public class SectionCollectionCreator {
        protected SectionCollection collection;

        protected static final String text = "Attributes, Styles and Style Contexts\n\n"
                + "The simple PlainDocument class that you saw in the previous "
                + "chapter is only capable of holding text. The more complex text "
                + "components use a more sophisticated model that implements the "
                + "StyledDocument interface. StyledDocument is a sub-interface of "
                + "Document that contains methods for manipulating attributes that "
                + "control the way in which the text in the document is displayed. "
                + "The Swing text package contains a concrete implementation of "
                + "StyledDocument called DefaultStyledDocument that is used as the "
                + "default model for JTextPane and is also the base class from which "
                + "more specific models, such as the HTMLDocument class that handles "
                + "input in HTML format, can be created. In order to make use of "
                + "DefaultStyledDocument and JTextPane, you need to understand how "
                + "Swing represents and uses attributes.";

        public SectionCollectionCreator(SectionCollection collection) {
            this.collection = collection;

            String title = "Title ";

            for (int i = 1; i <= 3; i++) {
                SectionText sectionText = new SectionText(title + i, 
                        new StringReader(text));
                collection.add(sectionText);
            }
        }   
    }

}
4

2 に答える 2

0

私はついにパズルを解きました。

テキスト領域の幅を設定することにより、テキストに合うように高さが計算されました。

テキスト領域のスクロールペインの高さを設定することで、テキスト領域のスクロールペインを表示し、エキスパンダーのサイズをタイトルバーとテキスト領域のスクロールペインに縮小することができます。

これで、ウィンドウの幅と高さに基づいて、テキスト領域の幅とテキスト領域のスクロールペインの高さを計算するだけで済みました。

そこで、コンポーネントリスナーが登場しました。リスナーは、テキスト領域の幅とテキスト領域のスクロールペインの高さを調整しました。スクロールバーとマージンを説明するために、私はごまかして魔法の定数を使用しました。コンポーネントを作成するときにこれらの値を取得できればよかったのにと思います。

とにかく、これがGUIコンポーネントをウィンドウに合わせてサイズ設定するコードです。

import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

import org.apache.pivot.collections.Map;
import org.apache.pivot.wtk.Application;
import org.apache.pivot.wtk.Bounds;
import org.apache.pivot.wtk.BoxPane;
import org.apache.pivot.wtk.Component;
import org.apache.pivot.wtk.Component.StyleDictionary;
import org.apache.pivot.wtk.ComponentListener;
import org.apache.pivot.wtk.DesktopApplicationContext;
import org.apache.pivot.wtk.Display;
import org.apache.pivot.wtk.Expander;
import org.apache.pivot.wtk.Orientation;
import org.apache.pivot.wtk.ScrollPane;
import org.apache.pivot.wtk.TextArea;
import org.apache.pivot.wtk.Window;

public class Segments implements Application {

    protected List<SectionComponent> expanderComponents;

    protected SectionCollection collection;

    protected Window window;

    @Override
    public void startup(Display display, Map<String, String> properties) 
            throws IOException {
        getStyles(display);

        collection = new SectionCollection();
        new SectionCollectionCreator(collection);
        expanderComponents = new ArrayList<SectionComponent>();

        window = new Window();
        window.setTitle("Segments");
        window.setMaximized(true);

        ComponentSizeListener listener = new ComponentSizeListener();   
        window.getComponentListeners().add(listener.getListener());

        BoxPane boxPane = new BoxPane();
        boxPane.setOrientation(Orientation.VERTICAL);

        for (int i = 0; i < collection.size(); i++) {
            SectionComponent sectionComponent =
                    new SectionComponent(collection.get(i), 400, 100); 
            expanderComponents.add(sectionComponent);
            boxPane.add(sectionComponent.getExpander());
        }

        listener.setComponents(expanderComponents);

        ScrollPane expanderScrollPane = new ScrollPane();
        expanderScrollPane.setHorizontalScrollBarPolicy(
                ScrollPane.ScrollBarPolicy.AUTO);
        expanderScrollPane.setVerticalScrollBarPolicy(
                ScrollPane.ScrollBarPolicy.AUTO);
        expanderScrollPane.setView(boxPane);

        window.setContent(expanderScrollPane);
        window.open(display);
    }

    protected void getStyles(Component component) {
        StyleDictionary dictionary = component.getStyles();
        System.out.println(component);
        Iterator<String> iter = dictionary.iterator();
        List<String> list = new ArrayList<String>();
        while (iter.hasNext()) {
            list.add(iter.next());
        }
        Collections.sort(list);
        for (String style : list) {
            System.out.println("    " + style);
        }
    }

    @Override
    public boolean shutdown(boolean optional) {
        if (window != null) {
            window.close();
        }
        return false;
    }

    @Override
    public void suspend() {
        Bounds bounds = window.getClientArea();
        System.out.println(bounds);
    }

    @Override
    public void resume() {
    }

    public static void main(String[] args) {
        DesktopApplicationContext.main(Segments.class, args);
    }

    public class ComponentSizeListener {
        protected int newWidth;
        protected int newHeight;

        protected ComponentListener listener;

        protected List<SectionComponent> components;

        public ComponentSizeListener() {
            this.newWidth = 425;
            this.newHeight = 131;

            this.listener = new ComponentListener.Adapter() {
                @Override
                public void sizeChanged(Component component, 
                        int previousWidth, int previousHeight) {
                    newWidth = component.getWidth();
                    newHeight = component.getHeight();
                    for (SectionComponent sectionComponent : components) {
                        sectionComponent.setTextAreaWidth(newWidth - 25);
                        int paneHeight = (newHeight / components.size()) - 34;
                        sectionComponent.setTextScrollPaneHeight(paneHeight);
                    }
                }
            };
        }

        public void setComponents(List<SectionComponent> components) {
            this.components = components;
        }

        public ComponentListener getListener() {
            return listener;
        }
    }

    public class SectionComponent {
        protected int textAreaWidth;
        protected int textScrollPaneHeight;

        protected Expander expander;
        protected ScrollPane textScrollPane;
        protected SectionText sectionText;
        protected TextArea textArea;

        public SectionComponent(SectionText sectionText, 
                int textAreaWidth, int textScrollPaneHeight) 
                        throws IOException {
            this.sectionText = sectionText;
            this.textAreaWidth = textAreaWidth;
            this.textScrollPaneHeight = textScrollPaneHeight;
            createPartControl();
        }

        protected void createPartControl() throws IOException {
            textArea = new TextArea();
            textArea.setEditable(false);
            textArea.setPreferredWidth(textAreaWidth);
            textArea.setText(sectionText.getTopic());

            textScrollPane = new ScrollPane();
            textScrollPane.setPreferredHeight(textScrollPaneHeight);
            textScrollPane.setVerticalScrollBarPolicy(
                    ScrollPane.ScrollBarPolicy.AUTO);
            textScrollPane.setView(textArea);

            expander = new Expander();
            expander.setTitle(sectionText.getTitle());
            expander.setContent(textScrollPane);
            expander.setExpanded(false);
        }

        public Expander getExpander() {
            return expander;
        }

        public void setTextAreaWidth(int textAreaWidth) {
            this.textAreaWidth = textAreaWidth;
            textArea.setPreferredWidth(textAreaWidth);
        }

        public void setTextScrollPaneHeight(int textScrollPaneHeight) {
            this.textScrollPaneHeight = textScrollPaneHeight;
            textScrollPane.setPreferredHeight(textScrollPaneHeight);
        }

    }

    public class SectionText {
        protected String title;
        protected Reader topic;

        public SectionText(String title, Reader topic) {
            this.title = title;
            this.topic = topic;
        }

        public String getTitle() {
            return title;
        }

        public Reader getTopic() {
            return topic;
        }
    }

    public class SectionCollection {
        protected List<SectionText> collection;

        public SectionCollection() {
            this.collection = new ArrayList<SectionText>();
        }

        public void add(SectionText sectionText) {
            collection.add(sectionText);
        }

        public int size() {
            return collection.size();
        }

        public SectionText get(int index) {
            return collection.get(index);
        }
    }   

    public class SectionCollectionCreator {
        protected SectionCollection collection;

        protected static final String text = "Attributes, Styles and Style Contexts\n\n"
                + "The simple PlainDocument class that you saw in the previous "
                + "chapter is only capable of holding text. The more complex text "
                + "components use a more sophisticated model that implements the "
                + "StyledDocument interface. StyledDocument is a sub-interface of "
                + "Document that contains methods for manipulating attributes that "
                + "control the way in which the text in the document is displayed. "
                + "The Swing text package contains a concrete implementation of "
                + "StyledDocument called DefaultStyledDocument that is used as the "
                + "default model for JTextPane and is also the base class from which "
                + "more specific models, such as the HTMLDocument class that handles "
                + "input in HTML format, can be created. In order to make use of "
                + "DefaultStyledDocument and JTextPane, you need to understand how "
                + "Swing represents and uses attributes.";

        public SectionCollectionCreator(SectionCollection collection) {
            this.collection = collection;

            String title = "Title ";

            for (int i = 1; i <= 3; i++) {
                SectionText sectionText = new SectionText(title + i, 
                        new StringReader(text));
                collection.add(sectionText);
            }
        }   
    }

}
于 2012-11-27T16:04:00.227 に答える
0

また、コンポーネントをFillPane内に配置することを検討することもできます。これにより、使用可能な領域を満たすようにコンポーネントのサイズが変更されます。これは、物事を行うためのピボットの方法のようです。

于 2013-03-09T21:32:24.607 に答える