>  기사  >  Java  >  Java 그래픽 인터페이스 레이아웃 디자인

Java 그래픽 인터페이스 레이아웃 디자인

高洛峰
高洛峰원래의
2017-01-17 16:20:491345검색

인터페이스 디자인에서는 컨테이너가 아름다움을 위해 많은 컴포넌트를 배치해야 합니다. 이것이 바로 레이아웃 디자인입니다. java.awt에는 여러 레이아웃 클래스가 정의되어 있으며 각 레이아웃 클래스는 레이아웃 전략에 해당합니다. 다음 레이아웃 클래스가 일반적으로 사용됩니다.

•FlowLayout, 구성 요소를 순서대로 배치합니다.
•BoarderLayout, 구성요소를 테두리에 배치합니다.
•CardLayout은 카드 놀이처럼 구성 요소를 스택하며 한 번에 하나의 구성 요소만 표시할 수 있습니다.
•GridLayout은 표시 영역을 행과 열에 따라 동일한 그리드로 나누고 구성요소를 이러한 그리드에 차례로 배치합니다.
•GridBagLayout은 표시 영역을 여러 개의 작은 직사각형 단위로 나누고 각 구성 요소는 하나 이상의 작은 단위를 차지할 수 있습니다.

그 중 GridBagLayout은 미세한 위치 제어가 가능하며 가장 복잡하기도 합니다. 이 튜토리얼에서는 이 레이아웃 전략에 대해 당분간 다루지 않으며 특집 기사에서 자세히 설명하겠습니다.

각 컨테이너에는 컨테이너에 배치된 구성 요소를 정렬하는 방법을 결정하는 레이아웃 관리자가 있습니다. 레이아웃 관리자는 LayoutManager 인터페이스를 구현하는 클래스입니다.

1. FlowLayout 레이아웃(JApplet, JPanel, JScrollPane의 기본 레이아웃)

FlowLayout 레이아웃은 추가된 순서대로 구성 요소를 왼쪽에서 오른쪽으로 정렬합니다. 행은 왼쪽에서 오른쪽으로 계속되며 각 행의 구성 요소는 중앙에 위치합니다. 이는 가장 간단한 레이아웃 전략이며 구성 요소가 많지 않을 때 일반적으로 사용됩니다. 구성 요소가 많으면 컨테이너의 구성 요소가 각 행의 길이가 달라 균일하지 않게 나타납니다.

FlowLayout은 소규모 애플리케이션과 패널의 기본 레이아웃입니다. FlowLayout 레이아웃의 구성 방법은 다음과 같습니다.

1.FlowLayout()은 기본 FlowLayout 레이아웃을 생성합니다. 기본적으로 구성 요소는 5픽셀 간격으로 중앙에 배치됩니다.
2.FlowLayout(int alignment), 각 구성 요소의 정렬을 설정합니다. 정렬 값은 FlowLayout.LEFT, FlowLayout.CENTER, FlowLayout.RIGHT일 수 있습니다.
3.FlowLayout(int alignment, int horz, int vert), 정렬을 설정하고 구성요소의 가로 간격 horz 및 세로 간격 vert를 설정합니다. 레이아웃을 설정하려면 상위 클래스 Container의 setLayout() 메서드를 사용하세요. 컨테이너를 위해. 예를 들어, 코드 setLayout(new FlowLayout())은 컨테이너의 FlowLayout 레이아웃을 설정합니다. 컨테이너에 컴포넌트를 추가하는 방법은 add(컴포넌트 이름)입니다.

2. BorderLayout 레이아웃(JWindow, JFrame, JDialog의 기본 레이아웃)

BorderLayout 레이아웃 전략은 단순히 컨테이너 내 공간을 동쪽 "동쪽", 서쪽 "서쪽", 남쪽으로 나누는 것입니다. " "남쪽", "북쪽", "중앙"의 5개 영역이 있습니다. 컴포넌트를 추가할 때 컴포넌트가 배치될 영역을 지정해야 합니다. 구성 요소를 한 위치에 배치합니다. 특정 위치에 여러 구성 요소를 추가하려면 해당 위치에 추가할 구성 요소를 먼저 다른 컨테이너에 배치한 다음 해당 위치에 컨테이너를 추가해야 합니다.

BorderLayout 레이아웃의 구성 방법은 다음과 같습니다.
(1) BorderLayout()은 기본 BorderLayout 레이아웃을 생성합니다. 기본적으로 간격은 없습니다.
(2) BorderLayout(int horz,int vert), 구성 요소 사이의 가로 및 세로 간격을 설정합니다.

