有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JScrollPane重写setHvalue

我想修改我的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);
}
}

其中将包括一个由类管理的面板对象:

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

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

  • 滚动。JAVA11:错误:方法不重写或实现超类型中的方法

  • @覆盖

  • 滚动。JAVA13:错误:找不到符号

  • hvalue=值

  • 符号:变量hvalue

据我所知,这基本上是他们说我不能修改setHvalue()的方式。有没有办法解决这个问题,或者在hvalue发生更改时发送它,而不是在每次需要时检索它


共 (2) 个答案

  1. # 1 楼答案

    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()方法不会给任务增加任何可测量的开销

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

  2. # 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);
    }
    }
    

    面板类为:

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