如何刷新的JPanel当一个JRadioButton的选择?(How to refresh JPan

2019-10-20 21:05发布


我有这个类:

public class TF extends JPanel implements ActionListener
{
    private ButtonGroup buttonGroup = new ButtonGroup();
    private JRadioButton rdbtnFilm;
    private JRadioButton rdbtnSerieTv;
    private JPanel pnlGeneral;
    private JPanel pnlRadioButton;
    private JLabel lblTitolo;
    private JTextField tfTitolo;

    public TF() 
    {   
        pnlGeneral = new JPanel();
        pnlRadioButton = new JPanel();

        rdbtnFilm = new JRadioButton("Film");
        rdbtnFilm.addActionListener(this);
        pnlRadioButton.add(rdbtnFilm);
        buttonGroup.add(rdbtnFilm);

        rdbtnSerieTv = new JRadioButton("Serie Tv");
        rdbtnSerieTv.addActionListener(this);
        pnlRadioButton.add(rdbtnSerieTv);
        buttonGroup.add(rdbtnSerieTv);

        pnlGeneral.add(pnlRadioButton, gbc_panel_1);
        this.add(pnlGeneral);
    }

    public void actionPerformed(ActionEvent e) 
    {
        if(rdbtnFilm.isSelected())
        {
            lblTitolo = new JLabel("Titolo");
            pnlGeneral.add(lblTitolo, gbc_lblTitolo);

            tfTitolo = new JTextField();
            tfTitolo.setColumns(10);
            tfTitolo.setText("1");
            pnlGeneral.add(tfTitolo, gbc_tfTitolo);
        }

        if(rdbtnSerieTv.isSelected())
        {
            lblTitolo = new JLabel("Titolo");
            pnlGeneral.add(lblTitolo, gbc_lblTitolo);

            tfTitolo = new JTextField();
            tfTitolo.setColumns(10);
            tfTitolo.setText("1");
            pnlGeneral.add(tfTitolo, gbc_tfTitolo);
        }
    }
}

但是当我选择一个单选按钮只是有时候的JPanel告诉我的JLabel和JTextField中。 我不知道我是否需要使用重新验证(),重绘()或别的东西刷新的JPanel。 这是因为Swing是不是线程安全的?

更新

public class Main
{
    public static void main(String[] args) throws IOException
    {
        SwingUtilities.invokeLater(new Runnable() 
        {
              public void run() 
              {
                  JFrame gui=new GUI();
                  gui.setVisible(true);
                  gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                  gui.setSize(800,720);
              }
        });
    }
}


public class GUI extends JFrame implements MouseListener
{
    private boolean selected=true;
    public GUI()
    {   
        //Creazione del Menu
        JMenuBar menuBar = new JMenuBar();
        this.setJMenuBar(menuBar);

        JMenu menu = new JMenu("Switcha");
        menuBar.add(menu);
        menu.addMouseListener(this);
        this.add(new TF());
    }

    public void mouseClicked(MouseEvent e)
    {
        if(selected)
        {
            this.getContentPane().removeAll();
            this.getContentPane().add(new TF());
            // do something else
        }
        else
        {
            this.getContentPane().removeAll();
            this.getContentPane().add(new TF2());
            // do something else
        }
    }
}

Answer 1:

这是因为Swing是不是线程安全的?

不,这是因为你将组件添加到一个已经显示容器,造成组件层次无效。 见集装箱#添加(组件comp)文档。

我不知道我是否需要使用revalidate() repaint()或别的东西刷新JPanel

是的,按照前文的点。 在这种情况下tipical顺序是:

panel.add(someComponent);
panel.revalidate();
panel.repaint();

有另一种方式来做到这一点?

是的。 正如我在已经表示意见 ,恕我直言CardLayout是要经过适当的方式。 请参阅如何使用CardLayout教程。

简而言之:

  • 让您的面板单选按钮。
  • 有两种不同的面板:一个电影和一个又一个的电视连续剧。
  • 有另外JPanelCardLayout
  • 加入这两个面板(或多达需要)的卡。
  • 在单选按钮上只改变开关卡布局面板右侧的“名片”。


文章来源: How to refresh JPanel when JRadioButton is select?