更改可见性时,JButton 大小设置为默认大小
Posted
技术标签:
【中文标题】更改可见性时,JButton 大小设置为默认大小【英文标题】:JButton size is set to default size when visibility is changed 【发布时间】:2015-07-11 01:10:55 【问题描述】:就像我说的那样,当我单击JButton MN
时,JButton GR
被设置为默认大小(窗口大小)。
当程序启动时,JButton GR
具有正确的大小(200 x 20),单击时菜单按钮也会以正确的大小显示(200 x 20),但是当单击菜单按钮时,GR JButton
位于其默认大小。单击完整大小的GR JButton
时,菜单按钮会以正确的大小重新出现。
我正在使用 BlueJ(学校不允许使用其他 IDE)。
import java.util.Scanner;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.JButton;
public class MAIN
public static void main(String args[])
ActionClass actionEvent = new ActionClass();
//Main window
JFrame Program1 = new JFrame("Program1");
Program1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Program1.setPreferredSize(new Dimension(800, 600));
Program1.pack();
Program1.setVisible(true);
//menu button (returns to home Menu)
JButton MN = new JButton("MENU");
MN.setBounds(300, 10, 200, 20);
MN.setVisible(false);
Program1.add (MN);
//MN.setActionCommand("1");
// Enter GRC
JButton GR = new JButton("GRC");
GR.setBounds(300, 40, 200, 20);
GR.setVisible(true);
Program1.add (GR);
//GR.setActionCommand("2");
GR.addActionListener(new ActionListener()
public void actionPerformed(ActionEvent GRH)
MN.setVisible(true);
GR.setVisible(false);
);
MN.addActionListener(new ActionListener()
public void actionPerformed(ActionEvent MNH)
MN.setVisible(false);
GR.setVisible(true);
);
【问题讨论】:
1) Java GUI 必须在不同的操作系统、屏幕尺寸、屏幕分辨率等上工作。因此,它们不利于像素完美布局。而是使用布局管理器,或combinations of them 以及white space 的布局填充和边框。 2) 请学习常见的 Java 命名法(命名约定 - 例如EachWordUpperCaseClass
、firstWordLowerCaseMethod()
、firstWordLowerCaseAttribute
,除非它是 UPPER_CASE_CONSTANT
)并始终如一地使用它。
MN.setVisible(true); GR.setVisible(false);
使用CardLayout
,如this answer 所示。
JButtons MN 和 GR 应声明为局部变量或缺少 final ....
为了尽快获得更好的帮助,请发布MCVE(最小完整可验证示例)或SSCCE(简短、自包含、正确示例)。正如@mKorbel 所指出的那样,该代码示例不会像编写的那样编译!不要发布“类似”正在使用的代码!
可见性应该是类中的最后一行代码
【参考方案1】:
正如你所说,Jbutton GR 是...
JFrame 在 API 中将 BorderLayout 作为默认的 LayoutManager,
使用 Java 命名约定
使用LayoutManager而不是NullLayout和错误的方式
setVisible(true);应该是最后一行代码,因为您有风险将所有 JComponents 添加到已经可见的容器中(例如,将鼠标悬停在重新绘制这些 JComponents)
使用Initial Thread
尽可能简单
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.JButton;
public class Main
private JFrame myProgram1 = new JFrame("myProgram1");
private JButton myMN = new JButton("MENU");
private JButton myGR = new JButton("myGRC");
public Main()
myGR.addActionListener(new ActionListener()
@Override
public void actionPerformed(ActionEvent myGRH)
myMN.setVisible(true);
myGR.setVisible(false);
);
myProgram1.add(myMN, BorderLayout.SOUTH);
myMN.addActionListener(new ActionListener()
@Override
public void actionPerformed(ActionEvent myMNH)
myMN.setVisible(false);
myGR.setVisible(true);
);
myProgram1.add(myGR, BorderLayout.NORTH);
myProgram1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
myProgram1.pack();
myProgram1.setVisible(true);
public static void main(String args[])
SwingUtilities.invokeLater(new Runnable()
@Override
public void run()
new Main();
);
【讨论】:
以上是关于更改可见性时,JButton 大小设置为默认大小的主要内容,如果未能解决你的问题,请参考以下文章