【问题标题】:Java GUI Action Event to change layout用于更改布局的 Java GUI 操作事件
【发布时间】:2016-05-02 08:48:02
【问题描述】:

我正在尝试解决一个问题,即我有一些按钮和一个底部面板“FlowLayout”、“BorderLayout”、“GridLayout”来切换顶部按钮的布局。到目前为止,我这样做了,但它不起作用。需要一个解决方案。

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import static javax.swing.JFrame.EXIT_ON_CLOSE;

class Calculator extends JFrame implements ActionListener {

Container container;

JPanel p = new JPanel();
JPanel panelTop = new JPanel();
JButton b[] = new JButton[12];
JButton layoutButton[] = new JButton[3];
String sLayout[] = {"FlowLayout", "BorderLayout", "GridLayout"};
String s[] = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "11",    "12"};
String Screen = "";

public Calculator() {
    super("Calculator");
    container = getContentPane();
    for (int i = 0; i < sLayout.length; i++) {
        layoutButton[i] = new JButton(sLayout[i]);
        layoutButton[i].addActionListener(this);
        p.add(layoutButton[i]);
    }
    container.add(p, BorderLayout.SOUTH);

}//End Constructor

@Override
public void actionPerformed(ActionEvent event) {
    if (event.getSource() == layoutButton[2]) {
        panelTop.setLayout(new GridLayout(4, 4, 5, 5));
        for (int i = 0; i < s.length; i++) {
            b[i] = new JButton("Button " + s[i]);

            panelTop.add(b[i]);
        }

        container.add(panelTop, BorderLayout.NORTH);
    }
}

public static void main(String[] args) {
    Calculator calculator = new Calculator();
    calculator.setSize(500, 500);
    calculator.setVisible(true);
    calculator.setResizable(true);
    calculator.setLocationRelativeTo(null);
    calculator.setDefaultCloseOperation(EXIT_ON_CLOSE);
   }
}//end class

如果我可以让它为一个按钮工作,我相信我可以解决其余的问题。

【问题讨论】:

  • 在你更新的容器上调用 revalidate 和 repaint
  • 一个问题。如果我继续使用按钮,它会在顶部面板上重新添加我不想要的按钮。如何解决?
  • panelTop.removeAll?
  • @MadProgrammer,你为什么总是在 cmets 中给出答案?在它所属的地方给出正确答案只会增加你的声誉。
  • @Hackerdarshi 因为 1- 它是单线; 2- op 应该首先参考 JavaDocs 和教程; 3- 我真的不需要那么严重的代表(至少不是来自这么简单的问题)

标签: java swing


【解决方案1】:

在处理 Swing 布局时要记住的第一件事是,它们是惰性的。起初这似乎是一件坏事,但是当您开始添加/删除数十个组件时,您会意识到您实际上并不希望在完成所有更新之前验证布局。

验证容器层次结构并不是一件小事,所以你要做的越少越好。

基本上,一旦您对 UI 是最新的感到满意,您应该在您更改的容器上调用 revalidate,然后调用 repaint。由于布局管理的工作方式,容器层次结构也会更新

一个问题。如果我继续使用按钮,它会在顶部面板上重新添加我不想要的按钮。如何解决?

您确实应该更多地参考 JavaDocs,快速浏览 JPanel docs 会突出显示 removeAll 方法

【讨论】:

    【解决方案2】:

    感谢 MadProgrammer,您的回答是具体而线性的。真的很喜欢。这是完整的源代码。人们可能会来这里复制粘贴:D

    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    import static javax.swing.JFrame.EXIT_ON_CLOSE;
    
    public class Layout extends JFrame implements ActionListener {
    
    Container container;
    JPanel subPanel = new JPanel();
    JPanel panelBottom = new JPanel();
    FlowLayout flowLayout;
    
    JPanel panelTop = new JPanel();
    private static JButton b[] = new JButton[12];
    JButton layoutButton[] = new JButton[3];
    private static String sLayout[] = {"FlowLayout", "BorderLayout", "GridLayout"};
    private static String s[] = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"};
    String Screen = "";
    
    public Layout() {
        super("Layout");
        container = getContentPane();
    
        panelTop.setLayout(new BorderLayout(3, 4));
        for (int i = 0; i < s.length; i++) {
            b[i] = new JButton("Button " + s[i]);
    
            subPanel.add(b[i]);
        }
        panelTop.add(subPanel);
        container.add(panelTop, BorderLayout.CENTER);
        for (int i = 0; i < sLayout.length; i++) {
            layoutButton[i] = new JButton(sLayout[i]);
            layoutButton[i].addActionListener(this);
            panelBottom.add(layoutButton[i]);
        }
        container.add(panelBottom, BorderLayout.SOUTH);
    
    }//End Constructor
    
    @Override
    public void actionPerformed(ActionEvent event) {
        if (event.getSource() == layoutButton[2]) {//gridLayout
            panelTop.removeAll();
            panelTop.setLayout(new GridLayout(3, 4, 5, 15));
            for (int i = 0; i < s.length; i++) {
                b[i] = new JButton("Button " + s[i]);
    
                panelTop.add(b[i]);
            }
    
            container.add(panelTop, BorderLayout.NORTH);
            revalidate();
            repaint();
        }
        if (event.getSource() == layoutButton[0]) {//flowLayout
            panelTop.removeAll();
            subPanel.removeAll();
            flowLayout = new FlowLayout();
            panelTop.setLayout(flowLayout);
    
            for (int i = 0; i < s.length; i++) {
                b[i] = new JButton("Button " + s[i]);
    
                subPanel.add(b[i]);
            }
            flowLayout.setAlignment(FlowLayout.LEFT);
            flowLayout.layoutContainer(container);
            panelTop.add(subPanel);
            container.add(panelTop, BorderLayout.NORTH);
            revalidate();
            repaint();
        }
        if (event.getSource() == layoutButton[1]) {//BorderLayout
            panelTop.removeAll();
            subPanel.removeAll();
            panelTop.setLayout(new BorderLayout(3, 4));
            for (int i = 0; i < s.length; i++) {
                b[i] = new JButton("Button " + s[i]);
    
                subPanel.add(b[i]);
            }
            panelTop.add(subPanel);
            container.add(panelTop, BorderLayout.CENTER);
    
            revalidate();
            repaint();
          }
      }
    
    }//end class
    
    class LayoutTest {
    
        public static void main(String[] args) {
        Layout calculator = new Layout();
        calculator.setSize(900, 500);
        calculator.setVisible(true);
        calculator.setResizable(true);
        calculator.setLocationRelativeTo(null);
        calculator.setDefaultCloseOperation(EXIT_ON_CLOSE);
       }
     }
    

    【讨论】:

    • 你不应该鼓励人们复制粘贴。
    猜你喜欢
    • 2011-09-12
    • 2018-05-03
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多