更改可见性时,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 命名法(命名约定 - 例如EachWordUpperCaseClassfirstWordLowerCaseMethod()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 大小设置为默认大小的主要内容,如果未能解决你的问题,请参考以下文章

java 界面编程中 JButton问题

使 2 个 JButton 大小相等

当我调用可见性时,Android 动画不起作用

ListView 使 textview 在超出屏幕可见性时可见

设置可见性时 XML 列表视图重叠元素

更改默认小部件大小