尝试使用GUI,无法添加按钮和标签

时间:2014-02-17 01:47:30

标签: java swing user-interface awt

分配很简单,我们需要做的就是让代码创建一个带有红色面板的窗口,其中包含一个按钮和标签。这是迄今为止的代码以及测试器类。 我把标签显示在窗口上,但它在一个奇怪的地方。我无法显示按钮以使背景显示为红色。

这是我最困难的地方:

import java.awt.Color;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class MyCustomFrame extends JFrame
{
    public MyCustomFrame()
    {
        createComponents();
        setSize(FRAME_WIDTH, FRAME_HEIGHT);

    }

private void createComponents()
    {
        JPanel panel=new createPanel();
        button=new JButton("Push Me");
        label=new JLabel("This is a label");
        add(button);
        add(label);
    }

private JButton button;
private JLabel label;
final int FRAME_WIDTH = 800;
final int FRAME_HEIGHT = 800;

public void createPanel()
    {
        JPanel panel=new JPanel();
        panel.setBackground(Color.RED);
        //button=new JButton("Push Me");
        //label=new JLabel("This is a label");

    }
public void createFrame()
    {
        JFrame frame=new JFrame();
        add(frame);
        frame.setVisible(true);
    }

}

这是测试人员类:

import javax.swing.JFrame;

public class MyCustomFrameViewer
{
   public static void main(String[] args)
   {
      MyCustomFrame frame = new MyCustomFrame();
      frame.setTitle("My first frame");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setVisible(true);
   }
}  

3 个答案:

答案 0 :(得分:5)

您创建了JPanel面板,但没有添加任何内容,然后从不将面板添加到您的JFrame。您应该将组件添加到JPanel面板,然后将面板对象添加到JFrame。

请注意,JPanel默认使用FlowLayout,因此无需特殊的添加方法就可以更轻松地接受多个其他组件。 JFrame的contentPane使用BorderLayout,使用起来稍微复杂一些。

答案 1 :(得分:4)

将面板添加到框架而不是标签和按钮,并将标签和按钮添加到面板...

private void createComponents()
{
    JPanel panel=new createPanel();
    add(panel);
    button=new JButton("Push Me");
    label=new JLabel("This is a label");
    panel.add(button);
    panel.add(label);
}

您可能还想查看Initial Threads,并确保在Event Dispatching Thread的上下文中创建UI

一些旁注......

这吓到我......

public void createFrame()
{
    JFrame frame=new JFrame();
    add(frame);
    frame.setVisible(true);
}

你试图在帧中添加一个帧,这在Swing中是非法操作,但幸运的是,你实际上并没有从我能看到的内容中调用它。

您可能希望改用setSize(FRAME_WIDTH, FRAME_HEIGHT);而不是pack

答案 2 :(得分:2)

另请参阅此示例中的注释提示:

enter image description here

import java.awt.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;

// Don't extend frame, just use an instance
//public class MyCustomFrame extends JFrame {
public class MyCustomFrame {

    private JFrame frame;
    private JButton button;
    private JLabel label;
    private JPanel panel;
    // better to override the preferred size of the component of interest
    final int GAME_WIDTH = 300;
    final int GAME_HEIGHT = 100;

    public MyCustomFrame() {
        createComponents();
        // better to override the preferred size of the component of interest
        //setSize(GAME_WIDTH, GAME_HEIGHT);
    }

    private void createComponents() {
        // compilation error!  createPanel() does not return anything..
        //JPanel panel = new createPanel();
        createPanel();
        // create the frame!
        createFrame();
    }

    private void createPanel() {
        // creates a local instance
        //JPanel panel = new JPanel();
        panel = new JPanel() {

            /* override the preferred size of the component of interest */
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(GAME_WIDTH, GAME_HEIGHT);
            }
        };
        panel.setBackground(Color.RED);
        button = new JButton("Push Me");
        label = new JLabel("This is a label");
        panel.add(button);
        panel.add(label);
    }

    private void createFrame() {
        // create a local instance of a JFrame that goes out of scope at end
        // of method..
        //JFrame frame = new JFrame();
        frame = new JFrame("My first frame");
        // add the panel to the frame!
        frame.add(panel);
        // better to use DISPOSE_ON_CLOSE
        //frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        // a good way to position a GUI
        frame.setLocationByPlatform(true);
        // this was trying to add a JFrame to another JFrame
        //add(frame);
        frame.pack();
    }

    public final JFrame getFrame() {
        return frame;
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {

            @Override
            public void run() {
                MyCustomFrame myFrame = new MyCustomFrame();
                JFrame frame = myFrame.getFrame();
                frame.setVisible(true);
            }
        };
        // Swing GUIs should be created and updated on the EDT
        // http://docs.oracle.com/javase/tutorial/uiswing/concurrency
        SwingUtilities.invokeLater(r);
    }
}
相关问题