Java 将JScrollPane中的元素放在确定的位置

Java 将JScrollPane中的元素放在确定的位置,java,swing,jpanel,jscrollpane,Java,Swing,Jpanel,Jscrollpane,我正在制作一个GUI,其工作方式如下: 就像一堆元素。我在堆栈中输入一个元素,我希望位于JPanel的中心(在JScrollPane中)。我添加的下一个元素需要在中间,最后一个元素X在左边。我添加了一个新元素,并且出现了相同的结果。当一个元素不在JPanel中时,需要激活JScrollPane,让我向左滚动查看所有元素 JPanel a = new JPanel(); this.setBackground(new java.awt.Color(200, 200, 200)); t

我正在制作一个GUI,其工作方式如下:

就像一堆元素。我在堆栈中输入一个元素,我希望位于JPanel的中心(在JScrollPane中)。我添加的下一个元素需要在中间,最后一个元素X在左边。我添加了一个新元素,并且出现了相同的结果。当一个元素不在JPanel中时,需要激活JScrollPane,让我向左滚动查看所有元素

JPanel a = new JPanel();
    this.setBackground(new java.awt.Color(200, 200, 200));
    this.setPreferredSize(new java.awt.Dimension(father.getSize().width, height));
    BoxLayout aaa = new BoxLayout(this,1);
    this.setLayout(aaa);
    FlowLayout MigasDePanLayout = new FlowLayout(0,80,0); //Este es la separacion entre elementos
    a.setLayout(MigasDePanLayout);
    JButton ab = null;

    sp = new JScrollPane(a);
    sp.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
    sp.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    sp.setBounds(0, 0,father.getSize().width, height);

    this.add(sp);
    father.add(this, java.awt.BorderLayout.PAGE_END);
    for (int i = 0; i < 20; i++) {

        ab = new JButton("HHH");
        ab.setLocation(i*20, 0);
        a.add(ab);
    }
    addMouseListener(this);
addMouseMotionListener(this);
}
JPanel a=newjpanel();
setBackground(新java.awt.Color(200200200200));
this.setPreferredSize(新的java.awt.Dimension(父.getSize().width,height));
BoxLayout aaa=新的BoxLayout(本,1);
这是一个布局(aaa);
FlowLayout MigasDePanLayout=新的FlowLayout(0,80,0)//这是一个独立的中心元素
a、 设置布局(MigasDePanLayout);
JButton ab=null;
sp=新的JScrollPane(a);
sp.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL\u SCROLLBAR\u NEVER);
sp.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HorizontalScrollBar,根据需要);
sp.setBounds(0,0,父.getSize().宽度,高度);
添加(sp);
add(this,java.awt.BorderLayout.PAGE_END);
对于(int i=0;i<20;i++){
ab=新的按钮(“HHH”);
ab.设定位置(i*20,0);
a、 添加(ab);
}
addMouseListener(这个);
addMouseMotionListener(此);
}
我有这个代码(父亲是JPanel)

我使用布局来获得每个元素的分隔,但当我添加新元素时,总是在从左侧开始的第一个孔上设置

[…]

我添加了一个新元素

[A] [][]

我想要这个:

[…]

或者,但将图元放置在视图的中心:

[…][A]-->[…][A][]

但是我不知道我是否可以选择我想把元素放在哪里

我读到有必要删除布局以获得自由,您可以将元素(本例中的按钮)放置在X Y位置

有人知道有没有办法把元素放在我想要的位置?(是从右向左插入的东西,而不是从左向右插入的东西,但位于元素的中心)

我需要删除布局或创建另一个组件以实现我的目标

谢谢你的时间

但是我不知道我是否可以选择我想把元素放在哪里

您可以使用:

panel.add(component, index);
在特定位置插入零部件的步骤。大多数不使用约束的布局管理器,如BoxLayout、FlowLayout和GridLayout,都会遵守此参数

int count = panel.getComponentCount();
因此,索引的值必须小于计数

(是从右向左插入的东西,而不是从左向右插入的东西,但位于元素的中心)

因此,当使用具有中心对齐的FlowLayout时,您只需要:

panel.add(component, 0);
另外,不要使用如下代码:

ab.设定位置(i*20,0)


由于布局管理器将设置位置和大小,因此它会被忽略,这令人困惑。

编写您自己的布局管理器,这样它将向面板提供
首选大小
信息,可以告诉
JScrollPane
哪些人决定何时显示滚动条。。。或者你可以使用一个已经存在的可用布局管理器。我不理解嵌套面板:/@Transy,误读了问题。删除该评论并更新为更简单的答案(16小时前)。这解决了问题还是我仍然不理解问题?这解决不了问题。我解释:当我向我的JPanel(包含在JScrollPane中)添加一个元素时,它总是放在左边,下一个放在最后一个的右边,等等。。。我想自由地把一个元素放在布局中我想要的地方。例如:我希望我的第一个元素位于布局的中心。我添加的下一项在第一项的左侧element@Transy
我希望我的第一个元素位于布局的中心。我添加的下一项在第一个元素的左侧
——您的问题仍然不清楚。第二个元素是直接位于第一个组件的左侧,还是位于面板的左边缘,因此两个组件之间存在较大的间隙?