java - 带 Trident 动画的 JScrollPane 出现 bug?

标签 java swing animation

我正在使用Trident Java Animation Library ,因为我想要 JScrollPane 具有伪 Accordion 效果。

这是我的 SSCCE:http://pastebin.com/5xfBLmV5
您需要下载 Trident JAR .

问题

  • 我的 JScrollPane 有一个 JTextArea 的视口(viewport) View 。
  • 我希望 JFrame 以最小化的 TextView 打开。
  • JButton 单击时会向前或向后播放动画。
  • 我使用 BorderLayout.SOUTH` 在 JFrame 底部添加了一个标签

JScrollPane 无法正确计算 JTextArea 的实际高度,因此文本被截断并且该区域不可滚动.

这就是正在发生的事情:

之前

before expansion

点击“显示详细信息...”后

after expansion

最佳答案

基本上,使用正确的布局管理器并确保父容器无效应该会给您带来您正在寻找的结果。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.UUID;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import org.pushingpixels.trident.Timeline;
import org.pushingpixels.trident.ease.Spline;

public class ButtonFg extends JFrame {

    private JScrollPane jsp;

    public ButtonFg() {
        JButton button = new JButton("sample");
        button.setForeground(Color.blue);

        JPanel panel = new JPanel(new GridBagLayout());
        this.add(panel);

        String s = UUID.randomUUID().toString();
        for (int i = 0; i < 20; i++) {
            s += "\n" + UUID.randomUUID().toString();

        }
        final JTextArea textArea = new JTextArea(s);
        textArea.setLineWrap(true);
        jsp = new JScrollPane(textArea);

        final JButton label = new JButton("Show details...");
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.weightx = 1;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.gridwidth = GridBagConstraints.REMAINDER;
        panel.add(label, gbc);

        gbc.weighty = 1;
        gbc.anchor = GridBagConstraints.NORTH;
        panel.add(jsp, gbc);

        gbc.weighty = 0;
        gbc.anchor = GridBagConstraints.SOUTH;
        panel.add(new JLabel("End of panel"), gbc);

        final Timeline rolloverTimeline = new Timeline(this);
        rolloverTimeline.addPropertyToInterpolate("animate", new Dimension(400, 15), new Dimension(400, 200));
        rolloverTimeline.setEase(new Spline(0.8f));

        rolloverTimeline.setDuration(1000);
        rolloverTimeline.setInitialDelay(50);

        label.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (label.getText().toLowerCase().contains("show")) {
                    rolloverTimeline.play();
                    label.setText("Hide details...");
                } else {
                    rolloverTimeline.playReverse();
                    label.setText("Show details...");
                }
            }

        });

        rolloverTimeline.playReverse();

        this.setSize(400, 500);
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public void setAnimate(Dimension size) {
        jsp.setPreferredSize(size);
        jsp.getParent().revalidate();
        repaint();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new ButtonFg().setVisible(true);
            }

        });
    }

}

关于java - 带 Trident 动画的 JScrollPane 出现 bug?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15431778/

相关文章:

ios - 如何按需为角色制作动画 SceneKit Xcode Swift

javascript - 在 javascript 函数中使用 jquery animate

java - Spring Security CSRF 训练模式

java - java中子类的泛型

java - 如何在 Firebase 中收听多个 child ?

java - 在另一个 JFrame 上显示 JPanel

objective-c - 对 uiview 的 socket 集合应用许多约束并为其设置动画

java - 为什么图像质量下降?

java - 无法显示 JTable

java - 如何在 JFrame 中将 Jpanel 居中?