- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要为一些选定的菜单项及其相关菜单制作动画。到目前为止,我得到的解决方案适用于菜单项,但不适用于它们的父菜单。 (解决方案来源:Is it possible to make some items in the menu to fade in with 500 ms onset delay in Java?)。为了对 JMenus 产生同样的效果,我尝试做与 JMenuItems 动画解决方案中相同的事情(覆盖 addNotify() 和 removeNotify() 检查 FadeMenu
类)。
我的代码如下(你可以运行这段代码):
动画引擎.java
package aphemeralmenudemo;
import java.awt.AlphaComposite;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;
public class FadeMenuDemo {
private AnimationEngine engine;
public static void main(String[] args) {
new FadeMenuDemo();
}
public FadeMenuDemo() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
engine = new AnimationEngine();
JMenuBar mb = new JMenuBar();
JMenu Level1 = new JMenu("Level 1");
Level1.add("111");
Level1.add("222");
JMenu Level2 = new FadeMenu("Flip");
Level1.add(Level2);
Level2.add(new FadeMenuItem("Fade 1"));
Level2.add(new FadeMenuItem("Fade 2"));
Level2.add("Static 1");
Level2.add("Static 2");
mb.add(Level1);
JFrame frame = new JFrame("Testing");
frame.setJMenuBar(mb);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
测试面板.java
public class TestPane extends JPanel {
public TestPane() {
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
}
淡化菜单项.java
public class FadeMenuItem extends JMenuItem {
public FadeMenuItem(String text) {
super(text);
engine.addTimingListener(new TimingListener() {
@Override
public void timingEvent() {
repaint();
}
});
}
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g.create();
g2d.setComposite(AlphaComposite.SrcOver.derive(engine.getAlpha()));
super.paintComponent(g2d);
g2d.dispose();
}
@Override
public void removeNotify() {
Container parent = getParent();
if (parent instanceof JPopupMenu) {
JPopupMenu menu = (JPopupMenu) parent;
engine.stop();
}
super.removeNotify();
}
@Override
public void addNotify() {
super.addNotify();
Container parent = getParent();
if (parent instanceof JPopupMenu) {
JPopupMenu menu = (JPopupMenu) parent;
engine.restart();
}
}
}
淡化菜单.java
public class FadeMenu extends JMenu{
public FadeMenu(String text) {
super(text);
engine.addTimingListener(new TimingListener() {
@Override
public void timingEvent() {
repaint();
}
});
}
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g.create();
g2d.setComposite(AlphaComposite.SrcOver.derive(engine.getAlpha()));
super.paintComponent(g2d);
g2d.dispose();
}
@Override
public void removeNotify() {
Container parent = getParent();
if (parent instanceof JPopupMenu) {
JPopupMenu menu = (JPopupMenu) parent;
engine.stop();
}
super.removeNotify();
}
@Override
public void addNotify() {
super.addNotify();
Container parent = getParent();
if (parent instanceof JPopupMenu) {
JPopupMenu menu = (JPopupMenu) parent;
engine.restart();
}
}
}
定时监听器.java
public interface TimingListener {
public void timingEvent();
}
动画引擎.java
public class AnimationEngine {
private Timer fade;
private float alpha;
private long startTime;
private long duration = 1000;
private List<TimingListener> listeners;
public AnimationEngine() {
listeners = new ArrayList<>(5);
fade = new Timer(40, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
long elapsed = System.currentTimeMillis() - startTime;
if (elapsed >= duration) {
((Timer) e.getSource()).stop();
alpha = 1f;
} else {
alpha = (float) elapsed / (float) duration;
}
fireTimingEvent();
}
});
fade.setRepeats(true);
fade.setCoalesce(true);
fade.setInitialDelay(500);
}
public void addTimingListener(TimingListener listener) {
listeners.add(listener);
}
public void removeTimingListener(TimingListener listener) {
listeners.add(listener);
}
protected void fireTimingEvent() {
for (TimingListener listener : listeners) {
listener.timingEvent();
}
}
public void restart() {
fade.stop();
alpha = 0;
fireTimingEvent();
startTime = System.currentTimeMillis();
fade.start();
}
public float getAlpha() {
return alpha;
}
public void stop() {
fade.stop();
}
}
覆盖的方法:
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g.create();
g2d.setComposite(AlphaComposite.SrcOver.derive(engine.getAlpha()));
super.paintComponent(g2d);
g2d.dispose();
}
@Override
public void removeNotify() {
Container parent = getParent();
if (parent instanceof JPopupMenu) {
JPopupMenu menu = (JPopupMenu) parent;
engine.stop();
}
super.removeNotify();
}
@Override
public void addNotify() {
super.addNotify();
Container parent = getParent();
if (parent instanceof JPopupMenu) {
JPopupMenu menu = (JPopupMenu) parent;
engine.restart();
}
}
起初我看起来很好。菜单文本出现在动画中,但是当该动画菜单下的子项选择菜单文本时再次动画。这就是问题所在,我不想在选择子菜单时为菜单文本设置动画。在这方面我真的需要帮助。提前致谢。
最佳答案
This is the problem, I don't want to animate the menu text upon selecting it's submenu.
仅当菜单未被选中时调用repaint
。
示例代码:
public FadeMenu(String text) {
super(text);
engine.addTimingListener(new TimingListener() {
@Override
public void timingEvent() {
// This condition is added here to stop animation when selected
if (!isSelected()) {
repaint();
}
}
});
}
关于Java Swing JMenu 文本动画无法按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24790864/
我正在尝试创建自定义弹出菜单。 硬性要求如下: 1) 语音气泡形状 2)透明度 3) 菜单一直打开,直到通过关闭按钮关闭为止 我已经成功实现了上述所有三个目标,但是当我尝试添加普通的子菜单时,它就是行
下面的代码创建了一个简单的 GUI,中间有一个按钮,单击该按钮后,应更新 JMenuBar 组件的字体。为此,setMyFont 方法会在 JButton 上的 ActionListener 中触发。
我对 JMenu 的 arrowIcon 有问题:当我将鼠标悬停在它上面时,它会丢失我为其设置的颜色。 这是最小的例子 public class DemoLookAndFeel extends JFr
我试图将 2 个 JRadioButtonMenuItem 作为子菜单项添加到 JMenuItem,但子菜单项未正确显示。 这是我到目前为止尝试过的代码 private void setupEdit
在我的应用程序中,当我按 JMenuBar 中的“编辑”时,我会收到 Exception in thread "AWT-EventQueue-0" java.lang.NullPointerExcep
我的 JFrame 中有一个 JMenu 和 JPanel 设置代码: public Gui(String title) { super(title); createGUICompon
我在使用 JMenu 弹出窗口时遇到问题。它只是有时有效。有时我根本看不到 java 弹出窗口。有时我的文件和编辑选项完全丢失。这就是我的代码的样子。 import javax.swing.*; pu
我有一个带有 JMenu 的 JFrame。当我在某些情况下添加包含图像的 JPanel 时,程序首次启动时菜单会重复。调整大小时重复的菜单消失。任何建议都非常感激。谢谢。代码如下: public c
我想使用 Jmenu 作为按钮来更改框架中显示的内容,但是当选择菜单时,选择不会释放。下面是 Jmenu 实例的代码,它更改了两个字段和标签的位置。 mnAddUser.addMenuListener
我们获得了 Jmjrst 开源项目,应该对其进行一些配置和工作。现在我们从来没有任何 JMenu、JMenuItem 和 Listener 的东西,所以这对我来说非常困惑。 我已经实现了新的 Menu
这是一个非常奇怪的错误,也是一个非常大的程序,但我将发布它们相互交互的代码。 所以我有一个扫雷游戏,其中实现了“作弊”功能,它会显示棋盘上的所有地雷。 这是调用它的方法: public void sh
有人知道如何控制JMenu子菜单上出现的小箭头的显示吗? 我可以更改吗?我可以禁用它吗?我可以移动它吗? 此外,我注意到只有当顶级 JMenu 是其他 JMenu 的子菜单时,此箭头才不会出现在顶级
我正在开发一个 java 项目,其中使用了一些 swing 组件。我的 JMenuBar 有问题。我有一个扩展 JMenuBar 的类。它是功能性的,它作为一对 JMenu 对象和每个对象中的一对 J
我正在尝试在单击时动态构建一个 JMenu(我只得到一个空菜单),下面是我的代码。 final JMenu JMWindows = new JMenu("Opened Windows");
我一直在研究一个 html 文本编辑程序,我想知道是否有人可以帮助我解决这个小问题。我有两个 jmenus,但其中一个行为不端。我有两个问题。 1 菜单中的菜单项虽然不是子菜单,但有一个子菜单箭头 是
我对这段代码的问题是,当我运行它时,JMenuItem 没有出现。我很困惑!任何人都可以帮忙吗? import javax.swing.*; import java.awt.*; import jav
我正在使用 jmenu.js 并将子菜单元素设置为具有透明度。问题是具有透明度的子元素显示父元素(即主菜单栏)的背景。我想要的是在显示到页面背景的子菜单上具有透明度。 CSS 是: .jMenu {
我刚刚开始使用 JMenu。单击按钮时,我希望菜单显示子菜单类别,例如保管箱。 所以我的问题是,“为什么子菜单不可见?” 请查看下面的相关代码。 // Frame title fram
回应最近的slashdot post ,我决定添加一个选项,让菜单出现在左侧,这样在打开时它就不会遮挡整个应用程序。只是为了用户方便,有没有办法强制 jdesktop 上的 jmenu 位于左侧或右侧
我需要创建 JMenu ,它应该具有: 子菜单项 复选框。 像这样: 有没有简单的方法来创建它,或者我必须 首先学习核心合并JCheckBoxMenuItem和JMenu类? PS:是的,我知道我可以
我是一名优秀的程序员,十分优秀!