1

首先让我解释一下我的问题,

在第一个视图中,我的框架中有一个 jpanel pnlBttns,如图所示,它有 2 个按钮。

在此处输入图像描述

单击时Edit Video,此 jpanel 被删除,我将另一个名为 editPanel 的 jpanel 添加到我的框架中,如下图所示,

pnlBttns

现在问题来

当我单击后退按钮时,我删除了 editPanel 并显示了 pnlBttns。但是我的框架显示如下,两个按钮在那里但没有文字。

编辑面板.

这个问题很奇怪,因为当再次点击编辑视频按钮(虽然它是空的)时,它会带我进入editPanel,并显示所有键正常。那么为什么 pnlBttns 没有正确显示,它没有正确“重新绘制”。

代码

sscce.java

import java.awt.Dimension;
import java.awt.*;
import java.io.IOException;
import java.awt.event.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.Graphics;
import java.io.File;
import javax.swing.border.EmptyBorder;
import javax.swing.border.EtchedBorder;
import java.net.MalformedURLException;
import javax.swing.JComponent;
import javax.swing.JFrame;
import static java.awt.GraphicsDevice.WindowTranslucency.*;



public class sscce extends JFrame implements ActionListener{

    JFrame frame = new JFrame("My Editor");             //Open window.
    String state = new String("wait");
    //Panels
    JPanel pnlBttns = new JPanel();
    JPanel editPanel = new JPanel();
    JPanel uploadPanel = new JPanel();
    JPanel welcome = new JPanel();
    JPanel f = new JPanel();
    JPanel head = new JPanel();

    //Buttons
    JButton button1 = new JButton("E");
    JButton button2 = new JButton("U");
    JButton cut = new JButton("Cut");
    JButton trim = new JButton("Trim");
    JButton audio = new JButton("Audio");
    JButton done = new JButton("Done");
    JButton play = new JButton();
    JButton stop = new JButton();

    public sscce() {
        //Customize Window to record.
        frame.setLayout(new BorderLayout());
        frame.setLocation(100,100);
        frame.setSize(1200,700);
    // ****On closing window event
        pnlBttns.setLayout(new BorderLayout());

        //Paddings
        editPanel.setBorder(BorderFactory.createCompoundBorder(new EmptyBorder(30, 10, 30, 10), new EmptyBorder(0,0,0,0)));
        uploadPanel.setBorder(BorderFactory.createCompoundBorder(new EmptyBorder(30, 10, 30, 10), new EmptyBorder(0,0,0,0)));
        pnlBttns.setBorder(BorderFactory.createCompoundBorder(new EmptyBorder(80, 10, 340, 10), new EmptyBorder(0,0,0,0)));

        //Set commands for Buttons 
        button1.setToolTipText("Start Editing Video"); 
        button1.setActionCommand("edit");
        button1.addActionListener(this);
        button2.setToolTipText("Upload this Video"); 
        button2.setActionCommand("upload");
        button2.addActionListener(this);
        pnlBttns.add(button1, BorderLayout.NORTH);          
        pnlBttns.add(button2, BorderLayout.SOUTH);
        frame.add(pnlBttns, BorderLayout.EAST);

        //create edit panel
        editPanel.setLayout(new BoxLayout(editPanel, BoxLayout.Y_AXIS));
        done.setToolTipText("Go back");
        done.setActionCommand("done");
        done.addActionListener(this);
        cut.setToolTipText("Cut Video into parts");
        cut.setActionCommand("cut");
        cut.addActionListener(this);
        trim.setToolTipText("Remove parts of Video");
        trim.setActionCommand("trim");
        trim.addActionListener(this);
        audio.setToolTipText("Edit audio of Video");
        audio.setActionCommand("audio");
        audio.addActionListener(this);
        editPanel.add(audio);
        editPanel.add(Box.createRigidArea(new Dimension(0, 10)));
        editPanel.add(cut);
        editPanel.add(Box.createRigidArea(new Dimension(0, 10)));
        editPanel.add(trim);
        editPanel.add(Box.createRigidArea(new Dimension(0, 50)));
        editPanel.add(done);
        frame.add(editPanel, BorderLayout.EAST);
        editPanel.setVisible(false);
        frame.revalidate();
        frame.repaint();
        frame.add(pnlBttns, BorderLayout.EAST);
        //create upload panel.
        addVideo();
    }

    public void addVideo()
        {   head.setLayout(new GridBagLayout());
            f.setLayout(new BorderLayout());
            f.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.RAISED));
            JPanel videoPanel = new JPanel();
            f.add(videoPanel, BorderLayout.CENTER);
            frame.add(f, BorderLayout.CENTER);
            frame.add(head, BorderLayout.PAGE_START);
            frame.setVisible(true);
        }
    public static void main(String[] args){
        new sscce();
    }

    public void actionPerformed(ActionEvent e){


        if ("edit".equals(e.getActionCommand())) {

            state = "edit";
            pnlBttns.setVisible(false);
            editPanel.setVisible(true);
            frame.revalidate();
            frame.repaint();

        } else if ("done".equals(e.getActionCommand())){

                editPanel.setVisible(false);
                pnlBttns.setVisible(true);
                frame.revalidate();
                frame.repaint();

        }   
    }   
}

另一个版本,

要隐藏 pnlBttns,

state = "edit";
frame.remove(pnlBttns);
frame.add(editPanel, BorderLayout.EAST);
frame.revalidate();
frame.repaint();

为了再次展示,

frame.remove(editPanel);
frame.add(pnlBttns);
frame.revalidate();
frame.repaint();

我已经检查过并且 100% 确定,我无法更新两个按钮的文本。

我猜是问题所在,可能是面板的大小。

你看到的黑色是我的视频播放器,当 pnlBttns 被移除时它的大小会增加,因为 editPanel 更薄,当添加回来时,mediaPlayer 也与 pnlBttns 有一点重叠。这可能是问题所在,文本仍然应该在那里。我怎么解决这个问题?

感谢您的时间和努力。

4

5 回答 5

4

每当我看到使用删除/添加方法的代码时,我建议您应该改用卡片布局。它将管理正确面板的显示。

于 2013-08-08T17:27:28.580 回答
4
state = "edit";
frame.remove(pnlBttns);
frame.add(editPanel, BorderLayout.EAST);
frame.revalidate();
frame.repaint();

为了再次展示,

frame.remove(editPanel);
frame.add(pnlBttns, BorderLayout.EAST);    //May be you need to add this to east
frame.revalidate();
frame.repaint();

PS:我的第 100 个答案。

于 2013-08-08T18:33:37.833 回答
1

你是对的,面板的宽度可能是原因,只是不要改变视频播放器的宽度,如果问题仍然存在,
我希望你使用 JLayeredPane,并在该面板上添加两个面板并使用 setVisible (true) 和 setVisible(false) 用于显示或隐藏面板,这是一种简单的方法,不会产生错误。
给我你对答案的反馈。

于 2013-08-08T17:46:43.330 回答
1

尝试使用setVisible(false)而不是删除它,然后当您希望它再次出现时,使用setVisible(true)

于 2013-08-08T17:28:41.107 回答
-1

当我在 NetBeans 上使用 swings 时,我曾经遇到过同样的问题。挣扎了几个小时之后。我所做的只是重新启动了 IDE 。问题就消失了。试一试

于 2013-08-08T17:35:27.393 回答