如何使这个JButton工作?

时间:2016-08-10 06:43:04

标签: java swing jbutton

我在JButtons上遇到了一些麻烦。我的问题是,无论我尝试什么,JButton都不会出现。我已经尝试了一个多小时,但没有任何工作,所以我觉得是时候问这里了。这是我的代码。它只是构造函数,因为整个类非常大而且你不需要看它。

public Game() {

    frame = new JFrame(NAME);
    canvas = new Canvas();

    canvas.setMinimumSize(new Dimension(width, height));
    canvas.setMaximumSize(new Dimension(width, height));
    canvas.setPreferredSize(new Dimension(width, height));
    canvas.setFocusable(false);

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLayout(new BorderLayout());
    frame.setSize(width, height);

    frame.add(canvas, BorderLayout.CENTER);

    frame.setResizable(false);
    frame.setLocationRelativeTo(null);
    frame.pack();
    frame.setVisible(true);
    frame.setFocusable(true);
    frame.requestFocus();

    JPanel panel = new JPanel();
    JButton play = new JButton("Hi");

    panel.add(play);
    frame.getContentPane().add(panel);
    panel.setPreferredSize(new Dimension(width, height));

}

2 个答案:

答案 0 :(得分:1)

主要问题:

    添加所有组件后,应完成
  1. frame.pack();
  2. frame.setVisible(true);最好放在所有添加,打包和放配置。
  3. import java.awt.*;
    import javax.swing.*;
    
    public class Game {
    
        private JFrame frame = null;
        private Canvas canvas = null;
        private String NAME = "Moronically Named Game";
        int width = 500;
        int height = 200;
    
        public Game() {
    
            frame = new JFrame(NAME);
            canvas = new Canvas();
    
            canvas.setMinimumSize(new Dimension(width, height));
            canvas.setMaximumSize(new Dimension(width, height));
            canvas.setPreferredSize(new Dimension(width, height));
            canvas.setFocusable(false);
    
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLayout(new BorderLayout());
            frame.setSize(width, height);
    
            frame.add(canvas, BorderLayout.CENTER);
    
            frame.setResizable(false);
            frame.setLocationRelativeTo(null);
            frame.setFocusable(true);
            frame.requestFocus();
    
            JPanel panel = new JPanel();
            JButton play = new JButton("Hi");
    
            panel.add(play);
            frame.getContentPane().add(panel);
            panel.setPreferredSize(new Dimension(width, height));
    
            frame.pack();
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            Runnable r = new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (Exception useDefault) {
                    }
                    Game o = new Game();
                }
            };
            SwingUtilities.invokeLater(r);
        }
    }
    

    其他提示:

    1. 为了更好地提供帮助,请发布Minimal, Complete, and Verifiable exampleShort, Self Contained, Correct Example。例如。正如我的回答所示。您在问题中发布了一个无法编译的代码段,我将其转换为MCVE以获得答案。
    2. 请参阅Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?(是)。
    3. 如tip(2)中所述,使用填充布局GUI。以最小尺寸提供ASCII艺术或GUI的预期布局的简单绘图,如果可调整大小,则具有更大的宽度和高度。

答案 1 :(得分:0)

根据您提供的代码,我认为canvas = new Canvas()组件覆盖了整个JFrame,因为您已将其设置与jframe相同,这使得其他组件看起来不显示。