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


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,在其下方添加两个JButton。我认为问题在于我在第57行将框架布局设置为BorderLayout。我该如何着手解决这个问题?

首先仔细了解如何使用BorderLayout

我正试图在滚动面板上方添加一个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接口

最新更新