繁体   English   中英

BorderLayout无法正常工作

[英]BorderLayout not working JFrame

由于某种原因,我无法让BorderLayout设置它应该的设置方式。 只想知道我要去哪里错了。

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class ColorFactory extends JFrame
{

    final int width = 500;
    final int height = 300;

    private JPanel buttonPanel;
    private JPanel radioButtonPanel;
    private JLabel msgChangeColor;

    public ColorFactory()
    {
        setTitle("Color Factory");
        setSize(width, height);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        setLayout(new BorderLayout());

        createTopPanel();
        add(buttonPanel, BorderLayout.NORTH);

        createBottomPanel();
        add(radioButtonPanel, BorderLayout.SOUTH);

        msgChangeColor = new JLabel("Top buttons change the panel color and bottom radio buttons change the text color.");
        add(msgChangeColor, BorderLayout.CENTER);

        pack();
    }

    private void createTopPanel()
    {   
        buttonPanel = new JPanel();
        setLayout(new FlowLayout());

        JButton redButton = new JButton("Red");
        redButton.setBackground(Color.RED);
        redButton.addActionListener(new ButtonListener());
        redButton.setActionCommand("R");

        JButton orangeButton = new JButton("Orange");
        orangeButton.setBackground(Color.ORANGE);
        orangeButton.addActionListener(new ButtonListener());
        orangeButton.setActionCommand("O");

        JButton yellowButton = new JButton("Yellow");
        yellowButton.setBackground(Color.YELLOW);
        yellowButton.addActionListener(new ButtonListener());
        yellowButton.setActionCommand("Y");

        buttonPanel.add(redButton);
        buttonPanel.add(orangeButton);
        buttonPanel.add(yellowButton);

    }

    private void createBottomPanel()
    {
        radioButtonPanel = new JPanel();
        setLayout(new FlowLayout());

        JRadioButton greenRadioButton = new JRadioButton("Green");
        greenRadioButton.setBackground(Color.GREEN);
        greenRadioButton.addActionListener(new RadioButtonListener());
        greenRadioButton.setActionCommand("G");

        JButton blueRadioButton = new JButton("Blue");
        blueRadioButton.setBackground(Color.BLUE);
        blueRadioButton.addActionListener(new RadioButtonListener());
        blueRadioButton.setActionCommand("B");

        JButton cyanRadioButton = new JButton("Cyan");
        cyanRadioButton.setBackground(Color.CYAN);
        cyanRadioButton.addActionListener(new RadioButtonListener());
        cyanRadioButton.setActionCommand("C");

        radioButtonPanel.add(greenRadioButton);
        radioButtonPanel.add(blueRadioButton);
        radioButtonPanel.add(cyanRadioButton);
    }

    private class ButtonListener implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            String actionColor = e.getActionCommand();
            if(actionColor.equals("R"))
            {
                buttonPanel.setBackground(Color.RED);
                radioButtonPanel.setBackground(Color.RED);
            }

            if(actionColor.equals("O"))
            {
                buttonPanel.setBackground(Color.ORANGE);
                radioButtonPanel.setBackground(Color.ORANGE);
            }

            if(actionColor.equals("Y"))
            {
                buttonPanel.setBackground(Color.YELLOW);
                radioButtonPanel.setBackground(Color.YELLOW);
            }
        }
    }
        private class RadioButtonListener implements ActionListener
        {
            public void actionPerformed(ActionEvent e)
            {
                String actionTextColor = e.getActionCommand();
                if(actionTextColor.equals("G"))
                {
                    msgChangeColor.setForeground(Color.GREEN);
                }

                if(actionTextColor.equals("B"))
                {
                    msgChangeColor.setForeground(Color.BLUE);
                }

                if(actionTextColor.equals("C"))
                {
                    msgChangeColor.setForeground(Color.CYAN);
                }
            }
    }

        public static void main(String[] args)
        {
            ColorFactory run = new ColorFactory();
            run.setVisible(true);
        }

}

问题是当您创建顶部和底部面板时,您正在更改框架的布局管理器。

private void createTopPanel() {
    buttonPanel = new JPanel();
    setLayout(new FlowLayout()); // <--- This is call setLayout on the frame

这就是为什么危险……

  • 直接从类似JFrame东西扩展...
  • 动态构建组件

失去上下文并开始影响您实际上不想要的组件很容易...

另一个问题(除了MadProgrammer发布的问题之外)是您将组件添加到JFrame本身。

您应该将内容添加到框架的内容窗格中,可以通过调用JFrame.getContentPane()获得该内容。

例:

JFrame f = new JFrame("Test");
Container c = f.getContentPane();
c.add(new JButton("In Center"), BorderLayout.CENTER);
c.add(new JButton("At the Bottom"), BorderLayout.SOUTH);
c.add(new JButton("At the Top"), BorderLayout.NORTH);
c.add(new JButton("On the Left"), BorderLayout.WEST);
c.add(new JButton("On the Right"), BorderLayout.EAST);

您可以通过调用JFrame.setContentPane()来设置/更改内容面板。 默认的内容面板已经具有BorderLayout因此您甚至不需要更改它或设置新面板。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM