使用BorderLayout和现有的JScrollPane将Swing元素添加到JFrame

3
package Input;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;

public class ProgramEditor2 {
    JFrame frame;
    JPanel contactListPanel;
    ArrayList<JButton> program;

    public ProgramEditor2() {
        initialize();
    }

    ActionListener al = new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            LineEditor.main((JButton) arg0.getSource(),program,contactListPanel);
        }
    };

    public void initialize() {
        frame = new JFrame();
        frame.setSize(471, 298);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);
        frame.setVisible(true);
        frame.getContentPane().setLayout(new BorderLayout());

        program = new ArrayList<JButton>();

        // Set layout for contactListPane
        contactListPanel = new JPanel();
        contactListPanel.setLayout(new GridLayout(15, 1)); // 15 rows, 1 column
        contactListPanel.setMinimumSize(new Dimension(471, 298));
        contactListPanel.setPreferredSize(new Dimension(471, 298));
        contactListPanel.setMaximumSize(new Dimension(471, 298));
        for (int i = 0; i < 1; i++) {
            JButton button = new JButton();
            button.addActionListener(al);
            contactListPanel.add(button);
        }
        JScrollPane scrollPane = new JScrollPane(contactListPanel);
        scrollPane
                .setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        frame.getContentPane().add(scrollPane, BorderLayout.CENTER);

    }

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

我正在尝试在滚动面板上方添加一个JLabel,并在其下方添加两个JButtons。我认为问题在于第57行将框架布局设置为BorderLayout。如何解决这个问题?


1
frame.add(new JLabel("你好"), BorderLayout.NORTH); - MadProgrammer
1个回答

3

首先,仔细查看如何使用边框布局

我正在尝试在滚动面板上方添加JLabel

frame.add(new JLabel("Hello"), BorderLayout.NORTH);

并且在下面添加两个JButton。

采用“复合布局”方法,使用不同的容器和布局管理器满足内部组件的要求,然后将该容器添加到父容器中,例如:

JButton btn1 = ...;
JButton btn2 = ...;
JPanel buttons = new JPanel();
buttons.add(btn1);
buttons.add(btn2);

frame.add(buttons, BorderLayout.SOUTH);

注意事项:

  • 建议使用JFrame#pack代替frame.setSize(471, 298);,但只有在建立了基本UI后才这样做。
  • frame.getContentPane().setLayout(null);有点毫无意义。
  • frame.setVisible(true);应该在建立UI后最后调用,否则一些组件可能不会出现。
  • 避免使用etMinimumSizesetPreferredSizesetMaximumSize,如果不小心使用可能会对布局产生不利影响。有关更多讨论,请参见Java Swing中是否应避免使用set(Preferred|Maximum|Minimum)Size方法?。如果要更改JScrollPane的工作方式,请改用Scrollable接口。

谢谢,这非常有帮助。 - Sauhaarda Chowdhuri
复合布局很常见,所以花时间学习它是值得的。 - MadProgrammer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接