簡體   English   中英

添加元素后調整JList的大小

[英]JList resize after add element

我對JList的大小有一點問題:

有一個帶有三個JList的JFrame(每個JScrollPane中)。 您可以通過單擊將項目添加到列表。 程序啟動后,所有JList都具有相同的寬度。 但是在填充任何列表后,他的寬度都會減小,並且創建的空間會平均添加到空列表中。

我要停止調整大小。 我希望下面的代碼能更好地描述我的問題。

package test;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.DefaultListModel;
import javax.swing.GroupLayout;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;

public class Test extends JFrame {

    public Test() {
        GroupLayout layout = new GroupLayout(this.getContentPane());
        this.setLayout(layout);

        JList listA = new JList(new DefaultListModel<String>());
        JList listB = new JList(new DefaultListModel<String>());
        JList listC = new JList(new DefaultListModel<String>());

        MouseListener listener = new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                ((DefaultListModel) ((JList) e.getSource()).getModel()).addElement("some text");
                revalidate();
            }
        };

        listA.addMouseListener(listener);
        JScrollPane paneA = new JScrollPane(listA);
        listB.addMouseListener(listener);
        JScrollPane paneB = new JScrollPane(listB);
        listC.addMouseListener(listener);
        JScrollPane paneC = new JScrollPane(listC);

        layout.setAutoCreateGaps(true);
        layout.setAutoCreateContainerGaps(true);
        layout.setHorizontalGroup(layout.createSequentialGroup().addComponent(paneA).addComponent(paneB).addComponent(paneC));
        layout.setVerticalGroup(layout.createSequentialGroup().addGroup(layout.createParallelGroup(GroupLayout.Alignment.CENTER).addComponent(paneA).addComponent(paneB).addComponent(paneC)));

        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.pack();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                Test test = new Test();
                test.setVisible(true);
            }
        });

    }
}

為了使組件具有恆定的大小,您將需要使用addComponent(Component component, int min, int pref, int max) 所以只用這個替換你的代碼

layout.setHorizontalGroup(layout.createSequentialGroup()
    .addComponent(paneA, GroupLayout.PREFERRED_SIZE, 200, GroupLayout.PREFERRED_SIZE)
    .addComponent(paneB, GroupLayout.PREFERRED_SIZE, 200, GroupLayout.PREFERRED_SIZE)
    .addComponent(paneC, GroupLayout.PREFERRED_SIZE, 200, GroupLayout.PREFERRED_SIZE));

代替這個

layout.setHorizontalGroup(layout.createSequentialGroup().addComponent(paneA).addComponent(paneB).addComponent(paneC));

在這里,我使用了GroupLayout屬性和200的恆定寬度來使其穩定。

JList可能會被調整大小,因為呈現的值的大小小於首次創建時的大小。 然后,布局管理器將它們重新布局,以滿足這些新要求。

JScrollPaneJViewportJListJListListCellRenderer之間,需要進行很多復雜的工作,而您不想參與其中。

相反,您想向JList提供有關如何調整大小的“提示”。

例如...

您可以使用JList#setPrototypeCellValueJList提供有關將來將添加到列表的值的最大大小的信息。 當您要添加大量值時,這特別方便,因為JList無需檢查每個值即可確定每一行的高度和容納這些值所需的寬度。

缺點是,您將需要知道任何可能增加的值的最大寬度...

另外,您可以使用LayoutManager ,它使您可以更好地控制組件的放置和更改方式,例如GridBagLayout甚至MigLayout

您還應該檢查一下是否應該避免在Java Swing中使用set(Preferred | Maximum | Minimum)Size方法?

這是解決問題的一種方法。

JScrollPane paneA = new JScrollPane(listA);
paneA.setPreferredSize(new Dimension(paneA.getPreferredSize().height, 300));
listB.addMouseListener(listener);
JScrollPane paneB = new JScrollPane(listB);
paneB.setPreferredSize(new Dimension(paneB.getPreferredSize().height, 300));
listC.addMouseListener(listener);
JScrollPane paneC = new JScrollPane(listC);
paneC.setPreferredSize(new Dimension(paneC.getPreferredSize().height, 300));

我對GroupLayout管理器不熟悉。 以下文檔可能提供了一種進一步控制布局的方法。 http://docs.oracle.com/javase/tutorial/uiswing/layout/group.html (請參閱組件大小和可縮放性)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM