在JFrame中仅更改一个Panel

时间:2013-10-15 06:29:40

标签: java swing

我有一个JFrame,东西两个按钮,北方标签,南方标签和TextField。和中心的一个图像。我想在中心30秒后再拨打另一张图片。但每当我打电话给第二张图片时,北方,南方,东方和西方的组件都会消失。

这是我的代码。 // JFrame中的组件。

    firstPicblur = new JPanel(new BorderLayout());
    pictureblur01 = new ImageIcon("C:\\java pics\\papsi2.jpg");
    pictureblurA = new JLabel(pictureblur01);

    firstPicblur.add(pictureblurA,BorderLayout.CENTER);

    //FirstPicture blurred B
    firstPicblurB = new JPanel(new BorderLayout());
    pictureblur02 = new ImageIcon("C:\\java pics\\papsi1.jpg");
    pictureblurB = new JLabel(pictureblur02);

    firstPicblurB.add(pictureblurB,BorderLayout.CENTER);

    //Next0Prev buttons
    Next0Prev = new JPanel(new BorderLayout());
    Next = new JButton("NEXT");
    Prev = new JButton("PREV");

    //Next0Prev labels is constant at SOUTH
    firstPicblurA = new JPanel(new BorderLayout());
    clueNo1 = new JLabel("Picture Number 01");
    TypeHere = new JTextField("Guess Who");

    firstPicblurA.add(TypeHere, BorderLayout.CENTER);
    firstPicblurA.add(clueNo1, BorderLayout.SOUTH);

    Next0Prev.add(firstPicblur,BorderLayout.CENTER);
    Next0Prev.add(Next,BorderLayout.EAST);
    Next0Prev.add(Prev,BorderLayout.WEST);
    Next0Prev.add(firstPicblurA,BorderLayout.SOUTH);

//其他组件

这是actionEvent

        if(e.getSource() == continueButton){
        add(Next0Prev);
        Next0Prev.setVisible(true);
        Next0Prev.repaint();
        Next0Prev.revalidate();
        loadingEffectBtn.setVisible(false);
        Timer ta = new Timer(10000, new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                         add(firstPicblurB);
                         firstPicblurB.setVisible(true);
                         Next0Prev.setVisible(true);
                        }
                        });
                        ta.start();
                        ta.setRepeats(true);
    }

但是当我这样做的时候。第二张照片出现在中央,但N,E,W,S分量正在消失。

1 个答案:

答案 0 :(得分:1)

这有点难以辨别,但似乎正在发生的事情是......

您正在创建Next0Prev并将所有组件添加到其中......

Next0Prev = new JPanel(new BorderLayout());

//....

Next0Prev.add(firstPicblur,BorderLayout.CENTER);
Next0Prev.add(Next,BorderLayout.EAST);
Next0Prev.add(Prev,BorderLayout.WEST);
Next0Prev.add(firstPicblurA,BorderLayout.SOUTH);

我假设您正在添加框架...

然后在Timer的{​​{1}}中,您将actionPerformed添加到主容器中......

firstPicblurB

现在,假设主容器是public void actionPerformed(ActionEvent e) { add(firstPicblurB); firstPicblurB.setVisible(true); Next0Prev.setVisible(true); } 或使用JFrame,这将有效隐藏BorderLayout,因为Next0Prev只能包含一个组件其中任何一个都是5个职位。

相反,您应该将BorderLayout添加到firstPicblurB ...

一个更简单的解决方案是(正如已经指出的那样)使用单个Next0Prev并简单地改变它JLabel

我还强烈建议您花些时间阅读并应用Code Conventions for the Java Programming Language