JScrollPane переопределяет setHvalue

#java #swing #jscrollpane

#java #swing #jscrollpane

Вопрос:

Я хотел бы изменить свою JScrollPane таким образом, чтобы при изменении горизонтального положения значение position hvalue отправлялось в другой класс. Я не хочу, чтобы другому классу приходилось извлекать это значение каждый раз, поскольку это будет происходить неоднократно во время задачи, которая должна быть завершена как можно быстрее. Я не смог найти никакой документации по точному синтаксису, используемому по умолчанию, но я предполагаю, что то, что я хочу, будет выглядеть примерно так:

 import java.lang.Math.*;
import javax.swing.*;

public class scroll {
public static void main(String[] args) {
    JFrame f = new JFrame();
    f.setDefaultCloseOperation(3);
    panel p = new panel();
    
    JScrollPane sp = new JScrollPane(p,21,31) {
        @Override
        public final void setHvalue(double value) {
            hvalue = value;
            p.sendH((int) Math.round(value));
        }
    };
    
    f.add(sp);
    f.setSize(333,333);
    f.setVisible(true);
}
}
  

который будет включать объект panel, управляемый классом:

 import javax.swing.*;

public class panel extends JPanel {

private static int H;
public panel() {}

public static void sendH(int x) {
    H=x;
    System.out.println(x);
}
}
  

Попытка скомпилировать этот код выдает сообщения об ошибках:

  • scroll.java.11: ошибка: метод не переопределяет и не реализует метод из supertype

  • @Переопределить

  • прокрутка.java.13: ошибка: не удается найти символ

  • hvalue = значение;

  • символ: значение переменной hvalue

что, как я понимаю, в основном является их способом сказать, что я не могу изменить setHvalue() . Есть ли какой-то способ обойти это или альтернативный способ отправки hvalue при его изменении вместо того, чтобы извлекать его каждый раз, когда это необходимо?

Ответ №1:

при изменении положения по горизонтали значение position hvalue отправляется в другой класс.

Это делается путем добавления AdjustmentListener к горизонтальной полосе прокрутки.

Однако это дополнительные накладные расходы, которые не требуются, если вы не используете информацию при каждом ее изменении.

Я не рекомендую использовать этот подход.

Я не хочу, чтобы другому классу приходилось извлекать это значение каждый раз, поскольку это будет происходить неоднократно во время задачи, которая должна быть завершена как можно быстрее.

Вызов getValue() метода полосы прокрутки не добавит каких-либо измеримых накладных расходов к вашей задаче.

Вашей задаче просто нужна ссылка на панель прокрутки, чтобы вы могли получить доступ к полосе прокрутки и получить текущее значение.

Ответ №2:

На самом деле я понял ответ, извините за это. Оказывается, что метод getHvalue предназначен только для awt ScrollPane и не наследуется swing JScrollPane. Я опубликую рабочую версию здесь, на случай, если когда-нибудь кто-то еще заинтересуется (хотя я предполагаю, что подход camickr лучше). Класс JScrollPane является:

 import java.awt.*;
import javax.swing.*;
import javax.accessibility.*;

public class scroll {
public static void main(String[] args) {
    JFrame f = new JFrame();
    f.setDefaultCloseOperation(3);
    panel p = new panel() {
        @Override
        public Dimension getMinimumSize(){
            return new Dimension(getWidth(),getHeight());
        }
        @Override
        public Dimension getPreferredSize(){
            return new Dimension(getWidth(),getHeight());
        }
        @Override
        public Dimension getMaximumSize(){
            return new Dimension(getWidth(),getHeight());
        }
    };
    
    JScrollPane sp = new JScrollPane(p,22,32);
    sp.setHorizontalScrollBar( new JScrollBar(JScrollBar.HORIZONTAL){
        @Override
        public void setValue(int value) {
            BoundedRangeModel m = getModel();
            int oldValue = m.getValue();
            m.setValue(value);

            if (accessibleContext != null) {
                accessibleContext.firePropertyChange(
                AccessibleContext.ACCESSIBLE_VALUE_PROPERTY,
                Integer.valueOf(oldValue),
                Integer.valueOf(m.getValue()));
            }
            
            p.sendH(value);
        }
    });
    
    f.add(sp);
    f.setSize(333,333);
    p.setSize(400,400);
    f.setVisible(true);
}
}
  

и класс panel является:

 import javax.swing.*;

public class panel extends JPanel {

private static int H;
public panel() {}

public static void sendH(int x) {
    H=x;
    System.out.println(x);
}
}
  

Комментарии:

1. (1-) Как объяснялось выше, если вы хотите получать уведомления при изменении положения полосы прокрутки, вы используете AdjustmentListener. Не переопределяйте компоненты, когда решение уже существует в API.