Java AWT多屏幕不显示

时间:2013-06-06 23:29:07

标签: java user-interface awt containers

我正在为我的开发团队制定一个任务规划AWT applet,我遇到了一个问题。

我正在使用一个屏幕系统,其中主类有一个“当前屏幕”变量,用于绘制其他屏幕。小程序启动时,会加载“主屏幕”,其中包含“聊天室”按钮。当您单击该按钮时,它应该打开聊天室屏幕。

我的问题是它显示主屏幕很好,但是当你点击按钮时,一切都变成空白,聊天室根本就不显示。我做错了什么?

每个屏幕都是Screen类的子类,它是Container的子类。

主类:

public class TPApplet extends Applet
{
private static final long serialVersionUID = 7611084043153150559L;
private static final int WIDTH = 400;
private static final int HEIGHT = 350;
private static final String TITLE = "TaskPlanner v";
private static final double VERSION = 0.01;

private boolean setup = false;

public Screen currentScreen;

public void init()
{
    setLayout(null);

    setScreen(new MainScreen(this));
}

public void stop()
{
}

public void setScreen(Screen s)
{
    if (currentScreen != null)
    {
        currentScreen.destroy();
        remove(currentScreen);
    }

    currentScreen = s;

    if (currentScreen != null)
    {
        currentScreen.init();
        add(currentScreen);
    }
}

public void paint(Graphics g)
{
    if (!setup)
    {
        setSize(WIDTH, HEIGHT);
        setName(TITLE + VERSION);

        currentScreen.setLocation(0, 0);
        currentScreen.setSize(WIDTH, HEIGHT);

        setup = true;
    }

    if (currentScreen != null)
    {
        currentScreen.paint(g);
    }
}
}

主菜单类:

public class MainScreen extends Screen
{
private static final long serialVersionUID = -993648854350389881L;

private TPApplet applet;

private Button todoButton;
private Button chatButton;

private boolean setup = false;

public MainScreen(TPApplet tpApplet)
{
    applet = tpApplet;
}

@Override
public void init()
{
    setLayout(null);

    todoButton = createButton("To-Do List");
    chatButton = createButton("Chatroom");
}

@Override
public void destroy()
{
    removeAll();
}

@Override
public void paint(Graphics g)
{
    if (!setup)
    {
        todoButton.setLocation(25, 50);
        todoButton.setSize(100, 40);

        chatButton.setLocation(135, 50);
        chatButton.setSize(100, 40);

        setup = true;
    }
}

@Override
public void actionPerformed(ActionEvent e)
{
    if (e.getSource() instanceof Button)
    {
        Button button = (Button) e.getSource();

        if (button.getLabel() == chatButton.getLabel())
        {
            applet.setScreen(new ChatScreen(applet));
        }
    }
}
}

聊天室类:

public class ChatScreen extends Screen
{
private static final long serialVersionUID = -8774060448361093669L;

private TPApplet applet;

private ScrollPane chatWindow;
private TextField textField;
private Button sendButton;

private boolean setup = false;

public ChatScreen(TPApplet tpApplet)
{
    applet = tpApplet;
}

@Override
public void init()
{
    setLayout(null);

    sendButton = createButton("Send");

    chatWindow = new ScrollPane();
    textField = new TextField();

    add(chatWindow);
    add(textField);
}

@Override
public void destroy()
{
    removeAll();
}

@Override
public void paint(Graphics g)
{
    if (!setup)
    {
        chatWindow.setLocation(20, 20);
        chatWindow.setSize(100, 100);

        textField.setLocation(150, 150);
        textField.setSize(60, 20);

        sendButton.setLocation(220, 150);
        sendButton.setSize(40, 20);

        setup = true;
    }
}

@Override
public void actionPerformed(ActionEvent e)
{
    if (e.getSource() instanceof Button)
    {
        Button button = (Button) e.getSource();

        if (button.getLabel() == sendButton.getLabel())
        {
            String text = textField.getText();
        }
    }
}
}

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

我怀疑,当您选择放弃使用布局管理器时,当您添加新屏幕时,屏幕正在添加0x0尺寸

public void setScreen(Screen s)
{

    //...//

    if (currentScreen != null)
    {
        currentScreen.init();
        // Look ma, I have no size...
        add(currentScreen);
    }
}

布局管理器的一项工作是决定如何布置任何新组件。

尝试将applet的布局管理器设置为BorderLayout

下一个问题是子屏幕遇到同样的问题,所以即使屏幕大小(根据布局管理器的需要),屏幕本身也没有布局管理器,所以你添加的组件他们没有大小,看起来屏幕还没有更新。

我还建议你看看安德鲁的CardLayout

示例

您还可以查看A Visual Guide to Layout ManagersUsing Layout Managers了解更多详情......

答案 1 :(得分:1)

您需要在setScreen方法中invalidate()小程序。 需要再次布置新的屏幕组件以计算其子项的大小。

遗憾的是,add时没有自动完成!

另外,如果可能,请考虑使用LayoutManager执行此操作。 CardLayout会为你效力吗?