gpt4 book ai didi

java - 选择 JRadioButton 时如何刷新 JPanel?

转载 作者:行者123 更新时间:2023-11-29 05:18:38 26 4
gpt4 key购买 nike


我有这门课:

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。我不知道我是否需要使用 revalidate()、repaint() 或其他东西来刷新 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
}
}
}

最佳答案

This happens because Swing isn't thread-safe?

不,发生这种情况是因为您正在将组件添加到已经显示的容器中,导致组件层次结构失效。参见 Container#add(Component comp)文档。

I don't know if I to need use revalidate(), repaint() or something else to refresh JPanel.

是的,根据前一点。这种情况下的典型顺序是:

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

还有其他方法吗?

是的,是的。正如我在 comment 中所说的那样, 恕我直言 CardLayout是通过的正确方法。参见 How to Use CardLayout教程。

简而言之:

  • 让您的面板带有单选按钮。
  • 有两个不同的面板:一个用于电影,另一个用于电视剧。
  • 有另一个 JPanelCardLayout
  • 将这两个面板(或根据需要添加多个)作为卡片添加。
  • 在单选按钮更改时,只需切换卡片布局面板的右侧“卡片”即可。

关于java - 选择 JRadioButton 时如何刷新 JPanel?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25644778/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com