java - 始终保持在 x 轴上相同位置的组件的推荐布局?

标签 java swing jscrollpane

我的情况有点复杂,所以我不解释,而是展示我目前拥有的图片:

Screenshot of the UI

我的想法是,我想将乐器选择器(每个谱表中显示“长笛”的组合框)移动到谱表上方。然而,我总是想把它放在同一个地方,在工作人员正上方的左侧,即使在水平滚动时也是如此。垂直滚动时,它应该移动,以便始终位于其工作人员的正上方。有点像工具栏。问题是它已经在 J​​ScrollPane 内部(因为可能有多个五线谱并且您需要滚动两个轴并且每个谱表都有一个“仪表板”(尽管最终会有其他 UI 元素可以在这个伪工具栏中进行交互本地到它所附的员工))。这是需要使用绝对定位+监听滚动/调整大小/窗口移动事件的地方吗?或者是否有我不知道的布局可以做这种事情?

感谢您的关注!

最佳答案

  1. 将组件添加到单独的滚动 Pane ,但从不显示水平滚动条
  2. 让所有滚动 Pane 共享相同的 BoundRangeModel。
  3. 创建一个使用此模型的单独 JScrollBar 组件。每当它滚动时,单独的滚动 Pane 也会滚动:

类似于:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;

public class ScrollSSCCE extends JPanel
{
    public ScrollSSCCE()
    {
        setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
        BoundedRangeModel model = null;

        for (int i = 0; i < 5; i++)
        {
            JLabel label = new JLabel("Flute " + i);
            label.setAlignmentX(JComponent.LEFT_ALIGNMENT);
            add( label );

            JTextArea textArea = new JTextArea(3, 20);
            textArea.setText("Just some text to make a horizontal scroll necessary");
            JScrollPane scrollPane = new JScrollPane( textArea );
            scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
            scrollPane.setAlignmentX(JComponent.LEFT_ALIGNMENT);
            add( scrollPane );

            //  Share the horizontal scrollbar model

            JScrollBar horizontal = scrollPane.getHorizontalScrollBar();

            if (i == 0)
                model = horizontal.getModel();
            else
                horizontal.setModel( model );
        }

        //  Create the scrollbar that uses the shared model

        JScrollBar shared = new JScrollBar( JScrollBar.HORIZONTAL );
        shared.setModel( model );
        shared.setAlignmentX(JComponent.LEFT_ALIGNMENT);
        add( shared );
    }

    private static void createAndShowUI()
    {
        JFrame frame = new JFrame("Scroll SSCCE");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( new ScrollSSCCE() );
        frame.setLocationByPlatform( true );
        frame.setSize(200, 400);
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowUI();
            }
        });
    }
}

编辑:

实际上,您甚至可以在不创建“共享”滚动条的情况下执行此操作。只需使用最后一个滚动 Pane 的滚动条:

if (i != 4)
    scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

I need a vertical scroll bar as well.

不要认为您需要创建另一个面板。只需将当前面板直接添加到滚动 Pane 即可:

JScrollPane master = new JScrollPane( new ScrollSSCCE() );
master.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

JFrame frame = new JFrame("Scroll SSCCE");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//frame.add( new ScrollSSCCE() );
frame.add( master );
frame.setLocationByPlatform( true );
frame.setSize(200, 400);
frame.setVisible( true );

这是我的最后一个提示。我不会在附近几天。祝你好运。

关于java - 始终保持在 x 轴上相同位置的组件的推荐布局?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23905288/

相关文章:

java - 如何在函数式接口(interface)和方法引用上下文中的函数之间解释参数和自变量

java - Jackson 序列化列表实体(将字段添加到根列表)

java - Java 中所有 UTF-8 字符的维吉尼亚密码

java - 如何从 ActionEvent 中获取所有 JButton 组件的来源?

jquery - jScrollPane 在 Safari 中覆盖视频导致文本扭曲

java - org.codehaus.jackson.map.JsonMappingException : Can not deserialize instance of java. lang.Long 超出 START_ARRAY token

java - 每行使用一个对象填充 JTable

java - 多值JSlider组件?

java - 获取一个 JScrollPane 的所有内容

java - JScrollPane 总是清除我的面板