【问题标题】:javax.swing.timers and jpanel visibility [duplicate]javax.swing.timers 和 jpanel 可见性
【发布时间】:2014-09-07 13:41:12
【问题描述】:

我一直在尝试一个接一个地显示多个 jpanel,每个 jpanel 之间的时间不同。我使用了 swing timer、thread.sleep 和 int++ 计数器来尝试在每个 jpanel 的显示之间创建间距,但都没有成功。

在之前的帖子中,有人告诉我计时器是最好的选择。我尝试了许多不同的教程,但都没有运气,我真的不明白它的实现。

我的启动整个过程的按钮使用 mouseListener,而我读过的所有教程都提到了使用 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);
}

提前谢谢各位。

【问题讨论】:

  • 请向我们展示您的摇摆计时器尝试。否则,我们怎么知道你做错了什么?请注意,nothing 位于代码的注释区域。您将使用 CardLayout,并在 Swing Timer 中交换卡片,但同样,如果您向我们展示更多尝试的代码,我们可以为您提供更好的帮助。
  • 我问过这个问题是因为当我使用教程时,我真的不知道我应该把它放在我已经拥有的代码中的什么地方,我想我的尝试如下......
  • “我真的不知道我会把它放在我的代码中的什么地方” 如果你没有足够的想法去尝试一些东西,那么也许你真的不应该追求编程.
  • @AndrewThompson:也许有点苛刻(我知道,这是锅叫水壶黑色),但让我们看看他尝试了什么。让我们看看他如何改进这个问题。
  • 没想到,教程就是这样进行的... ActionListener listener = new ActionListener(){ public void actionPerformed(actionEvent event){ System.out.println("hello") ; } };定时器 timer = new Timer(4000, listener);计时器.start();问题是,我真的不知道这在我已经拥有的代码中的位置,我也没有足够了解计时器来修改它以用于我的面板交换目的。我知道这段代码是正确的,因为 evert 教程非常相似。很高兴知道,谢谢,不知道代码去哪里是我的一半问题。

标签: java swing user-interface timer jpanel


【解决方案1】:

一旦我看到您改进的问题和代码,再次提供一些更具体的一般性建议:

  • 使用 CardLayout 交换 JPanel。 CardLayout tutorial 将向您展示如何操作。
  • 在 Timer 的 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();
         }
      });
   }
}

【讨论】:

    猜你喜欢
    • 2016-12-05
    • 1970-01-01
    • 1970-01-01
    • 2012-12-14
    • 2012-08-28
    • 1970-01-01
    • 2012-09-24
    • 2015-04-15
    相关资源
    最近更新 更多