【问题标题】:screen magnification for the visually impaired using Java使用 Java 为视障人士提供屏幕放大
【发布时间】:2016-06-28 11:28:20
【问题描述】:

有什么方法可以创建一个功能,如果用户有视力障碍,可以切换屏幕放大率。

我在 eclipse 等程序的上下文中询问,视障用户可以在其中打开和关闭放大文本、图标和导航栏的功能。

【问题讨论】:

    标签: java swing jpanel awt zooming


    【解决方案1】:

    我在裁剪图像时将此短代码用作通用放大镜。

    import java.awt.*;
    import java.awt.event.*;
    import java.awt.image.BufferedImage;
    import javax.swing.*;
    
    class ZoomOnMouse {
    
        Robot robot;
        int zoomFactor = 2;
        PointerInfo pi;
        JPanel gui;
        JLabel output;
        Timer t;
    
        public ZoomOnMouse() throws AWTException {
            robot = new Robot();
            gui = new JPanel(new BorderLayout(2, 2));
            output = new JLabel("Point at something to see it zoomed!");
            gui.add(output, BorderLayout.PAGE_END);
            final int size = 256;
            final BufferedImage bi = new BufferedImage(
                    size, size, BufferedImage.TYPE_INT_RGB);
            final JLabel zoomLabel = new JLabel(new ImageIcon(bi));
            gui.add(zoomLabel, BorderLayout.CENTER);
    
            MouseListener factorListener = new MouseAdapter() {
    
                @Override
                public void mouseClicked(MouseEvent e) {
                    if (zoomFactor == 2) {
                        zoomFactor = 4;
                    } else if (zoomFactor == 4) {
                        zoomFactor = 8;
                    } else if (zoomFactor == 8) {
                        zoomFactor = 2;
                    }
                    showInfo();
                }
            };
            zoomLabel.addMouseListener(factorListener);
    
            ActionListener zoomListener = (ActionEvent e) -> {
                pi = MouseInfo.getPointerInfo();
                Point p = pi.getLocation();
                Rectangle r = new Rectangle(
                        p.x - (size / (2 * zoomFactor)),
                        p.y - (size / (2 * zoomFactor)),
                        (size / zoomFactor),
                        (size / zoomFactor));
                BufferedImage temp = robot.createScreenCapture(r);
                Graphics g = bi.getGraphics();
                g.drawImage(temp, 0, 0, size, size, null);
                g.setColor(new Color(255,0,0,128));
                int x = (size/2)-1;
                int y = (size/2)-1;
                g.drawLine(0,y,size,y);
                g.drawLine(x,0,x,size);
                g.dispose();
                zoomLabel.repaint();
                showInfo();
            };
            t = new Timer(40, zoomListener);
            t.start();
        }
    
        public void stop() {
            t.stop();
        }
    
        public Component getGui() {
            return gui;
        }
    
        public void showInfo() {
            pi = MouseInfo.getPointerInfo();
            output.setText("Zoom: " + zoomFactor + "  Point: " + pi.getLocation());
        }
    
        public static void main(String[] args) {
            Runnable r = () -> {
                try {
                    final ZoomOnMouse zm = new ZoomOnMouse();
                    final JFrame f = new JFrame("Mouse Zoom");
                    f.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
                    f.add(zm.getGui());
                    f.setResizable(false);
                    f.pack();
                    f.setLocationByPlatform(true);
                    f.setAlwaysOnTop(true);
                    f.setVisible(true);
    
                    WindowListener closeListener = new WindowAdapter() {
    
                        @Override
                        public void windowClosing(WindowEvent e) {
                            zm.stop();
                            f.dispose();
                        }
                    };
                    f.addWindowListener(closeListener);
                } catch (AWTException e) {
                    e.printStackTrace();
                }
            };
            // Swing GUIs should be created and updated on the EDT
            // http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html
            SwingUtilities.invokeLater(r);
        }
    }
    

    【讨论】:

    • 阅读这段代码,我认为这是否会放大鼠标点击的特定区域,有点像缩放框?
    • 如何将其限制在应用程序而不是整个屏幕上?
    • @user6020197 你知道如何获取顶级容器的边界吗?你知道如何使用条件语句吗?将两者结合起来应该是微不足道的。
    • 我不知道如何获取顶级容器的边界,但我对条件语句很满意
    • 提示:当有人提到 Java 的一部分时 - 搜索文档!例如。任何扩展组件的类中的getBound 都会找到Component.getBounds()(它会比等待我从我正在远离计算机的任何事情中恢复过来要快得多)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-22
    • 1970-01-01
    • 1970-01-01
    • 2016-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多