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
。因此您将看到标签和按钮在同一行。
根据您的代码,您似乎正试图将标签放在框架的顶部,将按钮放在框架的底部。
所以开始:
- 去掉 JPanel
- 使用以下方法将标签添加到框架:
frame.add(title, BorderLayout.PAGE_START)
- 使用以下方法将按钮添加到框架:
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
我正在努力学习 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
。因此您将看到标签和按钮在同一行。
根据您的代码,您似乎正试图将标签放在框架的顶部,将按钮放在框架的底部。
所以开始:
- 去掉 JPanel
- 使用以下方法将标签添加到框架:
frame.add(title, BorderLayout.PAGE_START)
- 使用以下方法将按钮添加到框架:
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