在我的代码中,我有:
一个扩展JComponent的抽象类,其中包含一些JTextFields。JTextFields是不可编辑的。JComponent类实现了MouseListener:-当mouseEnted事件触发时,将向其添加一个边框。-当mouseExted事件触发时,边框被删除。-当mouseClick事件触发时,该组件的所有字段都设置为可编辑。
这应该是这样的:
问题是:当鼠标在任何JTextField上移动时,mouseExited会触发。你将如何解决这个问题?
下面是一个简单的类,它将向您展示一个包含jTextField的窗口,该窗口包含在一个面板中,以与上面描述的非常相似的方式实现MouseListener。不要考虑它是如何编写的,它只是为了目的!
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run(){
int i=0;
//mainWindow
JFrame mainWindow = new JFrame("MyFrame");
mainWindow.setLayout(new BorderLayout());
mainWindow.setMinimumSize(new Dimension(200,200));
JPanel viewPort = new JPanel();
final JTextField text = new JTextField("SOME_RANDOM_TEXT");
text.setEditable(false);
final JPanel panel = new JPanel();
panel.add(text);
panel.setBackground(Color.green);
panel.addMouseListener(new MouseListener() {
@Override
public void mouseReleased(MouseEvent e) {
//NOTHING
}
@Override
public void mousePressed(MouseEvent e) {
//NOTHING
}
@Override
public void mouseExited(MouseEvent e) {
panel.setBorder(BorderFactory.createEmptyBorder());
}
@Override
public void mouseEntered(MouseEvent e) {
panel.setBorder(BorderFactory.createLineBorder(Color.BLUE));
}
@Override
public void mouseClicked(MouseEvent e) {
((JTextField)panel.getComponent(0)).setEditable(true);
panel.getComponent(0).requestFocus();
}
});
viewPort.add(panel);
mainWindow.add(viewPort,BorderLayout.CENTER);
mainWindow.setVisible(true);
}
});
}
问题是您将MouseListener
设置为JPanel
,这没有多大意义(对于所需描述的行为)。
只需将MouseListener
更改为JTextField
:
text.addMouseListener(new MouseListener() {
这对我来说很好。
更新:
你错过了一些东西,伴侣:)谢谢你的快速回答,但是,我的JPanel
可以包含更多,然后一个文本字段,它可以包含例如,10个!
这个例子可以作为例子,但是在现实生活中,你不会创建一个内心的听众,你会创建一个类。
class MyMouseListener implements MouseListener {
// define methods and behaviour
}
然后您将它添加到您的可选区域,如:
MyMouseListener listener = new MyMouseListener()
panel1.addMouseListener(listener);
panel2.addMouseListener(listener);
panel3.addMouseListener(listener);
提示:记住MouseEvent
扩展自ComponentEvent
,它有一个很棒的方法getComponent()
返回事件的发起人。
您可以检查事件的鼠标点,以确定该点是否仍在面板的边界内:
panel.addMouseListener(new MouseAdapter()
{
@Override
public void mouseExited(MouseEvent e)
{
Rectangle r = e.getComponent().getBounds();
Point p = e.getPoint();
if (p.x < 0 || p.x >= r.width
|| p.y < 0 || p.y >= r.height)
panel.setBorder( null );
}
@Override
public void mouseEntered(MouseEvent e)
{
panel.setBorder(BorderFactory.createLineBorder(Color.BLUE));
}
});
扩展MouseAdapter更容易,那么您只需要覆盖要自定义的方法。
在Java,有没有一种方法可以避免在调用的每个级别上嵌套null检查,以确保沿途没有阻止下一次调用的null。有没有一个优雅的方法来做这件事? 例如: Objone.ObjTwo.ObjTree.ObjFour.ObjF
问题内容: 避免嵌套查询有多重要。 我一直学会避免像瘟疫一样躲避它们。但是对我来说,它们是最自然的事情。在设计查询时,我首先写的是嵌套查询。然后,我将其转换为联接,有时需要花费很多时间才能正确。而且很少会带来很大的性能提升(有时确实会提高) 他们真的那么糟糕吗?有没有一种方法可以使用没有临时表和文件排序的嵌套查询 问题答案: 这确实取决于我遇到的情况,我可以通过使用子查询来改进一些查询。 我知道的
问题内容: 我想用SQL编写脚本,该脚本会将这2个表(A,B)复制到其他2个表(C,D),并具有与A,B相同的结构。 重要提示 : 表C,d是 不是 必要的空 多个进程可以同时调用脚本 表A具有表B的外键(fk_a_b) 假设将表B复制到D之后,这就是我得到的 现在,当我将表A复制到CI时,需要知道,ID = 21现在映射到ID = 51,ID = 32映射到ID = 52。最后,表C将为: 由于
问题内容: 我已经使用Java已有一段时间了,但是我对循环的教育还是有点不足。我知道如何创建存在于Java中的每个循环以及如何打破循环。但是,最近我想到了: 假设我有两个嵌套循环。我可以只使用一条语句来打破两个循环吗? 这是我到目前为止所拥有的。 有没有办法做到这一点? 问题答案: 在Java中,您可以使用标签来指定要中断/继续的循环:
我有一组按顺序完成的操作,但如果中间序列返回“null”,我希望尽早中止该操作(跳过后续步骤)。 我想出了一个这样的函数,它给出了一个输入参数,对Redis执行几个操作,如果存在的话,它将返回一个乘积。由于中间请求中有一个可能返回空值,所以整个操作可能会“失败”,因此我想缩短后续的不必要步骤。
我需要从mongo(v3.2.10)集合(使用Pymongo 3.3.0)中获取大量(例如1亿)文档并迭代它们。迭代需要几天时间,我经常遇到由于游标超时而导致的异常。 在我的例子中,我需要在迭代时睡上不可预知的时间。例如,我可能需要:-获取10个文档-睡眠1秒-获取1000个文档-睡眠4小时-获取1个文档等 我知道我可以: 完全禁用超时,但如果可能的话,我希望避免这种情况,因为如果我的代码完全停止