【问题标题】:How do I get the current location of bar in scroll bar?如何获取滚动条中 bar 的当前位置?
【发布时间】:2015-08-17 15:42:45
【问题描述】:

概述:

考虑下图:

有一个垂直滚动条和一个水平滚动条。点击OK后,框架会消失。

在进行了一些其他工作之后,我想将用户留在与现在相同的位置,这可能在具有相同宽度和高度的不同图像中。所以,我想跟踪滚动条中的条。

问题:

  • 是否有任何内置函数可以获取getset 柱位置的百分比或其他内容?

    • 如果是,它们是什么?
    • 如果不是,如何处理?

代码:

MultipleProcess.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(),它不适合我的工作。

【问题讨论】:

  • JScrollBar 返回 int 值,更多在 API 中,和/或包括。来自 JViewport 的可见矩形
  • 我已经检查了API for JScrollPane,它可能会为您提供一些解决方案。即int getVerticalScrollBarPolicy()
  • @Trobbins 哎呀,忘记加了,之前查过,不过这个函数的目的不一样,关于policy。
  • @mKorbel 你能有一些链接吗?我搜了没找到,所以才问。

标签: java swing jscrollbar


【解决方案1】:

尝试JScrollPane.getViewport().getViewRect() 获取可见矩形。你可以通过 JScrollPane.getViewport().scrollRectToVisible(<saved rect>) 来恢复它。

【讨论】:

  • 不幸的是,它对我不起作用,请查看我的课程 here 并从 here 创建对象。第一个代码很长,看看构造函数,private void jButtonOKActionPerformed(java.awt.event.ActionEvent evt) 我把第二个代码写短了。您的流程在代码中被注释,但运行它以注释替代解决方案。请告诉我,如果我做错了什么。
  • 抱歉,manetsus,我看不出有什么明显的错误。但是在无法运行代码的情况下很难判断它可能是什么。尝试按照其他人的建议制作一个最小的程序。
  • 忘了说制作 mcve 的目的通常是让它工作,从而可以开始查看大程序中错误的真正原因。
  • 我创建了 this 微型 NetBeans 项目,让您了解我的问题。它很短。只需在文件夹中放一些图片,然后将文件夹路径粘贴到ShowFrame.java 的构造函数中即可。然后以Main.java类的main运行程序。
  • manetsus:谢谢。使项目运行,除了您通过路径引用的图像文件夹这一事实。但我替换了我自己的图像文件夹。尝试调用 jScrollPaneImageScreen.getViewport().scrollRectToVisible(...) 代替,为我工作。不知道为什么...
【解决方案2】:

如果您使用scrollPane.getVerticalScrollBar().getValue(),您可以在关闭窗格时保存该值。

然后,当您重新加载窗格时,只需使用 scrollPane.getVerticalScrollBar.setValue(savedValue)

你也可以对水平滚动条做同样的事情。

我查看了您在 cmets 中放置的 MCVE,我非常怀疑问题出在您给我的代码中,可能在调用 new MultipleProcess 的类中。

【讨论】:

  • 不幸的是,它对我不起作用。这可能是我的错,但我仍在努力。
  • @manetsus 你能edit你的问题来显示你正在使用的代码吗?见:minimal reproducible example
  • 制作一个mvce需要时间,但你可以看看我的课here。看看构造函数和private void jButtonOKActionPerformed(java.awt.event.ActionEvent evt)。请记住,我每次都在创建此功能的新存在并且始终使用 upperClass2 ,您可以看到 here 我已经删除了大部分不相关的内容。 @durron597
  • @manetsus It would take time to make a mvce, - 如果您需要帮助,请花时间创建 MVCE。我们不是来为您调试代码的。您已获得适当的使用方法。创建 MVCE 的重点是了解使用该方法的基本概念。然后,一旦你让 MVCE 工作并理解了这个概念,你就可以调试自己的代码,看看你在做什么不同。
  • @camickr 我从来没有说过我不会这样做,但由于我没有那么快,所以我必须花时间。没有人告诉你调试我的代码,给我一个工作示例,我会自己调试。
猜你喜欢
  • 1970-01-01
  • 2013-03-22
  • 2013-04-06
  • 2021-04-08
  • 2014-02-23
  • 2011-05-05
  • 2019-05-05
  • 1970-01-01
相关资源
最近更新 更多