当前位置: 首页 > 知识库问答 >
问题:

使用cardlayout在面板之间切换时,不会更新JTextField和button

山鸿彩
2023-03-14

几天来,我一直在努力更新卡式布局中的JText field和Jbox数据。我创建了小演示来解释我的问题...当我点击“开始”按钮时,它应该显示另一个面板,它正在工作,但是当我回到主页时,我希望我的JText field和jbox从“世界”更新为“你好”,但这不起作用。任何帮助和建议将不胜感激。很抱歉代码缩进,我不知道为什么复制粘贴不能正常工作)。

  public class CardlayoutDemo {

     public static String data = "world";
     private static final String INTRO = "intro";
     private static final String GAME = "game";
     private CardLayout cardlayout = new CardLayout();
     private JPanel mainPanel = new JPanel(cardlayout);
     private IntroPanel introPanel = new IntroPanel();
     private GamePanel gamePanel = new GamePanel();
  public CardlayoutDemo() {
        mainPanel.add(introPanel.getMainComponent(), INTRO);
  mainPanel.add(gamePanel.getMainComponent(), GAME);

  introPanel.addBazBtnActionListener(new ActionListener() {
     @Override
     public void actionPerformed(ActionEvent e) {
         CardlayoutDemo.data = "hello";
         mainPanel.repaint();
         mainPanel.revalidate();
         CardLayout cl = (CardLayout)mainPanel.getLayout();
        cl.show(mainPanel, GAME);
     }
  });

  gamePanel.addBackBtnActionListener(new ActionListener() {
     @Override
     public void actionPerformed(ActionEvent e) {
         CardLayout cl = (CardLayout)mainPanel.getLayout();
        cl.show(mainPanel, INTRO);
     }
  });
     }

     private JComponent getMainComponent() {
  return mainPanel;
     }

     private static void createAndShowUI() {
  JFrame frame = new JFrame("Demo");
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frame.getContentPane().add(new CardlayoutDemo().getMainComponent());
  frame.pack();
  frame.setLocationRelativeTo(null);
  frame.setVisible(true);
     }

     public static void main(String[] args) {
  java.awt.EventQueue.invokeLater(new Runnable() {
     public void run() {
        createAndShowUI();
     }
  });
     }
  }

  class IntroPanel {
     private JPanel mainPanel = new JPanel();
     public JButton start;
     private JButton exit;
     private JTextField lblData;

     public IntroPanel() {
  mainPanel.setLayout(new BorderLayout());
  JPanel content = new JPanel();
  start = new JButton("Start");
  exit = new JButton(CardlayoutDemo.data);
  lblData = new JTextField(CardlayoutDemo.data);
  content.add(lblData);
  content.add(start);
  content.add(exit);
  mainPanel.add(content, BorderLayout.CENTER);

  exit.addActionListener(new ActionListener() {
     @Override
     public void actionPerformed(ActionEvent e) {
        Window win = SwingUtilities.getWindowAncestor(mainPanel);
        win.dispose();
     }
  });
     }
     public void addBazBtnActionListener(ActionListener listener) {
        start.addActionListener(listener);
     }
     public JComponent getMainComponent() {
        return mainPanel;
     }
  }

  class GamePanel {
     private static final Dimension MAIN_SIZE = new Dimension(400, 200);
     private JPanel mainPanel = new JPanel();
     private JButton back;

     public GamePanel() {
        back = new JButton("return to main menu");
        mainPanel.add(back);
  mainPanel.setPreferredSize(MAIN_SIZE);
     }

     public JComponent getMainComponent() {
        return mainPanel;
     }

     public void addBackBtnActionListener(ActionListener listener) {
        back.addActionListener(listener);
     }
  }

共有2个答案

百里秋月
2023-03-14

否,不要重写show方法。相反,为类提供允许其他类更改其状态的方法。例如,您可以将此方法添加到IntroPanel类:

class IntroPanel {
    // .....

