0

我正在为我的开发团队开发任务计划 AWT 小程序,但遇到了问题。

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

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

每个屏幕都是 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();
        }
    }
}
}

预先感谢您的帮助!

4

2 回答 2

2

我怀疑你已经选择放弃使用布局管理器,当你添加一个新屏幕时,屏幕正在添加一个0x0大小

public void setScreen(Screen s)
{

    //...//

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

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

尝试将小程序的布局管理器设置为BorderLayout.

下一个问题是子屏幕也有同样的问题,所以即使屏幕会被调整大小(基于布局管理器的需要),屏幕本身也没有布局管理器,所以你添加到它们的组件有没有大小,它会显示屏幕尚未更新。

我还建议您看一下 Andrew 的示例CardLayout

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

于 2013-06-07T00:36:13.230 回答
1

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

很遗憾,这不是在adding 时自动完成的!

LayoutManager此外,如果可能,请考虑使用 a 执行此操作。对你有用CardLayout吗?

于 2013-06-06T23:36:39.250 回答