我正在为我的开发团队制定一个任务规划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();
}
}
}
}
提前感谢您的帮助!
答案 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 Managers和Using Layout Managers了解更多详情......
答案 1 :(得分:1)
您需要在setScreen方法中invalidate()
小程序。
需要再次布置新的屏幕组件以计算其子项的大小。
遗憾的是,add
时没有自动完成!
另外,如果可能,请考虑使用LayoutManager
执行此操作。 CardLayout
会为你效力吗?