【问题标题】:How do I nest layout managers without using swing classes/methods?如何在不使用 Swing 类/方法的情况下嵌套布局管理器?
【发布时间】:2012-10-04 21:27:48
【问题描述】:

我需要在 Java 6 中制作一个 640*480 像素的小程序,底部有一个带有一些按钮、滚动条和标签的工具栏。我能想到的最好方法是使用BorderLayout,将BorderLayout.SOUTH 区域设为GridBagLayout(将包含控件),并将BorderLayout 区域的其余部分设为空,作为放置图形的地方用控件绘制。我在网上找不到任何不使用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()
    {
    }
}

【问题讨论】:

  • 请编辑您的问题以包含错误消息。您需要打开浏览器插件的 Java 控制面板才能看到它。
  • 您是否有不想使用 Swing 的原因?在大多数 Java 圈子中,AWT 被认为是过时的。
  • @Code-Guru 没有错误消息。我只是不知道如何,并且找不到其他资源。不使用摇摆的原因?没有充分的理由,但目前我只知道一些 AWT 而不会 Swing,所以我只是坚持我所知道的
  • 环顾四周,发现没有 AWT 的东西让我相信我应该咬紧牙关,并为此自学挥杆......
  • 我强烈建议你学习 Swing。它的大部分构建在 AWT 之上,因此非常相似。至于错误消息,某处有一个。好久没做小程序了,不记得具体是怎么拉起来的了……

标签: java applet awt layout-manager java-6


【解决方案1】:

让我们澄清一些事情。 LayoutManagers 被Container(例如FramePanelApplet)用于计算Container 内组件的位置和大小。这意味着谈论“嵌套LayoutManagers”是不正确的。另一方面,您可以将Containers 嵌套在彼此内部,并为每个人提供自己的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。此外,通过将Frame 替换为JFramePanel 替换为JPanelButton 替换为JButtonLabel 替换为JLabel,可以轻松地将这个示例从AWT 更改为Swing。

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

【讨论】:

  • 这比我之前的思考过程更有意义。
猜你喜欢
  • 2014-09-20
  • 2011-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-07
  • 2016-07-26
相关资源
最近更新 更多