使用单选按钮侦听器时,两个标签相互重叠

时间:2015-01-20 14:24:48

标签: java swing awt

我做了一个简单的程序,其中有两个单选按钮,每个按钮都有一个动作监听器。 按下第一个按钮后,会打印一个标签,另一个会发生同样的事情。 问题是按下第一个和第二个按钮后两个标签重叠。

编辑 - 必须删除上一个标签,然后必须在屏幕上显示新标签 前 -

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

class ckbxdm{
    JFrame frame;
    JRadioButton r1,r2;
    ButtonGroup grp;
    JLabel l1,l2;

    void box(){
        frame=new JFrame("Hello");
        r1=new JRadioButton("Login");
        r2=new JRadioButton("Signup");
        grp=new ButtonGroup();
        grp.add(r1);
        grp.add(r2);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(null);
        frame.getContentPane().add(r1);
        frame.getContentPane().add(r2);
        r1.setBounds(100,120,100,20);
        r2.setBounds(200,120,100,20);
        frame.setBounds(100,100,500,500);
        frame.setVisible(true);
        r1.addActionListener(new listener1());
        r2.addActionListener(new listener2());
    }
    class listener1 implements ActionListener{
        public void actionPerformed(ActionEvent ae){
            frame.getContentPane().repaint();
            frame.getContentPane().revalidate();
            l1=new JLabel("Login area");
            frame.getContentPane().add(l1);
            l1.setBounds(100,200,100,20);
        }
    }
    class listener2 implements ActionListener{
        public void actionPerformed(ActionEvent ae){
            frame.getContentPane().repaint();
            frame.getContentPane().revalidate();
            l2=new JLabel("Signup area");
            frame.getContentPane().add(l2);
            l2.setBounds(100,200,100,20);
        }
    }
    public void itemStateChanged(ItemEvent ie){
        frame.repaint();
    }
}
public class CheckboxDemo{
    public static void main(String args[]){
        ckbxdm obj=new ckbxdm();
        obj.box();
    }
}

2 个答案:

答案 0 :(得分:0)

尝试更改您的"注册位置"在X-Ycooridantes方向,让我们改变以下代码行l2.setBounds(100,200,100,20);

l2.setBounds(200,200,100,20);

l1将其更改为l1.setBounds(50,200,100,20);的方式相同 ,它肯定会起作用

答案 1 :(得分:0)

除了上面提供的答案之外,如果要隐藏其他标签,可以将其可见性设置为false并重新绘制父组件。您可以了解更多from here。请注意,此处调用revalidate方法是不必要的,因为您没有从层次结构中删除任何组件。

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

class ckbxdm{
    JFrame frame;
    JRadioButton r1,r2;
    ButtonGroup grp;
    JLabel l1,l2;

    void box(){
        frame=new JFrame("Hello");
        r1=new JRadioButton("Login");
        r2=new JRadioButton("Signup");
        grp=new ButtonGroup();
        grp.add(r1);
        grp.add(r2);

        l1=new JLabel("Login area");
        l1.setBounds(100,200,100,20);
        l1.setVisible(false);
        frame.getContentPane().add(l1);

        l2=new JLabel("Signup area");
        l2.setBounds(100,200,100,20);
        l2.setVisible(false);
        frame.getContentPane().add(l2);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(null);
        frame.getContentPane().add(r1);
        frame.getContentPane().add(r2);
        r1.setBounds(100,120,100,20);
        r2.setBounds(200,120,100,20);
        frame.setBounds(100,100,500,500);
        frame.setVisible(true);
        r1.addActionListener(new listener1());
        r2.addActionListener(new listener2());
    }
    class listener1 implements ActionListener{
        public void actionPerformed(ActionEvent ae){
            l2.setVisible(false);
            l1.setVisible(true);
            frame.getContentPane().repaint();

        }
    }
    class listener2 implements ActionListener{
        public void actionPerformed(ActionEvent ae){
            l1.setVisible(false);
            l2.setVisible(true);
            frame.getContentPane().repaint();
        }
    }
    public void itemStateChanged(ItemEvent ie){
        frame.repaint();
    }
}
public class CheckboxDemo{
    public static void main(String args[]){
        ckbxdm obj=new ckbxdm();
        obj.box();
    }
}