gpt4 book ai didi

java - 增加与 JPanel 顶部的距离

转载 作者:行者123 更新时间:2023-11-30 09:17:23 29 4
gpt4 key购买 nike

我正在尝试增加 JButton 与面板顶部的距离以使其更具视觉吸引力,我尝试使用不可见按钮但没有成功。

public class SimpleBorder {

public static void main(String[] args) {

JFrame frame = new JFrame();
frame.setSize(500,500);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Border etched = (Border) BorderFactory.createEtchedBorder();


String[] items = {"A", "B", "C", "D"};
JList list = new JList(items);

JTextArea text = new JTextArea(10, 40);

JScrollPane scrol = new JScrollPane(text);
JScrollPane scrol2 = new JScrollPane(list);

JPanel panel= new JPanel();
panel.add(scrol2,BorderLayout.WEST);
panel.add(scrol, BorderLayout.EAST);
panel.setBorder(etched);

frame.add(panel);
frame.setVisible(true);
}

}

有什么想法吗?

最佳答案

关键基本上在于,组件不知道它的实际大小,直到 frame.pack() 不会被调用。因此,在此之后我正在执行此计算,以确定为 Border 放置多少空白空间,并再次调用 frame.pack()repack() 放置 Border 之后的所有内容。

请看一下这个例子,看看这个套件是否满足您的需求:

import java.awt.*;
import javax.swing.*;

public class MainMenu {

private JButton playButton;
private JButton instructionButton;
private JButton scoreboardButton;
private JButton exitButton;

private JPanel menuPanel;

private GridBagConstraints gbc;

public MainMenu() {
gbc = new GridBagConstraints();
gbc.insets = new Insets(15, 15, 15, 15);
gbc.anchor = GridBagConstraints.FIRST_LINE_START;
}

private void displayGUI() {
JFrame frame = new JFrame("Main Menu");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

JPanel contentPane = new JPanel(new BorderLayout());

menuPanel = new JPanel(new GridBagLayout());
menuPanel.setOpaque(true);
menuPanel.setBackground(Color.BLACK);

playButton = new JButton("Play");
instructionButton = new JButton("Instructions");
scoreboardButton = new JButton("Scoreboard");
exitButton = new JButton("Exit");

addComp(menuPanel, playButton, 0, 0, 1, 1, 1.0, 0.20,
GridBagConstraints.HORIZONTAL);
addComp(menuPanel, instructionButton, 0, 1, 1, 1, 1.0, 0.20,
GridBagConstraints.HORIZONTAL);
addComp(menuPanel, scoreboardButton, 0, 2, 1, 1, 1.0, 0.20,
GridBagConstraints.HORIZONTAL);
addComp(menuPanel, exitButton, 0, 3, 1, 1, 1.0, 0.20,
GridBagConstraints.HORIZONTAL);

contentPane.add(menuPanel);

frame.setContentPane(contentPane);
frame.pack();
contentPane.setBorder(
BorderFactory.createEmptyBorder(
contentPane.getHeight() - (contentPane.getHeight() / 4),
20, 5, 20));
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}

private void addComp(JPanel panel, JComponent comp,
int gridx, int gridy,
int gridwidth, int gridheight,
double weightx, double weighty,
int fill) {
gbc.gridx = gridx;
gbc.gridy = gridy;
gbc.gridwidth = gridwidth;
gbc.gridheight = gridheight;
gbc.weightx = weightx;
gbc.weighty = weighty;
gbc.fill = fill;

panel.add(comp, gbc);
}

public static void main(String[] args) {
Runnable runnable = new Runnable() {
@Override
public void run() {
new MainMenu().displayGUI();
}
};
EventQueue.invokeLater(runnable);
}
}

这是输出:

enter image description here

编辑 1:

此外,如果您将使用 GridLayout 而不是为 MainMenu 使用 GridBagLayout,那么我想结果会更有希望。请查看此示例以了解该更改:

import java.awt.*;
import javax.swing.*;

