Java - (NetBeans) 使 JTextArea 从 JFrame 后面滑出

标签 java swing user-interface netbeans slide

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

谢谢! -肖恩

最佳答案

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

测试人员:

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 的间距和闭合尺寸。

Closed

Opened

该实现有点长...它使用固定的滑动速度,但是 这是您可以进行的调整之一(固定 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();
    }
}
}

关于Java - (NetBeans) 使 JTextArea 从 JFrame 后面滑出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23460730/

相关文章:

java - 在 Java 中使用自己的随机数进行 TLS 握手

java - 在 java 中创建带有列标题的自定义表模型

java - HttpResponse 在 Android 和 Java 中不同

java - JLabel.setIcon() 无法按预期工作

java - 如何创建 JComboBox 循环,以便同一个组合框出现多次?

java - 使用放心的 Java 客户端获取 oauth2 token

javascript - 我正在尝试将使用过的 UID 添加到实时数据库中?

user-interface - 是否可以使用 Google Apps 脚本来装饰 Google 日历或 GMail UI?

java - 是否可以在Java中提取样条函数的公式?

javafx制作按钮网格