JScrollPane 覆盖 setHvalue

JScrollPane override setHvalue

我想修改我的 JScrollPane 以便当水平位置改变时,位置 hvalue 被发送到另一个 class。我不希望另一个 class 每次都必须检索此值,因为这会在必须尽快完成的任务中反复发生。 我还没有找到关于默认使用的确切语法的任何文档,但我猜我想要的看起来像这样:

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);
}
}

这将包括一个由 class:

管理的面板对象
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);
}
}

尝试编译此代码会产生错误消息:

据我了解,这基本上是他们说我不能修改 setHvalue() 的方式。有什么方法可以解决这个问题,或者有一种替代方法可以在更改时发送 hvalue,而不是每次需要时都检索它?

when the horizontal position is changed, the position hvalue is sent to another class.

这是通过向水平滚动条添加 AdjustmentListener 来完成的。

但是,如果您不在信息每次更改时都使用它,那么这是不需要的额外开销。

我不推荐使用这种方法。

I don't want the other class to have to retrieve this value every time as this will happen repeatedly during a task which must be finished as quickly as possible.

调用滚动条的 getValue() 方法不会给您的任务增加任何可衡量的开销。

您的任务只需要引用滚动窗格,这样您就可以访问滚动条并获取当前值。

其实我已经找到答案了,很抱歉。原来getHvalue这个方法只是针对awt ScrollPane的,并没有被swing JScrollPane继承。我将在这里 post 一个工作版本,以防有一天其他人感兴趣(尽管我猜 camickr 的方法更好)。 JScrollPane class 是:

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);
}
}

面板 class 是:

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);
}
}