2012-07-27 94 views
1

有一個名爲「一個」和另一個名爲「兩個」的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); 
    } 
} 

回答

2

您應該重新驗證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