BorderLayout 레이아웃 전략의 설정 방법은 setLayout(new BorderLayout())입니다. 컨테이너에 컴포넌트를 추가하는 방법은 add(컴포넌트 이름, 위치)입니다. 컴포넌트 추가 시 위치를 지정하지 않으면 기본 위치는 "가운데"입니다.

BorderLayout 레이아웃은 JWindow, JFrame 및 JDialog의 기본 레이아웃입니다.
【예시 11-5】애플리케이션에는 5개의 라벨이 있으며 창의 동쪽, 서쪽, 남쪽, 북쪽 및 중앙 영역에 배치됩니다.

import javax.swing.*;import java.awt.*;
public class J505{
  public static void main(String[]args){
    JLabel label1,label2,label3,label4,label5;
    JFrame mw=new JFrame("我是一个窗口");//创建一个窗口容器对象
    mw.setSize(250,200);
    Container con=mw.getContentPane();
    con.setLayout(new BorderLayout());
    label1=new JLabel("东标签");//默认左对齐
    label2=new JLabel("南标签",JLabel.CENTER);
    label3=new JLabel("西标签");
    label4=new JLabel("北标签",JLabel.CENTER);
    label5=new JLabel("中标签",JLabel.CENTER);
    con.add(label1,"East");
    con.add(label2,"South");
    con.add(label3,"West");
    con.add(label4,"North");
    con.add(label5,"Center");
    mw.setVisible(true);
  }
}

3. GridLayout

GridLayout 레이아웃은 컨테이너를 행과 열의 그리드로 나누며, 행과 열의 수는 프로그램에 의해 제어되며 구성 요소는 작은 그리드에 배치됩니다. 그리드의. GridLayout 레이아웃은 상대적으로 정확한 구성 요소 위치 지정이 특징입니다. GridLayout 레이아웃의 각 그리드는 모양과 크기가 동일하므로 컨테이너에 배치된 구성 요소도 동일한 크기를 유지해야 합니다.

GridLayout 레이아웃의 구성 방법은 다음과 같습니다.
(1) 단일 열 GridLayout 레이아웃을 생성하는 GridLayout(). 기본적으로 간격은 없습니다.
(2) GridLayout(int row, int col), 행 행과 열 열로 GridLayout 레이아웃을 설정합니다.
(3) GridLayout(int row,int col,int horz,int vert)은 레이아웃의 행과 열 수, 구성 요소의 가로 및 세로 간격을 설정합니다.

GridLayout 레이아웃은 배치된 구성 요소 수가 제한을 초과하면 자동으로 열이 추가되고, 구성 요소가 너무 적으면 열 수가 자동으로 줄어듭니다. 변경되지 않고 구성 요소가 행 우선 순위에 따라 정렬됩니다(구성 요소 자동으로 열 증가 또는 감소에 따라). GridLayout 레이아웃의 각 그리드는 구성 요소로 채워져야 합니다. 그리드를 비워두려면 빈 레이블(add(new Label()))로 바꿀 수 있습니다.

[예 11-6] 애플릿은 먼저 여러 개의 버튼과 레이블을 JPanel에 넣은 다음 JPanel을 JScrollPane에 넣고 마지막으로 JScrollPane을 애플릿 창에 넣습니다. 수평 및 수직 스크롤 막대. 스크롤 패널의 가시 범위는 패널의 실제 요구 사항보다 작습니다. 스크롤 막대의 슬라이더를 움직여 원래 가시 범위 내에 없었던 패널 영역을 표시할 수 있습니다.

import java.applet.*;
import javax.swing.*;
import java.awt.*;
class MyWindow extends JFrame{
  public MyWindow(int w,int h){
    setTitle("滚动面板实例");
    Container con=getContentPane();
    con.setPreferredSize(new Dimension(w,h));
    con.setLayout(new BorderLayout());
    JPanel p=new JPanel();
    p.setLayout(new GridLayout(6,6));
    for (int i=0;i<6;i++){
      p.add(new JLabel());
      for(int j=1;j<=2;j++){
        p.add(new JButton("按钮"+(2*i+j)));
        p.add(new JLabel("标签"+(2*i+j)));
      }
      p.add(new JLabel());
    }
    p.setBackground(Color.blue);
    p.setPreferredSize(new Dimension(w+60,h+60));
    JScrollPane ScrollPane=new JScrollPane(p);
    ScrollPane.setPreferredSize(new Dimension(w-60,h-60));
    add(ScrollPane,BorderLayout.CENTER);//小程序添加滚动面板
    setVisible(true); pack();
  }
}
class ScrollPane extends JScrollPane{
  public ScrollPane(Component p){
    super(p);
    setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
    setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
  }
}
public class J506 extends Applet{
  MyWindow myWindow;
  public void init(){
    myWindow=new MyWindow(400,350);
  }
}

