【问题标题】:Java - (NetBeans) Make a JTextArea Slide Out From Behind JFrameJava - (NetBeans) 使 JTextArea 从 JFrame 后面滑出
【发布时间】:2014-06-21 01:28:51
【问题描述】:

我刚刚在 Netbeans 中编写了一个移动/复制/删除文件的程序,我想给它一个“诊断模式”,其中有关选定文件、文件夹、变量等的信息显示在文本区域中。现在,我可以将其设置为仅在选择“诊断模式”切换时可见,但我认为如果文本区域在程序后面开始,并且在按钮切换时从 JFrame 后面“滑出”,它看起来会很棒.有没有办法做到这一点?

谢谢! -肖恩

【问题讨论】:

  • 第二个带有 setDefautCloseAction HIDE_ON_CLOSE 的 JFrane
  • @JoopEggen:????。你真的推荐这个吗?致原始海报:这需要某种动画,通常由 Swing Timer 控制。您可以创建滑动 JPanel 的图像,然后以不同程度的平移绘制该图像,直到它就位,然后使用 CardLayout 将显示图像的 JPanel 交换为真实的东西。
  • 另外,请查看my answer here 的类似问题,以及执行淡入淡出交换的this answer as well。
  • @HovercraftFullOfEels 我认为单独的 JFrame 是最简单的解决方案,尽管它缺乏您的解决方案的吸引力。

标签: java swing user-interface netbeans slide


【解决方案1】:

这里有一些适合您的入门代码。这将右滑一个面板 几乎任何内容类型。根据需要进行调整。添加错误 检查和异常处理。

测试人员:

static public void main(final String[] args) throws Exception {
    SwingUtilities.invokeAndWait(new Runnable() {
        @Override
        public void run() {
            final JPanel slider = new JPanel();
            slider.setLayout(new FlowLayout());
            slider.setBackground(Color.RED);
            slider.add(new JButton("test"));
            slider.add(new JButton("test"));
            slider.add(new JTree());
            slider.add(new JButton("test"));
            slider.add(new JButton("test"));
            final CpfJFrame42 cpfJFrame42 = new CpfJFrame42(slider, 250, 250);
            cpfJFrame42.slide(CpfJFrame42.CLOSE);
            cpfJFrame42.setSize(300, 300);
            cpfJFrame42.setLocationRelativeTo(null);
            cpfJFrame42.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            cpfJFrame42.setVisible(true);
        }
    });
}

使用 GAP 和 MIN 调整 JFrame 的间距和闭合尺寸。

impl 有点长...它使用固定的滑动速度,但 这是您可以进行的调整之一(固定 FPS 更好)。

package com.java42.example.code;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Cursor;
import java.awt.FlowLayout;
import java.awt.Insets;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.KeyAdapter;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseMotionAdapter;
import java.awt.image.BufferedImage;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTree;
import javax.swing.SwingUtilities;


public class CpfJFrame42 extends JFrame {

public static int       GAP               = 5;
public static int       MIN               = 1;

public static final int OPEN              = 0x01;
public static final int CLOSE             = 0x02;
private JDialog         jWindow           = null;
private final JPanel    basePanel;
private final int       w;
private final int       h;
private final Object    lock              = new Object();
private final boolean   useSlideButton    = true;
private boolean         isSlideInProgress = false;

private final JPanel    glassPane;
{
    glassPane = new JPanel();
    glassPane.setOpaque(false);
    glassPane.addMouseListener(new MouseAdapter() {
    });
    glassPane.addMouseMotionListener(new MouseMotionAdapter() {
    });
    glassPane.addKeyListener(new KeyAdapter() {
    });
}

public CpfJFrame42(final Component component, final int w, final int h) {

    this.w = w;
    this.h = h;
    component.setSize(w, h);

    addComponentListener(new ComponentListener() {
        @Override
        public void componentShown(final ComponentEvent e) {
        }

        @Override
        public void componentResized(final ComponentEvent e) {
            locateSlider(jWindow);
        }

        @Override
        public void componentMoved(final ComponentEvent e) {
            locateSlider(jWindow);
        }

        @Override
        public void componentHidden(final ComponentEvent e) {
        }
    });

    jWindow = new JDialog(this) {
        @Override
        public void doLayout() {
            if (isSlideInProgress) {
            }
            else {
                super.doLayout();
            }
        }
    };
    jWindow.setModal(false);
    jWindow.setUndecorated(true);
    jWindow.setSize(component.getWidth(), component.getHeight());
    jWindow.getContentPane().add(component);
    locateSlider(jWindow);
    jWindow.setVisible(true);

    if (useSlideButton) {
        basePanel = new JPanel();
        basePanel.setLayout(new BorderLayout());
        final JPanel statusPanel = new JPanel();
        basePanel.add(statusPanel, BorderLayout.SOUTH);
        statusPanel.add(new JButton("Open") {
            private static final long serialVersionUID = 9204819004142223529L;
            {
                setMargin(new Insets(0, 0, 0, 0));
            }
            {
                addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(final ActionEvent e) {
                        slide(OPEN);
                    }
                });
            }
        });

        statusPanel.add(new JButton("Close") {
            {
                setMargin(new Insets(0, 0, 0, 0));
            }
            private static final long serialVersionUID = 9204819004142223529L;
            {
                addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(final ActionEvent e) {
                        slide(CLOSE);
                    }
                });
            }
        });

        {
            //final BufferedImage bufferedImage = ImageFactory.getInstance().createTestImage(200, false);
            //final ImageIcon icon = new ImageIcon(bufferedImage);
            //basePanel.add(new JButton(icon), BorderLayout.CENTER);
        }

        getContentPane().add(basePanel);
    }
}

private void locateSlider(final JDialog jWindow) {
    if (jWindow != null) {
        final int x = getLocation().x + getWidth() + GAP;
        final int y = getLocation().y + 10;
        jWindow.setLocation(x, y);
    }
}

private void enableUserInput() {
    getGlassPane().setVisible(false);
}

private void disableUserInput() {
    setGlassPane(glassPane);
}

public void slide(final int slideType) {
    if (!isSlideInProgress) {
        isSlideInProgress = true;
        final Thread t0 = new Thread(new Runnable() {
            @Override
            public void run() {
                setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
                disableUserInput();
                slide(true, slideType);
                enableUserInput();
                setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
                isSlideInProgress = false;
            }
        });
        t0.setDaemon(true);
        t0.start();
    }
    else {
        Toolkit.getDefaultToolkit().beep();
    }
}

private void slide(final boolean useLoop, final int slideType) {
    synchronized (lock) {
        for (int x = 0; x < w; x += 25) {
            if (slideType == OPEN) {
                jWindow.setSize(x, h);
            }
            else {
                jWindow.setSize(getWidth() - x, h);
            }
            jWindow.repaint();
            try {
                Thread.sleep(42);
            } catch (final Exception e) {
                e.printStackTrace();
            }
        }
        if (slideType == OPEN) {
            jWindow.setSize(w, h);
        }
        else {
            jWindow.setSize(MIN, h);
        }
        jWindow.repaint();
    }
}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    相关资源
    最近更新 更多