Java 如何在滚动条中获取滚动条的当前位置? 概述:

Java 如何在滚动条中获取滚动条的当前位置? 概述:,java,swing,jscrollbar,Java,Swing,Jscrollbar,考虑下图: 有一个垂直滚动条和一个水平滚动条。单击“确定”后,框架将消失 在完成其他一些工作之后,我想让用户保持现在的位置,这可能是在不同的图像中,具有相同的宽度和高度。所以,我想跟踪滚动条中的条 问题: 是否有任何内置函数来获取百分比或某些东西,以get和set条位 如果是,它们是什么 如果没有,如何处理 代码: java类,它实际上打开了框架 // imports and package description were here public class MultiplePro

考虑下图:

有一个垂直滚动条和一个水平滚动条。单击“确定”后,框架将消失

在完成其他一些工作之后,我想让用户保持现在的位置,这可能是在不同的图像中,具有相同的宽度和高度。所以,我想跟踪滚动条中的条

问题:
  • 是否有任何内置函数来获取百分比或某些东西,以
    get
    set
    条位

    • 如果是,它们是什么
    • 如果没有,如何处理
代码: java类,它实际上打开了框架

// imports and package description were here

public class MultipleProcess extends javax.swing.JDialog {
    SinglePaperEvaluation upperClass;
    BatchPaperEvaluation upperClass2;
    File imageFilePath;
    BufferedImage image;

    public MultipleProcess(boolean modal,File imageFile,SinglePaperEvaluation upper, BatchPaperEvaluation upper2) {
        super(upper==null?upper2:upper,"Co-ordinate Detector", modal);
        initComponents();
        upperClass = upper;
        upperClass2 = upper2;
        imageFilePath = imageFile;

        //adjust screen and windows listener were here

        loadImage();//custom function, it loads image in the jScrollPaneImageScreen

        if(upperClass2!=null){
            upperClass2.setVisible(false);

            //scrollbars states loading part
            jScrollPaneImageScreen.getVerticalScrollBar().setValue(upperClass2.verticalBar);
            jScrollPaneImageScreen.getHorizontalScrollBar().setValue(upperClass2.horizontalBar);
//            if(upperClass2.react!=null)jScrollPaneImageScreen.scrollRectToVisible(upperClass2.react);
        }

        setVisible(true);
    }

    // you can skip this function but have a look if you eager to see how am I loaded image in the pane
     private void loadImage() {
        try {
            image = ImageIO.read(imageFilePath);
            ImageIcon ii = new ImageIcon(imageFilePath.toString());
            JLabel jLabel = new JLabel(ii);
            jLabel.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {

                    int x = e.getX();
                    int y = e.getY();

                    jTextFieldX.setText(String.format("%d",x));
                    jTextFieldY.setText(String.format("%d",y));

                }
            });
            jScrollPaneImageScreen.setViewportView(jLabel);
        } catch (IOException ex) {
            Logger.getLogger(SkeletonPreparing.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

   //init Component function was here

    private void jButtonOKActionPerformed(java.awt.event.ActionEvent evt) {                                          

        if(upperClass2!=null){
            //other irrelevant processing deleted 

            //scrollbars states storing part
            upperClass2.verticalBar = jScrollPaneImageScreen.getVerticalScrollBar().getValue();
            upperClass2.horizontalBar = jScrollPaneImageScreen.getHorizontalScrollBar().getValue();
//            upperClass2.react = jScrollPaneImageScreen.getViewport().getViewRect();
            System.out.println("Stored: "+upperClass2.verticalBar+","+upperClass2.horizontalBar);
            upperClass2.setVisible(true);
        }
        dispose();
    }                                         
    //variable initializations were here
}
BatchPaperEvaluation.java类,我从中创建了上述类的实例:

private void jButtonSubmitActionPerformed(java.awt.event.ActionEvent evt) {                                              
    // TODO add your handling code here:
    File[] filesToBeProcessed = new File(jTextFieldOMRFolderPath.getText()).listFiles(filter);
    for (File inputFile : filesToBeProcessed) {
        MultipleProcess dialog = new MultipleProcess(true, inputFile, null, this);
        //other processing
    }

    //further processing
} 
注:
  • 我已选中了
    int getVerticalScrollBarPolicy()
    ,它不适用于我的工作
如果使用,则可以在关闭窗格时保存该值

然后,重新加载窗格时,只需使用

您也可以对水平滚动条执行相同的操作


我看了你在评论中的MCVE,我强烈怀疑问题出在你给我的代码中,可能是在调用
新多进程的类中

尝试
JScrollPane.getViewport().getViewRect()
以获得可见矩形。您可以通过执行
JScrollPane.getViewport().scrollRectToVisible()

JScrollBar返回int值、API中的更多信息和/或包含JViewportI中的可见矩形来恢复此功能。我已经检查了,它可能为您提供了一些解决方案。也就是说@Trobbins噢,我忘了添加它了,我之前已经检查过了,但是这个函数的目的不同,关于策略。@mKorbel你能有一些链接吗?我找了又没找到,这就是我问的原因。不幸的是,它对我不起作用。这可能是我的错,但我仍在努力。@manetsus你能回答你的问题来显示你正在使用的代码吗?看:制作mvce需要时间,但是你可以看看我的课。查看构造函数和
私有void jButtonOKActionPerformed(java.awt.event.ActionEvent evt)
。请记住,我每次都在创建这个函数的新存在,并且总是使用
upperClass2
,您可以看到我在哪里删除了大部分不相关的内容@durron597@manetsus
创建mvce需要时间,
-如果需要帮助,请花时间创建mvce。我们不是来为您调试代码的。已为您提供了适当的使用方法。创建MVCE的目的是理解使用该方法的基本概念。然后,一旦你让MVCE工作并理解了这个概念,你就可以调试你自己的代码,看看你做的有什么不同。@camickr我从来没有说过我不会这么做,但由于我没有那么快,我不得不花时间。没有人告诉你调试我的代码,给我一个工作示例,我会自己调试。不幸的是,它对我不起作用,请查看我的类和从中创建对象。第一段代码很长,所以,请看一下构造函数和
private void jButtonOKActionPerformed(java.awt.event.ActionEvent evt)
,我把第二段代码缩短了。您的进程在代码中有注释,但运行它时会注释替代解决方案。请告诉我,如果我做错了什么。对不起,曼尼特斯,我看不出有什么明显的错误。但是在无法运行代码的情况下,很难说出它可能是什么。试着按照其他人的建议制作一个最小的程序。忘了说,制作一个mcve的目的通常是让它工作,从而可以开始了解大程序中错误的真正原因。我制作了一个小小的NetBeans项目,让你了解我的问题。它很短。只需在文件夹中放置一些图片,然后将文件夹路径粘贴到
ShowFrame.java
的构造函数中即可。然后用
main.java
class.manetsus的main运行程序。谢谢。项目正在运行,除了您通过路径引用的图像文件夹。但我替换了我自己的图像文件夹。尝试调用jScrollPaneImageScreen.getViewport()。相反,scrollRectToVisible(…)对我有效。不知道为什么。。。