设置JScrollPane可见/不可见通过JCheckBox不工作

问题描述:

有一个名为“一个”和另一个名为“两个”的JCheckBox。还有一个名为“sp”的JScrollPane。它是一个JTextArea。复选框的目的是隐藏和显示程序的某些部分。我简化了程序,在这里我沉闷地解释了为了确保你理解程序应该发生的事情。设置JScrollPane可见/不可见通过JCheckBox不工作

这是应该发生:

最初只有一个是可见的,它是未选中。每当一个被选中,两个应该被设置为可见。每当两个被选中时,sp应被设置为可见。当复选框未被选中时,相应的组件被设置为不可见。但是,当一个未选中时,sp也被设置为不可见。 (one controlls two and sp)。

问题:

一个被选择时,是可见的。但是,当选择两个时,sp不可见(应该是)。当一个未被选中时,两个被选中,两个是隐形的(这应该发生)。但是当一个被选中时,两个可见,并且突然sp现在可见。在此之后,该程序按照预期运行。

然而,这与其他JComponents(替代JScrollPane)一起使用。

什么可能是错的?

package tests; 

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

public class Checkboxscrollpane extends JPanel { 

    private JCheckBox one, two; 
    private JScrollPane sp; 

    private Checkboxscrollpane() { 
     Listener listener = new Listener(); 

     one = new JCheckBox(); 
     one.addActionListener(listener); 
     add(one); 

     two = new JCheckBox(); 
     two.addActionListener(listener); 
     add(two); 

     sp = new JScrollPane(new JTextArea("hello")); 
     add(sp); 

     one.setVisible(true); 
     two.setVisible(false); 
     sp.setVisible(false); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     one.setLocation(50, 50); 
     two.setLocation(70, 70); 
     sp.setLocation(90, 90); 
    } 

    private class Listener implements ActionListener { 

     public void actionPerformed(ActionEvent e) { 
      if (e.getSource() == one) { 
       two.setVisible(one.isSelected()); 
      } 
      sp.setVisible(one.isSelected() && two.isSelected()); 
     } 
    } 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     frame.setSize(300, 200); 
     frame.add(new Checkboxscrollpane()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 
} 

您应该重新验证Checkboxscrollpane面板。

但你不应该在每一个绘画事件设置组件的位置:

setLayout(null); 

    one.setSize(100, 20); 
    two.setSize(100, 20); 
    sp.setSize(100, 20); 
    one.setLocation(50, 50); 
    two.setLocation(70, 70); 
    sp.setLocation(90, 90); 

,并清除public void paintComponent(Graphics g) {方法。

+0

我这样做,因为我想在特定位置我的组件。做你说的使用默认面板布局来查找组件,这是我不想要的。 – Alan 2012-07-27 18:25:03

+0

并重新验证作品,谢谢 – Alan 2012-07-27 18:25:32

+0

是的我忘了添加行:'setLayout(null)' – Xeon 2012-07-27 18:29:36