有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

javajavax。摆动计时器和jpanel可见性

我一直在尝试一个接一个地显示多个JPanel,每个JPanel之间有不同的计时。我用过摆动计时器,线程。sleep和int++计数器尝试在每个jpanel的显示之间创建间隔,但均未成功

在之前的一篇文章中,我被告知定时器是最好的选择。我尝试了很多不同的教程,但都没有成功,我真的不理解它的实现

我启动整个过程的按钮使用鼠标侦听器,而我读过的所有教程都提到使用ActionListeners,这让我更加困惑

我想问一下,有没有人能告诉我如何实现这一过程

我的评论部分会编码什么

if (a.getSource() == button){
    panel1.setVisible(true);

    ActionListener listener = new ActionListener(){
        public void actiinPerformed(ActionEvent event){
            panel1.setVisible(false);
            panel2.setVisible(true);
        }
    };
    Timer timer = new Timer(4000, listener);
    timer.start();

   // This is one method I tried, and even ifit had worked I wouldnt know where to begin timing the following panels.Would I create a new timer for each part of the panel exchange?
   // panel1.setVisible(false);
   // panel2.setVisible(true);
   // panel2.setVisible(false);
   // panel3.setVisible(true);
   // panel3.setVisible(false);
   // menu.setVisible(true);
}

提前谢谢各位


共 (1) 个答案

  1. # 1 楼答案

    当我看到您改进的问题和代码时,再次给出一些更具体的一般性建议:

    • 使用CardLayout交换您的JPanel。{a1}将向您展示如何使用
    • 在计时器的ActionListener中进行交换。您不希望像最初以线性方式向我们展示的那样对其进行编码。ActionListener必须知道在计时器的每个滴答声中接下来要显示哪张卡,因此您必须给出这个逻辑
    • 如果您只想按顺序在JPanel中循环,那么交换代码可以像在CardLayout上调用next(...)一样简单
    • 但是,如果您希望以非循环的方式在JPanel中切换,那么您必须使用CardLayout的show(...)方法,传入与您希望在那时显示的JPanel相对应的适当常量

    比如说,

    import java.awt.CardLayout;
    import java.awt.Color;
    import java.awt.Component;
    import java.awt.Dimension;
    import java.awt.GridBagLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.Random;
    
    import javax.swing.*;
    
    @SuppressWarnings("serial")
    public class PanelSwap extends JPanel {
       private static final int CARD_COUNT = 5;
       private static final String CARD = "card";
       private static final int TIMER_DELAY = 1000;
       private CardLayout cardlayout = new CardLayout();
       private Random random = new Random();
    
       public PanelSwap() {
          setLayout(cardlayout);
          for (int i = 0; i < CARD_COUNT; i++) {
             add(createCardPanel(i), CARD + i);
          }
    
          new Timer(TIMER_DELAY, new TimerListener()).start();;
       }
    
       private JPanel createCardPanel(int i) {
          JPanel cardPanel = new JPanel(new GridBagLayout());
          String name = "Card Number " + i;
          JLabel label = new JLabel(name);
          cardPanel.add(label, SwingConstants.CENTER);
          cardPanel.setName(name);
    
          Dimension preferredSize = new Dimension(300, 200);
          cardPanel.setPreferredSize(preferredSize);
    
          // just to give the JPanels different background colors
          int[] rgb = new int[3];
          for (int j = 0; j < rgb.length; j++) {
             rgb[j] = random.nextInt(256);
          }
          Color background = new Color(rgb[0], rgb[1], rgb[2]);
          Color foreground = new Color(256 - rgb[0], 256 - rgb[1], 256 - rgb[2]);
          cardPanel.setBackground(background);
          label.setForeground(foreground);
          return cardPanel;
       }
    
       class TimerListener implements ActionListener {
    
          @Override
          public void actionPerformed(ActionEvent e) {
             cardlayout.next(PanelSwap.this);
          }
       }
    
       private static void createAndShowGui() {
          PanelSwap mainPanel = new PanelSwap();
    
          JFrame frame = new JFrame("PanelSwap");
          frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
          frame.getContentPane().add(mainPanel);
          frame.pack();
          frame.setLocationByPlatform(true);
          frame.setVisible(true);
       }
    
       public static void main(String[] args) {
          SwingUtilities.invokeLater(new Runnable() {
             public void run() {
                createAndShowGui();
             }
          });
       }
    }