java - 如何通过 ItemListener 更改 Flowlayout

标签 java awt flowlayout

我无法使用分组复选框来更改 FlowLayout 的对齐方式。 我确定选中该复选框将进入“itemStateChanged”方法,但是 .setAlignment() 或 .setLayout() 都不起作用! 有什么方法可以解决这个问题吗? 谢谢。

import java.awt.*;
import java.awt.event.*;
public class flowlayout
{
static Checkbox cb1 = new Checkbox("Left");
static Checkbox cb2 = new Checkbox("Center");
static Checkbox cb3 = new Checkbox("Right");    
static Frame frm = new Frame("Frame Title");    

public static void main(String args[])  {
    frm.setLayout(new FlowLayout());
    CheckboxGroup cg = new CheckboxGroup();
    cb1.setCheckboxGroup(cg);
    cb2.setCheckboxGroup(cg);
    cb3.setCheckboxGroup(cg);       
    cb1.addItemListener(new ItmLis());
    cb2.addItemListener(new ItmLis());
    cb3.addItemListener(new ItmLis());      
    frm.setSize(400,200);
    frm.add(cb1);
    frm.add(cb2);
    frm.add(cb3);   
    frm.setVisible(true);       
}   

static class ItmLis implements ItemListener
{
    public void itemStateChanged(ItemEvent e)
    {
        if(cb1.getState()==true)
        {
            frm.setLayout(new FlowLayout(FlowLayout.LEFT));
        }
        else if(cb2.getState())
        {
            frm.setLayout(new FlowLayout(FlowLayout.CENTER));
        }
        else if(cb3.getState())
        {
            frm.setLayout(new FlowLayout(FlowLayout.RIGHT));
        }
    }
}
}

最佳答案

  • LayoutManager 尚未实现任何、部分或整个容器有重新布局的通知程序

  • 必须通过container.validate()通知LayoutManager;和container.repaint(); (在 Java7 中也对 JFrame 使用 revalidate())

  • 必须通过添加 WindowKistener 来终止当前 JVM 实例(仅覆盖那里的终止 JVM)

  • 在史前 AWT 上使用 Swing

AWT版本

import java.awt.*;
import java.awt.event.*;
import javax.swing.SwingUtilities;

public class MyFlowLayout {

    static Checkbox cb1 = new Checkbox("Left");
    static Checkbox cb2 = new Checkbox("Center");
    static Checkbox cb3 = new Checkbox("Right");
    static Frame frm = new Frame("Frame Title");

    public MyFlowLayout() {
        frm.setLayout(new FlowLayout());
        CheckboxGroup cg = new CheckboxGroup();
        cb1.setCheckboxGroup(cg);
        cb2.setCheckboxGroup(cg);
        cb3.setCheckboxGroup(cg);
        cb1.addItemListener(new ItmLis());
        cb2.addItemListener(new ItmLis());
        cb3.addItemListener(new ItmLis());
        frm.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        frm.setSize(400, 200);
        frm.add(cb1);
        frm.add(cb2);
        frm.add(cb3);
        frm.setVisible(true);
    }

    public static void main(String args[]) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                MyFlowLayout fs = new MyFlowLayout();
            }
        });
    }

    private class ItmLis implements ItemListener {

        @Override
        public void itemStateChanged(ItemEvent e) {
            if (cb1.getState() == true) {
                frm.setLayout(new FlowLayout(FlowLayout.LEFT));
                validateLayout();
            } else if (cb2.getState()) {
                frm.setLayout(new FlowLayout(FlowLayout.CENTER));
                validateLayout();
            } else if (cb3.getState()) {
                frm.setLayout(new FlowLayout(FlowLayout.RIGHT));
                validateLayout();
            }
        }

        public void validateLayout() {
            frm.validate();
            frm.repaint();
        }
    }
}

Swing 版本

import java.awt.*;
import java.awt.event.*;
import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JRadioButton;
import javax.swing.SwingUtilities;

public class MyFlowLayout {

    static JRadioButton cb1 = new JRadioButton("Left");
    static JRadioButton cb2 = new JRadioButton("Center");
    static JRadioButton cb3 = new JRadioButton("Right");
    static JFrame frm = new JFrame("Frame Title");

    public MyFlowLayout() {
        frm.setLayout(new FlowLayout());
        ButtonGroup cg = new ButtonGroup();
        cg.add(cb1);
        cg.add(cb2);
        cg.add(cb3);
        cb1.addItemListener(new ItmLis());
        cb2.addItemListener(new ItmLis());
        cb3.addItemListener(new ItmLis());
        frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // or WindowListener too
        /*frm.addWindowListener(new WindowAdapter() {
         @Override
         public void windowClosing(WindowEvent e) {
         System.exit(0);
         }
         });*/
        frm.setSize(400, 200);
        frm.add(cb1);
        frm.add(cb2);
        frm.add(cb3);
        frm.setVisible(true);
    }

    public static void main(String args[]) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                MyFlowLayout fs = new MyFlowLayout();
            }
        });
    }

    private class ItmLis implements ItemListener {

        @Override
        public void itemStateChanged(ItemEvent e) {
            if (cb1.isSelected() == true) {
                frm.setLayout(new FlowLayout(FlowLayout.LEFT));
                validateLayout();
            } else if (cb2.isSelected() == true) {
                frm.setLayout(new FlowLayout(FlowLayout.CENTER));
                validateLayout();
            } else if (cb3.isSelected() == true) {
                frm.setLayout(new FlowLayout(FlowLayout.RIGHT));
                validateLayout();
            }
        }

        public void validateLayout() {
            frm.validate();
            frm.repaint();
        }
    }
}

关于java - 如何通过 ItemListener 更改 Flowlayout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18314434/

相关文章:

Android FlowLayout 作为 RecyclerView LayoutManager

java - 计算需要将数字添加到坐标才能改变下限值的次数

java - 为什么按钮在流布局上会离开屏幕?

java - Vaadin 8 组合框实现之前(!)下拉事件?

java - 32 位灰度 BufferedImage?

java - 小程序不显示任何内容

JSplitPane 中的 Java JScrollPane 不起作用

java - 如何让 FlowLayout 在调整大小时重新定位组件。

java - 使用 SWT 最小化到托盘

java - 使用 jna 获取 IShellFolder