Как полностью отключить взаимодействие с произвольным компонентом в Swing?

Рейтинг: 0Ответов: 1Опубликовано: 26.02.2025

Допустим, у нас есть компонент c. Он представлен объектом, так что мы никак не можем заменить его класс и переопределить методы. Компонент может быть любым.

Задача следующая: нужно сделать так, чтобы ни клавиатурой, ни мышью, ни чем-либо ещё нельзя было бы изменить данные компонента (набрать текст, нажать кнопку, выбрать элемент в JComboBox и т. д.).

Я пытался обернуть компонент в JLayer<>, но, кажется, это работает так себе:

add(new JLayer<JComponent>(c,new LayerUI<>(){
    protected void processMouseEvent(MouseEvent e,JLayer<? extends JComponent>l){e.consume();}
    protected void processKeyEvent(KeyEvent e,JLayer<? extends JComponent>l){e.consume();}
    protected void processMouseMotionEvent(MouseEvent e,JLayer<? extends JComponent>l){e.consume();}
    protected void processComponentEvent(ComponentEvent e,JLayer<? extends JComponent>l){}
    protected void processFocusEvent(FocusEvent e,JLayer<? extends JComponent>l){}
}));

Есть ли у кого-то идея, как это можно сделать?

Ответы

▲ 1

Спустя некоторое время я понял, что можно просто использовать JList, задав ему ListCellRenderer, возвращающий данный компонент:

// Component c - компонент, взаимодействие с которым надо отключить
JList<String> l = new JList<>();
DefaultListModel<String> m = new DefaultListModel<>();
m.add(0, "");
l.setCellRenderer((list, value, index, isSelected, cellHasFocus) -> {
    c.setPreferredSize(l.getSize());
    return c;
});
l.setModel(m);
// l - результат