将 JButton 添加到 Scrollpane

Adding JButtons to Scrollpane

JAVA:

我想将一些 JButton 添加到 Scrollpane。 JButtons 是聊天(就像在 Skype 中一样)。我希望它们在只有 1 列的列表中。 组/行的数量应该是灵活的。 按钮的大小应该始终相同(300x50 或类似的东西)并且按钮内的文本应该左对齐。 我怎样才能做到这一点?

代码:

class Chat extends JButton {

    private static final long serialVersionUID = 1L;
    public Group group;


    public Chat(Group group) {
        this.group = group;
        setMinimumSize(new Dimension(300, 50));

        setFocusPainted(false);
        setText(group.groupname);
        setFont(new Font("Tahoma", Font.PLAIN, 30));
        setForeground(Manager.dark);
        setBackground(blue);
        setBorder(new MatteBorder(0, 0, 1, 0, Manager.ct.getForeground()));
    }

}


public void initGroups() {
    int count = 0;
    for(Group group : groups) {
        if(group != null) {
            //TODO: ADD CHATS (GROUPS) TO SCROLLPANE
            count ++;
        }
    }

    if(count == 0) {
        System.out.println("No groups");
    }
}

创建一个新的 JPanel,设置 GridBadLayout 或 GridLayout 并添加您的聊天按钮。 然后用你的新面板创建一个 JScrollPane。 您可以改进在 JPanel 上实现 Scrollable 的滚动(鼠标滚动)。

首先隔离您需要的功能。从 JPanelGridBagLayout 和一些按钮开始...

    setLayout(new GridBagLayout());
    GridBagConstraints gbc = new GridBagConstraints();
    gbc.gridwidth = GridBagConstraints.REMAINDER;
    gbc.fill = GridBagConstraints.HORIZONTAL;

    for (int index = 0; index < 100; index++) {
        add(new JButton("Chat " + (index + 1)), gbc);
    }

然后将其添加到 JScrollPane 并将其添加到主容器,也许使用 BorderLayout

frame.add(new JScrollPane(new ChatListPane()), BorderLayout.LINE_START);

您可能会发现您可能还需要实现 Scrollable interface 来更好地控制 JScrollPane 的大小,从而更好地满足您的整体需求。虽然我在这里使用它,但您并不总是需要它...

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Rectangle;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.Scrollable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new ChatPane());
                frame.add(new JScrollPane(new ChatListPane()), BorderLayout.LINE_START);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class ChatPane extends JPanel {

        public ChatPane() {
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

    }

    public class ChatListPane extends JPanel implements Scrollable {

        public ChatListPane() {
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridwidth = GridBagConstraints.REMAINDER;
            gbc.fill = GridBagConstraints.HORIZONTAL;

            for (int index = 0; index < 100; index++) {
                add(new JButton("Chat " + (index + 1)), gbc);
            }
        }

        @Override
        public Dimension getPreferredScrollableViewportSize() {
            return new Dimension(100, 100);
        }

        @Override
        public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) {
            return 64;
        }

        @Override
        public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) {
            return 64;
        }

        @Override
        public boolean getScrollableTracksViewportWidth() {
            return true;
        }

        @Override
        public boolean getScrollableTracksViewportHeight() {
            return false;
        }

    }

}

另一个可以说更好的解决方案是使用 JList 和自定义 ListCellRenderer.

有关详细信息,请参阅 How to Use Lists