Java 无法查看在帧中心添加的第一个JPanel
查看我的代码当我试图在安装程序屏幕的中心添加一个阶段时,打开Java 无法查看在帧中心添加的第一个JPanel,java,swing,jframe,jpanel,Java,Swing,Jframe,Jpanel,查看我的代码当我试图在安装程序屏幕的中心添加一个阶段时,打开JFrame时,我什么都没有得到。我通过将add()方法放置在overridensetVisible()方法中实现了相同的代码,我故意不放置工作代码,因为我想知道这段代码有什么问题 public class InstallerFrameDemo extends JFrame { private static final long serialVersionUID = 2L; private JPanel master
JFrame
时,我什么都没有得到。我通过将add()
方法放置在overridensetVisible()
方法中实现了相同的代码,我故意不放置工作代码,因为我想知道这段代码有什么问题
public class InstallerFrameDemo extends JFrame {
private static final long serialVersionUID = 2L;
private JPanel masterPanel;
private JPanel titlePanel;
private JLabel title;
private JPanel centerView;
private JPanel currentProgress;
private JPanel buttonPanel;
private JButton next;
private JButton back;
private JButton exit;
private JButton finished;
private InstallerModel model;
private NavigationButtonsListener navButtonsListener;
public InstallerFrameDemo(InstallerModel model) {
if (model == null) {
throw new NullPointerException();
}
this.model = model;
masterPanel = new JPanel();
titlePanel = new JPanel();
title = new JLabel("Welcome to application installer");
centerView = new JPanel();
currentProgress = new JPanel();
buttonPanel = new JPanel();
next = new JButton("Next");
back = new JButton("Back");
exit = new JButton("Exit");
finished = new JButton("Finished");
navButtonsListener = new NavigationButtonsListener();
add(model.getCurrentStage());
back.setEnabled(false);
finished.setEnabled(false);
if (model.getStageCount() <= 1) {
next.setEnabled(false);
exit.setEnabled(false);
finished.setEnabled(true);
}
exit.addActionListener(navButtonsListener);
next.addActionListener(navButtonsListener);
back.addActionListener(navButtonsListener);
finished.addActionListener(navButtonsListener);
masterPanel.setBackground(Color.WHITE);
titlePanel.setBackground(new Color(230, 230, 230));
centerView.setBackground(Color.WHITE);
buttonPanel.setBackground(Color.WHITE);
currentProgress.setBackground(Color.decode("#26b8ee"));
title.setBorder(new EmptyBorder(15, 15, 15, 15));
title.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 18));
currentProgress.setPreferredSize(new Dimension(4, 4));
masterPanel.setLayout(new BorderLayout());
centerView.setLayout(new BorderLayout());
buttonPanel.setLayout(new GridLayout());
titlePanel.add(title);
centerView.add(currentProgress, BorderLayout.PAGE_END);
buttonPanel.add(exit);
buttonPanel.add(back);
buttonPanel.add(next);
buttonPanel.add(finished);
masterPanel.add(titlePanel, BorderLayout.PAGE_START);
masterPanel.add(centerView, BorderLayout.CENTER);
masterPanel.add(buttonPanel, BorderLayout.PAGE_END);
setContentPane(masterPanel);
setTitle("Welcome to application installer");
setSize(800, 600);
}
protected void addImpl(Component comp, Object constraints, int index) {
if (comp == null) {
throw new NullPointerException();
}
if (centerView != null) {
centerView.removeAll();
// able to see
centerView.add(currentProgress, BorderLayout.PAGE_END); // successfully added
if (comp instanceof InstallerStage) {
InstallerStage stage = (InstallerStage) comp;
title.setText(stage.getTitle());
this.centerView.add(comp, BorderLayout.CENTER, index);
System.out.println(comp); // For first stage toString return - in first stage
// Got the output - in first stage but no change in view
repaint(); // Test 1
revalidate(); // Test 2
}
} else {
super.addImpl(comp, constraints, index);
}
}
public InstallerModel getInstallerModel() {
return model;
}
private class NavigationButtonsListener implements ActionListener {
public void actionPerformed(ActionEvent ae) {
if (ae.getSource() == exit) {
System.exit(0);
}
if (ae.getSource() == back) {
finished.setEnabled(false);
exit.setEnabled(true);
InstallerStage prevStage = model.getPreviousStage();
if (prevStage != null) {
add(prevStage);
next.setEnabled(true);
if (model.getCurrentStageIndex() == 0) {
back.setEnabled(false);
}
}
}
if (ae.getSource() == next) {
InstallerStage currentStage = model.getCurrentStage();
if (currentStage.process()) {
InstallerStage nextStage = model.getNextStage();
if (nextStage != null) {
add(nextStage);
back.setEnabled(true);
if (model.getCurrentStageIndex() == model
.getStageCount() - 1) {
next.setEnabled(false);
finished.setEnabled(true);
exit.setEnabled(false);
}
}
}
}
if (ae.getSource() == finished) {
InstallerStage currentStage = model.getCurrentStage();
if (currentStage.process()) {
System.exit(0);
}
}
}
}
}
公共类InstallerFrameDemo扩展了JFrame{
私有静态最终长serialVersionUID=2L;
私人JPanel主面板;
私人JPanel titlePanel;
私人产权;
私有JPanel中心视图;
私人JPanel currentProgress;
私人JPanel按钮面板;
下一个私人按钮;
私用钮扣背面;
私人按钮出口;
完成私人按钮;
私有安装模型;
私有导航按钮侦听器navButtonsListener;
公共InstallerFrameDemo(InstallerModel模型){
if(model==null){
抛出新的NullPointerException();
}
this.model=模型;
主面板=新的JPanel();
titlePanel=新的JPanel();
title=新JLabel(“欢迎使用应用程序安装程序”);
centerView=新的JPanel();
currentProgress=newjpanel();
buttonPanel=新的JPanel();
下一步=新的按钮(“下一步”);
后退=新的按钮(“后退”);
退出=新的JButton(“退出”);
完成=新的按钮(“完成”);
navButtonsListener=新导航按钮Listener();
添加(model.getCurrentStage());
back.setEnabled(false);
已完成。设置已启用(false);
如果(model.getStageCount()是被重写的方法protected void addImpl(组件comp,对象约束,int index)
给您带来了问题。如果您想向JFrame centerView添加一些内容,只需添加到它,就像添加JButtons exit一样,返回下一步并完成到buttonPanel;不要重写addImpl()正如您在JavaDocs()中看到的,重写该方法后,子对象被添加到contentPane而不是框架中。
尝试删除被重写的方法,您将看到除必须在其他地方实现的中心面板之外的所有可见方法。除非代码可运行,否则我无法帮助您。