【发布时间】:2017-11-05 10:00:15
【问题描述】:
我试图在计时器结束后在反应按钮上出现一个边框。除非我将鼠标从触发按钮上移开然后再移回它,否则我似乎不会发生这种情况。有没有办法在不移动鼠标的情况下激活鼠标侦听器,然后在计时器之后再回到触发按钮上?请不要说:计时器结束时设置边框,因为那不是我想要的。 另外,请随时指出我的代码中的其他错误或坏习惯。我是 Java 编码新手。
import java.util.Timer;
import java.util.TimerTask;
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JButton;
import javax.swing.border.Border;
import javax.swing.border.LineBorder;
import java.awt.event.MouseListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class ButtonTester{
public static final Border PANEL_BORDER = new LineBorder(Color.red, 12);
public static JPanel panel;
public static JButton trigger;
public static JButton react;
public static JLabel msg;
public static void main(String [] args){
JFrame frame = new JFrame();
frame.setSize(new Dimension(500,200));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panel = new JPanel();
panel.setBorder(PANEL_BORDER);
frame.getContentPane().add(panel);
JButton trigger = new JButton("Trigger");
JButton react = new JButton("React");
JLabel msg = new JLabel();
react.setPreferredSize(new Dimension(200, 60));
trigger.setPreferredSize(new Dimension(200, 60));
panel.add(trigger);
panel.add(react);
panel.add(msg);
panel.setVisible(true);
frame.setVisible(true);
MouseListener mL = new MouseAdapter(){
@Override public void mouseEntered(MouseEvent evt) {
react.setBorder(PANEL_BORDER);
}
@Override public void mouseExited(MouseEvent evt) {
react.setBorder(javax.swing.BorderFactory.createEmptyBorder());
}
};
countDown(msg, trigger, mL);
}
public static void countDown(JLabel msg, JButton trigger, MouseListener mL){
Timer timer = new Timer();
TimerTask task = new TimerTask(){
short seconds = 4;
public void run(){
if(seconds == 0){
timer.cancel();
trigger.addMouseListener(mL);
return;
}
seconds--;
msg.setText("Attempting to add listener in : "+seconds);
}
};
timer.scheduleAtFixedRate(task, 1000, 1000);
}
}
【问题讨论】:
-
“另外,请随时指出我的代码中的其他错误或坏习惯。我是 Java 编码新手” - 不要使用
java.util.Timer当您想与 UI 交互时,请使用SwingWorker或javax.swing.Timer。我也避免使用setPreferredSize,它没有考虑getPreferredSize用来计算其价值的许多条件。相反,考虑在JButton上使用setMargin或不同布局管理器中可用的不同布局约束 -
“请不要说:在计时器结束时设置边框,因为这不是我想要的” - 好的,但这听起来和你的完全一样重新询问 - “我正试图让反应按钮在计时器结束后出现带边框” ...所以我很困惑
-
所以,你“似乎”要说的是,如果在你设置了
MouseAdapter之后,鼠标悬停在trigger按钮上,那么你希望听众是触发?相反,您可以先应用侦听器,然后可以有两个标志,一个确定鼠标是否进入或退出按钮,一个确定计时器是否已完成,这样,您可以结合二。可能需要额外的方法或观察者将这两种状态结合在一起,但基本思想应该可行
标签: java swing mouseevent border mouselistener