setLayout() 未更改 JButton 大小

JButton size not changed by setLayout()

我正在努力学习 Java 我决定编写我的第一个程序。我正在尝试制作一个带有标题和 JButton 的 window。但是按钮的位置并没有被 setBounds() 改变,无论我把它改成什么,它仍然停留在一个位置。我听说添加 frame.getcontentPane().setLayout(null) 可以解决这个问题,但事实并非如此。

你能告诉我问题是什么吗? (第 37 行)

package com.myprojects;

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

public class Main extends JFrame {

    public static void main(String[] args) {

        //frame
        JPanel panel = new JPanel();
        JFrame frame = new JFrame();

        frame.setSize(1366,768);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setIconImage(new ImageIcon("filedirectory").getImage());
        frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        frame.setUndecorated(true);
        frame.add(panel);

        //panel
        panel.setBackground(new Color(34, 212, 187));
        Font titleFont = new Font("Batang", Font.BOLD,120);
        Font font = new Font("Batang",Font.PLAIN, 12);

        //label
        JLabel title = new JLabel("Title");
        title.setBounds(10,20,80,25);
        title.setFont(titleFont);
        title.setForeground(new Color(0xFFB700));
        panel.add(title);

        //play button
        JButton play = new JButton("Play");
        play.setFont(font);
        play.setBounds(500,500,250,100);
        panel.add(play);
        
        frame.setVisible(true);
    }

I decided to write my first program.

那么您应该学习如何按照设计的方式使用 Swing。这意味着,不要使用空布局。不要使用 setBounds()!Swing 旨在与布局管理器一起使用。默认情况下,JPanel 的布局管理器是 FlowLayout。因此您将看到标签和按钮在同一行。

根据您的代码,您似乎正试图将标签放在框架的顶部,将按钮放在框架的底部。

所以开始:

  1. 去掉 JPanel
  2. 使用以下方法将标签添加到框架:frame.add(title, BorderLayout.PAGE_START)
  3. 使用以下方法将按钮添加到框架:frame.add(play, BorderLayout.PAGE_END)

运行 你的程序看看这看起来怎么样。

框架内容窗格的默认布局是 BorderLayout。阅读 Swing 教程中关于 Layout Managers 的部分,了解 add(...) 方法的第二个参数的含义。

如果您不喜欢该布局,请将框架的布局管理器更改为不同的布局管理器并进行试验。

对于 camickr 所描述的方法,我会采取一些不同的方法。当然仍然使用布局,但是使用更接近代码似乎描述的效果的不同布局。

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

public class ButtonCompoundLayout {
    public ButtonCompoundLayout() {
        //frame
        JFrame frame = new JFrame();
        //panel
        JPanel panel = new JPanel(new BorderLayout());
        panel.setBorder(new TitledBorder("BorderLayout"));

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(panel);

        //label
        JLabel title = new JLabel("Title");
        title.setFont(title.getFont().deriveFont(50f));
        panel.add(title, BorderLayout.PAGE_START);
        title.setBorder(new TitledBorder("BorderLayout.PAGE_START"));

        //play button
        JButton play = new JButton("Play");
        Insets insets = new Insets(20,30,30,30);
        play.setMargin(insets);
        JPanel controlPanel = new JPanel(new GridBagLayout());
        CompoundBorder compoundBorder = new CompoundBorder(
                new TitledBorder("GridBagLayout"), 
                new EmptyBorder(15, 50, 15, 50)
        );
        controlPanel.setBorder(compoundBorder);
        controlPanel.add(play);
        panel.add(controlPanel, BorderLayout.CENTER);
        
        frame.pack();
        frame.setMinimumSize(frame.getSize());
        frame.setVisible(true);
    }
    
    public static void main(String[] args) {
        Runnable r = () -> {
            new ButtonCompoundLayout();
        };
        SwingUtilities.invokeLater(r);
    }
}

仔细查看代码本身并检查用于 white-space 的每个方法和 类,但这里有一些一般提示/观察结果。

  • JFrame 上对 setBounds 的调用似乎与对 setExtendedState(..)
  • 的调用发生冲突
  • 在未修饰的 GUI 中看不到图标图像 on-screen,是不是仅用于标题栏?
  • 设置颜色的奇怪选择。一个指定为 RGB 整数,另一个指定为十六进制值。使用其中之一。
  • 从按钮的大小和位置来看,其意图似乎是将其居中。它没有居中。
  • 除非随应用程序提供字体,否则不要假定字体可用。并在运行时加载它。

永远不要使用空布局,因为它不适应不同的屏幕尺寸。我建议你应该学习如何使用布局。比如我每次设计gui的时候都会用到GridBagLayout