在主窗口中切换 JPanel

Posted

技术标签:

【中文标题】在主窗口中切换 JPanel【英文标题】:switching JPanel within main window 【发布时间】:2012-02-09 21:56:37 【问题描述】:

我有一个应用程序允许用户选择一个选项,并根据用户选择从组件中删除一个 JPanel,添加新的 JPanel 并重新验证组件

见代码:

          if (c != null) 
                contentPane.remove(c);
            
            c = new AddBookInterface(theLibrary);
            contentPane.add(c);
            contentPane.revalidate();
            break;

c 是一个组件

我有几个 JPanel,用户可以在它们之间切换并且切换正常。但是,当我在用户选择时添加此 JPanel 时,之后添加的 JPanel 无法正确加载。这是什么原因造成的?

   public class RemoveBookInterface extends JPanel 

private Library theLibrary;

public RemoveBookInterface(Library theLibrary) 
    this.theLibrary = theLibrary;
    setSize(400, 400);
    setLayout(new BorderLayout());
    setVisible(true);
    removeBook(theLibrary);


public void removeBook(Library theLibrary) 
    // prompt user for book id of book to remove
    Long ID = Long
            .parseLong(JOptionPane
                    .showInputDialog("Enter the library book ID for the book you want to remove"));
    try 
        // get library book info and store it to display in message
        LibraryBook lb = theLibrary.getInventory().findLibraryBook(ID);
        // remove book
        theLibrary.removeBook(ID);
        // display message indicating book was removed
        JOptionPane
                .showMessageDialog(
                        null,
                        "The following library book was removed:\n"
                                + lb.toString());
     catch (Exception e1) 
        JOptionPane.showMessageDialog(null, e1.getMessage());

    

【问题讨论】:

为什么要进行所有这些不必要的体操?我只是使用 CardLayout 并让布局为您完成繁重的工作。 【参考方案1】:

更好的方法是转向 CardLayout。但是如果你想坚持你的方法,那么试着在你的行之后添加这个

if (c != null) 
            contentPane.remove(c);
        
        c = new AddBookInterface(theLibrary);
        contentPane.add(c);
        contentPane.revalidate();
        contentPane.repaint(); 
        frame.validate();
        frame.repaint();
        break;

或者您可能忘记为事件调度程序线程安排作业。 一个帮助您的示例程序:

import java.awt.event.*;
import javax.swing.*;

public class TwoPanelTest implements ActionListener

    private JFrame frame;

    private JPanel panel1;
    private JPanel panel2;

    private JButton button1;
    private JButton button2;

    private JLabel label1;
    private JLabel label2;

    private JTextField tfield1;
    private JTextField tfield2;

    public TwoPanelTest()
    
        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        panel1 = new JPanel();
        panel2 = new JPanel();

        label1 = new JLabel("This is Label 1");
        label2 = new JLabel("This is Label 2");

        button1 = new JButton("BUTTON 1");
        button2 = new JButton("BUTTON 2");
        button1.addActionListener(this);
        button2.addActionListener(this);

        tfield1 = new JTextField(20);
        tfield2 = new JTextField(20);

        panel1.add(label1);
        panel1.add(button1);
        panel1.add(tfield1);

        panel2.add(label2);
        panel2.add(button2);
        panel2.add(tfield2);

        tfield1.setText("MY TEXT WILL CHANGE.");
        frame.setContentPane(panel1);
        frame.pack();
        frame.setVisible(true);
    

    public void actionPerformed(ActionEvent ae)
    
        JButton button = (JButton)ae.getSource();
        if (button == button1)
        
            frame.remove(panel1);
            frame.setContentPane(panel2);
            tfield2.setText("TEXTFIELD 2");
            frame.validate();
            frame.repaint();
        
        else if (button == button2)
        
            frame.remove(panel2);
            frame.setContentPane(panel1);
            tfield1.setText("TEXTFIELD 1");
            frame.validate();
            frame.repaint();
        
    


    public static void main(String[] args)
    
                // Here Event Dispatcher thread is responsible for 
                // calling the function which creates and displays your GUI
                // or it itself contains the code for creating and displaying
                // the GUI, to remove hickups experienced while updating the 
                // GUI on the run.
        SwingUtilities.invokeLater(new Runnable()
            
                public void run()
                
                    new TwoPanelTest();
                
            );
    

希望这可能会有所帮助。

问候。

【讨论】:

以上是关于在主窗口中切换 JPanel的主要内容,如果未能解决你的问题,请参考以下文章

C#窗口切换问题:如何切换回主窗体

QT两个窗口间的相互切换

在 MVVM wpf 中切换视图

Java中的JPanel与JFrame

JPanel与JFrame的区别

java swing两个内容切换