public class MainMenu {

private JButton playButton;
private JButton instructionButton;
private JButton scoreboardButton;
private JButton exitButton;

private JPanel menuPanel;

private void displayGUI() {
JFrame frame = new JFrame("Main Menu");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

JPanel contentPane = new JPanel(new GridBagLayout());

menuPanel = new JPanel(new GridLayout(0, 1, 5, 5));
menuPanel.setBorder(
BorderFactory.createEmptyBorder(5, 5, 5, 5));
menuPanel.setOpaque(true);
menuPanel.setBackground(Color.BLACK);

playButton = new JButton("Play");
instructionButton = new JButton("Instructions");
scoreboardButton = new JButton("Scoreboard");
exitButton = new JButton("Exit");

menuPanel.add(playButton);
menuPanel.add(instructionButton);
menuPanel.add(scoreboardButton);
menuPanel.add(exitButton);

contentPane.add(menuPanel);

frame.setContentPane(contentPane);
frame.pack();
contentPane.setBorder(
BorderFactory.createEmptyBorder(
contentPane.getHeight() -
(contentPane.getHeight() -
(3 * menuPanel.getHeight())),
20, 0, 20));
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}

public static void main(String[] args) {
Runnable runnable = new Runnable() {
@Override
public void run() {
new MainMenu().displayGUI();
}
};
EventQueue.invokeLater(runnable);
}
}

编辑 2:

另一个变体看起来好多了,不过这次,基础 JPanel 使用 GridLayoutMenuPanel 使用 GridBagLayout。请看这个例子:

import java.awt.*;
import javax.swing.*;

public class MainMenu {

private JButton playButton;
private JButton instructionButton;
private JButton scoreboardButton;
private JButton exitButton;

private JPanel menuPanel;

private GridBagConstraints gbc;

public MainMenu() {
gbc = new GridBagConstraints();
gbc.insets = new Insets(15, 15, 15, 15);
gbc.anchor = GridBagConstraints.CENTER;
}

private void displayGUI() {
JFrame frame = new JFrame("Main Menu");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

JPanel contentPane = new JPanel(new GridLayout(1, 1, 5, 2));

menuPanel = new JPanel(new GridBagLayout());
menuPanel.setBorder(
BorderFactory.createEmptyBorder(5, 5, 5, 5));
menuPanel.setOpaque(true);
menuPanel.setBackground(Color.BLACK);

playButton = new JButton("Play");
instructionButton = new JButton("Instructions");
scoreboardButton = new JButton("Scoreboard");
exitButton = new JButton("Exit");

addComp(menuPanel, playButton, 0, 0, 1, 1, 1.0, 0.10,
GridBagConstraints.CENTER);
addComp(menuPanel, instructionButton, 0, 1, 1, 1, 1.0, 0.10,
GridBagConstraints.CENTER);
addComp(menuPanel, scoreboardButton, 0, 2, 1, 1, 1.0, 0.10,
GridBagConstraints.CENTER);
addComp(menuPanel, exitButton, 0, 3, 1, 1, 1.0, 0.10,
GridBagConstraints.CENTER);

contentPane.add(menuPanel);

frame.setContentPane(contentPane);
frame.pack();
contentPane.setBorder(
BorderFactory.createEmptyBorder(
contentPane.getHeight() -
(contentPane.getHeight() -
(2 * menuPanel.getHeight()) + 100),
20, 2, 20));
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}

private void addComp(JPanel panel, JComponent comp,
int gridx, int gridy,
int gridwidth, int gridheight,
double weightx, double weighty,
int fill) {
gbc.gridx = gridx;
gbc.gridy = gridy;
gbc.gridwidth = gridwidth;
gbc.gridheight = gridheight;
gbc.weightx = weightx;
gbc.weighty = weighty;
gbc.fill = fill;

panel.add(comp, gbc);
}

public static void main(String[] args) {
Runnable runnable = new Runnable() {
@Override
public void run() {
new MainMenu().displayGUI();
}
};
EventQueue.invokeLater(runnable);
}
}

关于java - 增加与 JPanel 顶部的距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18977139/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com