- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个不寻常的问题,每当 mouseListener/Adapter 检测到事件时,componentListener/Adapter 就会被禁用。在下面的代码中,componentMoved()
方法覆盖完美运行,直到在 MouseAdapter()
中触发了 mouseClicked()
方法覆盖。有什么解决办法吗?
public AlertScroller(String msg,Color col) {
addComponentListener(new ComponentAdapter() {
@Override
public void componentMoved(ComponentEvent e) {
setShape(new Rectangle2D.Double(0, 0, getWidth(), newHeight));
if(!isVisible())
setVisible(true);
}
});
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent click) {
if(SwingUtilities.isLeftMouseButton(click)) {
autoClear = false;
scrollOff();
}
}
});
setAlwaysOnTop(true);
JPanel panel = new JPanel();
panel.setBorder(compound);
panel.setBackground(col);
JLabel imgLbl = new JLabel(msg);
imgLbl.setFont(new Font("Arial",Font.BOLD,30));
panel.add(imgLbl);
setContentPane(panel);
pack();
}
此方法所在的类扩展JWindow
。
编辑:添加了 scrollOff()
方法的代码。
public void scrollOff() {
Insets scnMax = Toolkit.getDefaultToolkit().getScreenInsets(getGraphicsConfiguration());
int taskBar = scnMax.bottom;
int x = screenSize.width - getWidth();
int yEnd = screenSize.height - taskBar;
int yStart = this.getBounds().y;
setLocation(x,yStart);
int current = yStart;
newHeight = this.getBounds().height;
while(current < yEnd) {
current+=2;
newHeight = yEnd - current;
setLocation(x,current);
try {
Thread.sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
dispose();
Main.alertControl.setAlertActive(false);
}
这基本上与 scrollOn() 方法完全相反,只要通过 Listener
以外的任何方式触发它,它就可以正常工作。
编辑 2: 根据 MadProgrammer 的建议修复了下面的代码
public void scrollOff() {
x = screenSize.width - getWidth();
yEnd = screenSize.height - taskBar;
yStart = this.getBounds().y;
setLocation(x,yStart);
current = yStart;
newHeight = this.getBounds().height;
ActionListener action = new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
if(current < yEnd) {
current+=2;
newHeight = yEnd - current;
setLocation(x,current);
} else {
timer.stop();
}
}
};
timer = new Timer(30, action);
timer.setInitialDelay(0);
timer.start();
Main.alertControl.setAlertActive(false);
}
我还使用 else if
更新了 AlertScroller()
构造方法,以便在完成后正确隐藏窗口:
addComponentListener(new ComponentAdapter() {
@Override
public void componentMoved(ComponentEvent e) {
setShape(new Rectangle2D.Double(0, 0, getWidth(), newHeight));
if(!isVisible())
setVisible(true);
else if(getBounds().y == screenSize.height - taskBar)
setVisible(false);
}
});
将 setVisible(false)
放在其他任何地方都会导致窗口再次可见。
最佳答案
while 循环
是危险的,Thread.sleep
是危险的,而 dispose 是非常可怕的......
您违反了 Swing 的单线程规则并阻塞了事件调度线程。
参见 Concurrency in Swing了解更多详情
dispose
可能正在处理与窗口关联的 native 对等点,导致问题无休止...
参见 JWindow#dispose
了解更多详情。
假设,您正试图将窗口滑动到屏幕上/关闭屏幕,您应该使用 Swing Timer
,当它被触发时,会更新窗口的位置,直到它到达它的目标点,并且哪一次您只需更改窗口的可见性。这假定您要重用窗口的实例..
参见 How to Use Swing Timers了解更多详情。
关于java - componentListener 被禁用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22238567/
请看下面的代码。 package normal; import java.awt.*; import java.awt.event.*; import javax.swing.*; import ja
有什么方法可以以编程方式触发 ComponentListener 吗?例如,请查看下面的代码快照。 private class DisplayAllRevenue extends Compon
我有一个不寻常的问题,每当 mouseListener/Adapter 检测到事件时,componentListener/Adapter 就会被禁用。在下面的代码中,componentMoved()
我有一个 JPanel,它不应减小到小于最小尺寸,但它没有这样做。我知道我应该使用我已经实现但仍然没有用的 ComponentListener。 有人可以以编程方式解释出了什么问题吗? 这是代码的相关
ComponentListener 出现问题。我用它来检查某个组件的大小是否已调整,如果是,则更新一些内容。 代码看起来像这样,尽管这可能对您没有多大用处: @Override public void
我想在显示 WorldPanel 时获取 (Graphics g)。感谢 stackoverflow,我看到了应该在哪里使用 getGraphics 方法 (ComponentListener.com
为什么这段代码从不打印“Hello2”? public class Test4 { public static void main(String[] args) { JFram
我有一个 Main JPanel,其布局设置为 CardLayout。 Main JPanel 有 4 个卡片:Card1JPanel、Card2JPanel、Card3JPanel、Card4JPa
void NewJDialogcallone(JFrame frame) { location = frame.getLocationOnScreen(); int x = locat
我认为答案是在完成所有初始组件大小调整之后,但请看一下这个 SSCCE: import javax.swing.*; import java.awt.*; import java.awt.event.
我有一个 JSplitPane 的子类,它的目的是允许分隔线从右边缘或下边缘(而不是左边缘或上边缘)固定位置。 为此,我使用 ComponentChangeListener 来捕获组件大小的调整,并重
如果发生 componentShown/componentHidden 事件,我想得到通知。我使用 ComponentListener,但效果不如我需要。我在官方 Swing 教程中找到了这些信息:
我在 JFrame 中添加了一个 ComponentListener ,并在其 componentResized() 方法中保留了一些代码,这使得应用程序执行无限窗口。这是因为我在 component
我用 Google 搜索了一下,找不到答案: 我有一个 JFrame 作为 GUI 并设置了一个 componentListener this.addComponentListener(new CL(
我是一名优秀的程序员,十分优秀!