如何在不使用 swing 类/方法的情况下嵌套布局管理器



我需要在Java 6中制作一个小程序,640 * 480像素,底部有一个工具栏,带有一些按钮,滚动条和标签。我能想到的最好的方法是使用 BorderLayout ,使BorderLayout.SOUTH区域成为GridBagLayout(将包含控件),而BorderLayout区域的其余部分为 null,作为使用控件绘制 grapics 的位置。我在网上找不到任何不使用 swing 的资源,我对 swing 一无所知,无法推断他们在做什么或如何将其转换为 awt 代码。这就是我现在所处的位置。代码在init()中突然结束,因为这是布局管理器开始的地方。感谢您的任何帮助。如果您需要更多信息,请告诉我这里的内容。

import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class Bounce extends Applet implements ActionListener, AdjustmentListener
{
    private static final long serialVersionUID = 1L;
    private Graphics page;
    //buttons
    String shapeButtonText = "Square";
    Button shape = new Button(shapeButtonText);
    Button quit = new Button("Quit");
    Button run = new Button("Run");
    Button tail = new Button("Tail");
    Button clear = new Button("Clear");
    //labels
    Label speedLabel = new Label("Speed", Label.CENTER);
    Label sizeLabel = new Label("Size", Label.CENTER);
    //scrollbars
    private final int barHeight = 20;
    private final int SLIDER_WIDTH = 10;
    private final int MAXSPEED = 110;
    private final int MINSPEED = 0;
    private final int UNIT_INC = 1;
    private final int BLOC_INC = 10;
    private final int MAX_SIZE = 110;
    private final int MIN_SIZE = 10;
    Scrollbar speedBar = new Scrollbar(Scrollbar.HORIZONTAL, MINSPEED, SLIDER_WIDTH, 0, MAXSPEED);  
    Scrollbar sizeBar = new Scrollbar(Scrollbar.HORIZONTAL, MIN_SIZE, SLIDER_WIDTH, 0, MAX_SIZE);

    //methods   
    public void init()
    {
        //set up objects
        //speed scroll bar
        speedBar.setUnitIncrement(UNIT_INC);
        speedBar.setBlockIncrement(BLOC_INC);
        speedBar.setValue(MAXSPEED/2);
        //size scrollbar
        sizeBar.setUnitIncrement(UNIT_INC);
        sizeBar.setBlockIncrement(BLOC_INC);
        sizeBar.setValue(MAX_SIZE/2);
        //draw the window
        BorderLayout window = new BorderLayout();
        GridBagLayout toolbar = new GridBagLayout();
        //?
    }
    public void start()
    {
    }
    public void run()
    {
    }
    public void actionPerformed(ActionEvent e)
    {
    }
    public void adjustmentValueChanged(AdjustmentEvent e)
    {
    }
    public void stop()
    {
    }
    public void destory()
    {
    }
}

让我们澄清一些事情。LayoutManager s 被Container(如FramePanelApplet)用来计算Container内组件的位置和大小。这意味着谈论"嵌套LayoutManager s"是不正确的。另一方面,您可以将Container嵌套在彼此内部,并为每个嵌套LayoutManager。我相信这就是你想要做的。

让我用一个人为的例子来说明这一点:

public class MyGUI {
    public static void main(String[] args) {
        Frame f = new Frame("Layout Example");
        Panel mainPanel = new Panel(new BorderLayout());
        f.add(mainPanel);
        Panel toolBar = new Panel(new FlowLayout());
        toolBar.add(new Button("Button 1"));
        toolBar.add(new Button("Button 2"));
        mainPanel.add(tollBar.NORTH);
        Panel statusBar = new Panel(new FlowLayout());
        statusBar.add(new Label("Status"));
        mainPanel.add(statusBar);
        f.pack();
        f.show();
    }
}

请注意,您需要为每个LayoutManager创建一个新Panel。或者更确切地说,您创建的每个Panel都需要一个 LayoutManager . 此外,此示例可以很容易地从AWT更改为Swing,方法是将Frame替换为JFramePanel替换为JPanelButton替换为JButton,并将Label替换为JLabel

附言上面的代码没有经过测试。不过,它应该说明这里涉及的概念。

相关内容