【问题标题】:Java Applet Text highlights on rolloverJava Applet 文本在翻转时突出显示
【发布时间】:2012-06-17 19:51:05
【问题描述】:

我试图弄清楚如何制作不可编辑的文本(不是 JTextField),当鼠标滑过它时,其背景颜色会发生变化。我尝试使用 JButton 实现 ActionListener 并隐藏元素以使按钮看起来只是文本,但它只允许我在翻转时更改图标并检测何时单击按钮。另一个想法是使用 MouseListener 并声明文本周围矩形的特定坐标,在 mouseMoved 时它可以启动突出显示。但是,对于不同的字符串长度和自动换行等存在问题。什么是最好的对象,以及在鼠标悬停时实现突出显示的文本字段效果的侦听器组合?

【问题讨论】:

    标签: java swing text highlight japplet


    【解决方案1】:

    嗯,也许使用 foucs 监听器,当字段获得 foucs 时选择所有文本?

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class TextField extends JTextField {
    
    
    public TextField(String text) {
        super(text);
    
        addFocusListener(new FocusAdapter() {
    
            @Override
            public void focusGained(FocusEvent fe) {
                 selectAll();
            }
        });
    }
    
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
    
            public void run() {
                JFrame f = new JFrame();
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
                JTextField tf = new JTextField("normal field");
                f.add(tf, BorderLayout.CENTER);
    
                TextField ftf =
                        new TextField("funny text field");
                f.add(ftf, BorderLayout.SOUTH);
    
                f.pack();
                f.setVisible(true);
            }
        });
    }
    }
    

    编辑:

    嗯,实际上找到了一种更好的方法,使用上述方法,您必须单击文本字段才能获得焦点,现在我使用线程来检查鼠标何时悬停在组件坐标上,然后突出显示该字段,我使用布尔值来控制突出显示,因为持续突出显示会引发错误。希望这是你想要的:

    import java.awt.*;
    import javax.swing.*;
    
    public class TextFieldHighlight extends JTextField {
    
        static JTextField ftf;
    
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
    
                public void run() {
                    JFrame f = new JFrame();
                    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
    
                    ftf = new JTextField("Highlight");
                    ftf.setEditable(false);
                    f.add(ftf, BorderLayout.CENTER);
                    f.pack();
                    f.setVisible(true);
                    Thread thread = new Thread(new Runnable() {
    
                        boolean focused = false;
    
                        @Override
                        public void run() {
                            while (true) {
                                if (mouseIsOverDisplayPanel()) {
                                    if (ftf.hasFocus() && focused == false) {
                                        ftf.selectAll();
                                        focused = true;
                                    } else if (!ftf.hasFocus()) {
                                        focused = false;
                                    }
                                }
                            }
                        }
                    });
                    thread.start();
                }
            });
    
        }
    
        private static boolean mouseIsOverDisplayPanel() {
    
            if (MouseInfo.getPointerInfo().getLocation().x >= ftf.getLocationOnScreen().x
                    && MouseInfo.getPointerInfo().getLocation().x <= ftf.getLocationOnScreen().x + ftf.getWidth()
                    && MouseInfo.getPointerInfo().getLocation().y >= ftf.getLocationOnScreen().y
                    && MouseInfo.getPointerInfo().getLocation().y <= ftf.getLocationOnScreen().y + ftf.getHeight()) {
    
                return true;
    
            } else {
    
                return false;
    
            }
        }
    }
    

    【讨论】:

    • 我试试看告诉你
    • 谢谢!我认为这第二个例子可以变成我想要的。我只需要尝试使它更平滑并使其OO。但仍然有点要求我将文本字段的直角坐标传递给它。
    • 嗯,我敢肯定,不过你可以向 mouseIsOverDisplayPanel() 添加一些参数,这将接受矩形坐标,而不是在 mouseIsOverDisplayPanel() 方法中计算它们?
    • 是的,但随后它成为使用鼠标侦听器将鼠标悬停在矩形上的等效解决方案:realapplets.com/tutorial/MouseClickExample.html 尽管我确实喜欢您对使用 selectAll 进行文本突出显示而不是像在其他对象中那样更改背景的想法
    • 不是真的,鼠标监听器会等待点击或其他东西来激活,因为这会检查鼠标的坐标,直到它们进入文本字段边界?谢谢:)
    猜你喜欢
    • 1970-01-01
    • 2011-09-25
    • 2014-12-24
    • 2021-06-02
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多