GridLayout布局要求所有组件的大小保持一致,这可能会使用界面外观不够美观。一个补救的办法是让一些小组件合并放在一个容器中,然后把这个容器作为组件,再放入到GridLayout布局中。这就是前面所说的容器嵌套。例如,容器A使用GridLayout布局,将容器均分为网格;另有容器B和C各放入若干组件后,把B和C分别作为组件添加到容器A中。容器B和C也可以设置为GridLayout布局,把自己分为若干网格,也可以设置成其他布局。这样,从外观来看,各组件的大小就有了差异。

四.CardLayout布局

采用CardLayout布局的容器虽可容纳多个组件,但是多个组件拥有同一个显示空间,某一时刻只能显示一个组件。就像一叠扑克牌每次只能显示最上面的一张一样,这个显示的组件将占据容器的全部空间。CardLayout布局设计步骤如下:
先创建CardLayout布局对象。然后,使用setLayout()方法为容器设置布局。最的,调用容器的add()方法将组件加入容器。CardLayout布局策略加入组件的方法是:
    add(组件代号,组件);
其中组件代号是字符串,是另给的,与组件名无关。

例如,以下代码为一个JPanel容器设定CardLayout布局:

CardLayout myCard = new CardLayout();//创建CardLayout布局对象
JPanel p = new JPanel();//创建Panel对象
p.setLayout(myCard);

用CardLayout类提供的方法显示某一组件的方式有两种:
(1) 使用show(容器名,组件代号)形式的代码,指定某个容器中的某个组件显示。例如,以下代码指定容器p的组件代号k,显示这个组件:
    myCard.show(p,k);
(2) 按组件加入容器的顺序显示组件。

first(容器):例如,代码myCard.first(p);
last(容器):例如 , myCard.last(p);
next(容器):例如,myCard.next(p);
previous(容器):myCard.previous(p);

【例11-7】小应用程序使用CardLayout布局,面板容器p使用CardLayout布局策略设置10个标签组件。窗口设有4个按钮,分别负责显示p的第一个组件、最后一个组件、当前组件的前一个组件和当前的组件的最后一个组件。

import java.applet.*;import java.awt.*;
import java.awt.event.*;import javax.swing.*;
class MyPanel extends JPanel{
  int x;JLabel label1;
  MyPanel(int a){
    x=a;getSize();
    label1=new JLabel("我是第"+x+"个标签");add(label1);
  }
  public Dimension getPreferredSize(){
    return new Dimension(200,50);
  }
}
public class J507 extends Applet implements ActionListener{
  CardLayout mycard;MyPanel myPanel[];JPanel p;
  private void addButton(JPanel pan,String butName,ActionListener listener){
    JButton aButton=new JButton(butName);
    aButton.addActionListener(listener);
    pan.add(aButton);
  }
  public void init(){
    setLayout(new BorderLayout());//小程序的布局是边界布局
    mycard=new CardLayout();
    this.setSize(400,150);
    p=new JPanel();p.setLayout(mycard);//p的布局设置为卡片式布局
    myPanel=new MyPanel[10];
    for(int i=0;i<10;i++){
      myPanel[i]=new MyPanel(i+1);
      p.add("A"+i,myPanel[i]);
    }
    JPanel p2=new JPanel();
    addButton(p2,"第一个",this);
    addButton(p2,"最后一个",this);
    addButton(p2,"前一个",this);
    addButton(p2,"后一个",this);
    add(p,"Center"); add(p2,"South");
  }
  public void actionPerformed(ActionEvent e){
    if (e.getActionCommand().equals("第一个"))mycard.first(p);
    else if(e.getActionCommand().equals("最后一个"))mycard.last(p);
    else if(e.getActionCommand().equals("前一个"))mycard.previous(p);
    else if(e.getActionCommand().equals("后一个"))mycard.next(p);
  }
}

五.null布局与setBounds方法

 空布局就是把一个容器的布局设置为null布局。空布局采用setBounds()方法设置组件本身的大小和在容器中的位置:
    setBounds(int x,int y,int width,int height)
组件所占区域是一个矩形,参数x,y是组件的左上角在容器中的位置坐标;参数weight,height是组件的宽和高。空布局安置组件的办法分两个步骤:先使用add()方法身容器添加组件。然后调用setBounds()方法设置组件在容器中的位置和组件本身的大小。与组件相关的其他方法:

1.getSize().width,
2.getSize().height
3.setVgap(ing vgap)
4.setHgap(int hgap);

更多java图形界面之布局设计相关文章请关注PHP中文网!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.