2012-11-21 8 views
1

이 질문은 Java Swing: Vertical Layout with fixed width and variable height으로, Apache Pivot을 시도 할 수있는 기회가되었습니다. 정확히 하루 피벗의 경험이 있습니다.Apache Pivot GUI 구성 요소의 크기 조정

다음은 내가 만들었던 GUI입니다. Expander, ScrollPaneTextArea 윈도우의 폭을 채우도록

  1. 가 어떻게의 Expander의 일부 년대 TextArea 크기를 않으며, :

    Segments GUI

    내 질문 은 TextArea은 임의의 양의 텍스트를 저장할 수있을 정도로 키가 큽니까? 확장 된 텍스트 영역의 모든 3 Expander의 윈도우의 높이에 맞게 때

  2. 은 어떻게 ExpanderScrollPane의 높이도록 크기를합니까?

다음은 GUI를 생성 한 소스 코드입니다. Apache Pivot 버전 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); 
      } 
     } 
    } 

} 

답변

0

구성 요소를 채우기 패널에 배치하면 사용 가능한 영역을 채울 수있는 크기가됩니다. 이것은 일을하는 피벗 방식 인 것 같습니다.

+0

감사합니다. 나는 아직도 Pivot을 배우고있다. –

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); 
      } 
     } 
    } 

} 
관련 문제