Предотвращение фокуса при построении визуальных компонентов в Java - PullRequest
1 голос
/ 12 мая 2011

Я создал приложение, которое требует перезагрузки изображения несколько раз в течение выполнения программы. Возможно, это неуклюже, но моя реализация заключалась в расширении класса Component в подклассе и перезагрузке изображения через аргумент fileName в его конструктор. Код включен ниже:

import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.WindowConstants;

public class Grapher {

    private static JFrame frame = new JFrame("Test Frame");
    private static Graph graph = null;
    private static JScrollPane jsp = null;
public Grapher(){
    frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
}

public void display(String fileName) {
    if(jsp != null)
        frame.getContentPane().remove(jsp);
    graph = new Graph(fileName);
    jsp = new JScrollPane(graph);
    frame.getContentPane().add(jsp);
    frame.setSize(graph.getPreferredSize());
    frame.setVisible(true);
}

private class Graph extends Component{
    BufferedImage img;
    @Override
    public void paint(Graphics g) {
        g.drawImage(img, 0, 0, null);
    }
    public Graph(String fileName) {
        setFocusable(false);
        try {
            img = ImageIO.read(new File(fileName));
        } catch (IOException e) {System.err.println("Error reading " + fileName);e.printStackTrace();}
    }
}
}

В любом случае, моя проблема в том, что всякий раз, когда я вызываю команду display, это окно крадет фокус всего java, включая затмение, которое может быть действительно раздражающим. Я даже попытался добавить setFocusable(false) в конструктор, но все же удается украсть фокус. Как мне сказать, чтобы он был фокусируемым, но не фокусировался автоматически при построении?

1 Ответ

2 голосов
/ 12 мая 2011

Возможно, это неуклюже, но моя реализация заключалась в том, чтобы расширить класс Component в подклассе и перезагрузить изображение с помощью аргумента fileName в его конструктор

Нет необходимости в пользовательском компоненте,Просто используйте JLabel и метод setIcon (...), когда вы хотите изменить изображение.

Даже если вам нужен пользовательский компонент, вы не будете расширять Component, вы будете расширять JComponent или JPanel в Swingприложение.

Установка видимой рамки автоматически дает фокусировку кадра.Вы можете попробовать использовать:

frame.setWindowFocusableState( false );

Тогда вам может понадобиться добавить WindowListener к фрейму.Когда окно открыто, вы можете сбросить фокусируемое состояние на true.

...