    // !! added!
    public void lblDataSetText(String text) {
        lblData.setText(text);
    }
}

然后在您想要更改其lblData字段的状态时调用它:

introPanel.addBazBtnActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        // !! CardlayoutDemo.data = "hello";
        mainPanel.repaint();
        mainPanel.revalidate();
        CardLayout cl = (CardLayout) mainPanel.getLayout();
        cl.show(mainPanel, GAME);
        introPanel.lblDataSetText("Hello!"); // !!
    }
});

请注意,这是一个快速而肮脏的解决方案。如果您想要一个更健壮的解决方案,能够在较大的程序中更好地扩展,那么请按照M-V-C设计模式重新构造您的程序,并让视图根据模型中字符串状态的变化更改显示的文本。这将需要更多的工作,在一个小的“玩具”程序中不值得付出努力,但在一个大的复杂程序中值得付出努力,因为它将有助于减少耦合,从而降低复杂性和bug风险。

阎智
2023-03-14

在侦听器中执行此行时:

CardlayoutDemo.data = "hello";

您正在创建一个新的java。对象,并将字段数据设置为引用刚刚创建的新字符串。这对JTextField或先前由变量引用的字符串对象的内部状态没有影响。

要更改JTextField的文本,应该调用JTextField的setText(String)方法。

 类似资料:
  • 问题内容: 我想通过单击JPanels上的按钮在JPanels之间切换。 例如:我有一个带有JButton simknop的JPanel sim和一个带有JButton helpknop的JPanel帮助,我想通过单击按钮在这两个JPanel之间进行切换。当我单击JButton simknop时,应显示JPanel帮助;当我单击JButton帮助时,应显示JPanel sim。 您可以在下面找到不

  • 我的web应用程序由各种面板和仪表板组成,仪表板上有访问每个面板的按钮。因此,每个按钮都是专用面板和主面板之间的切换。 例如,如果我们有3个面板,panel1是默认的一个,另外两个按钮用于在其他两个面板和默认面板之间切换: 应在面板1和面板2之间切换 应在面板1和面板3之间切换 我几乎已经实现了,但是我的代码显示了panel2和panel3重叠。 所以我想让按钮1负责在面板1和面板2之间切换。和按

  • 问题内容: 码 我在侧面菜单中有两页(和)。每个页面都有2个标签: :和 :和 我正在使用每个页面包含2个选项卡。 这是一个非常简单的设计:我想单击或转到适当的路线。但是由于某种原因,状态已正确更改(请参阅控制台),但实际的html模板未更新。 您能找出问题所在以及如何解决吗? 似乎存在一些缓存问题或其他问题。 HTML JS 问题答案: 您当前指的是最新版本,该版本在从一种状态转换为另一种状态时

  • 我有一个CardLayout,由许多不同的JPanels组成,我可以随意显示。该GUI链接到后端,并且GUI的目的是允许用户操作存储在后端中的数据。 问题是,当用户更改后端中的一些数据时,我的JLabels没有反映该数据中的更改。我明白这是因为JLabels初始化了一次,当我更新它们初始化到的变量时,我必须再次调用setText,以便它们体验更改。 示例:我的JLabel是如何初始化的 问题是,当

  • 我想做一个现代的图形用户界面,左边有标签,如图所示: 有什么想法,我如何让面板在不处理写入/设置的数据的情况下进行切换,例如进入文本字段、文本区域、复选框、滚动条等? 我本来想删除旧的一个面板,并添加另一个面板,但当我点击面板之前,我访问的控制数据将被重置,我认为它会闪烁。

  • 问题内容: 我想用setText()方法更新jlabel和jtextfield,但是它不起作用。但是,其余代码仍在工作。代码如下; 在这里,islemSureci是JLabel,而textFiled是JTextField。设置它们后,它不起作用。代码中的所有工作完成后,它们就会出现。请问原因是什么? 问题答案: 我认为您的意思是 “所有工作完成之后” 是从文件(您注释的行)中加载文本。我认为这段代