JButton的大小不能通过setLayout更改

问题描述

我正在尝试学习Java,因此决定编写我的第一个程序。我正在尝试制作一个带有标题JButton的窗口。但是按钮位置不会被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);
    }

解决方法

我决定写我的第一个程序。

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

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

因此开始:

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

运行程序以查看其外观。

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

如果您不喜欢布局,则将框架的布局管理器更改为其他布局管理器并进行实验。

,

我会采取与camickr描述的方法稍有不同的方法。当然,仍然使用布局,但是使用的布局更接近代码似乎正在描述的效果。

enter image description here enter image description here

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);
        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);
    }
}

仔细检查代码本身,并检查用于空格的每种方法和类,但这是一些常规技巧/观察。

  • setBounds上对JFrame的呼叫似乎正在与对setExtendedState(..)的呼叫争夺
  • 图标图像在屏幕上显示时不会在未经修饰的GUI中看到,仅仅是标题栏吗?
  • 设置颜色的奇怪选择。一个指定为RGB整数,另一个指定为十六进制值。使用其中一个。
  • 通过按钮的大小和位置,似乎可以使按钮居中。它没有居中。
  • 除非应用程序提供字体,否则不要假定字体可用。并在运行时加载它。
,

绝对不要使用空布局,因为它不能适应不同的屏幕尺寸。我建议您应该学习如何使用布局。例如,我每次设计GUI时都使用GridBagLayout。