2012-10-18 90 views
2

所以我一直在爲此工作45分鐘,而我似乎無法弄清楚爲什麼這麼簡單的東西無法正常工作。我有一個非常複雜的圖形用戶界面(GUI),並且按照我想要的方式獲得了佈局中的所有內容,但是當我試圖製作JListJCheckBoxes時,它完全無法工作。所以,我簡化我的問題,這個測試類在這裏,也許我做一些非常愚蠢的,但這裏是我的代碼:試圖把一個JCheckBox放在一個GUI中

import java.awt.BorderLayout; 
import javax.swing.JCheckBox; 
import javax.swing.JFrame; 
import javax.swing.JList; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
public class TestGUI extends JFrame{ 
    public TestGUI(){ 
     setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     setVisible(true); 
     setTitle("TEST"); 
     JPanel outside = new JPanel(); 
     add(outside); 
     outside.setLayout(new BorderLayout()); 
     JList<JCheckBox> checks = new JList<JCheckBox>(); 
     JCheckBox c = new JCheckBox("Check"); 
     checks.add(c); 
     JScrollPane t = new JScrollPane(checks); 
     add(t, BorderLayout.CENTER); 
     pack(); 
    } 
    public static void main(String[] args) { 
     new TestGUI(); 
    } 
} 

當我運行出現GUI沒什麼...只是空的空間,沒有複選框。 ...

+1

(HTTP [渲染器的概念]:// docs.oracle.com/javase/tutorial/uiswing/components/table.html#ed itrender)適用於顯示Swing組件的所有集合 – kleopatra

回答

2
  1. 不必擴展JFrame類。
  2. 在添加所有組件之前,請勿撥打JFrame#setVisible(true)
  3. 使用事件分派線程/對UI組件
  4. 添加JPanel外面,然後對 我不認爲這是你想要做什麼的頂部添加JScrollPane INTIAL主題?

我能夠把一個簡單的例子給你它使用傳統ListCellRenderer呈現在JListJCheckBox。它還使用MouseAdapter以允許JCheckBox檢查和取消選中:

enter image description here

import java.awt.BorderLayout; 
import java.awt.Component; 
import java.awt.Rectangle; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import javax.swing.JCheckBox; 
import javax.swing.JFrame; 
import javax.swing.JList; 
import javax.swing.JScrollPane; 
import javax.swing.ListCellRenderer; 
import javax.swing.ListSelectionModel; 
import javax.swing.SwingUtilities; 
import javax.swing.UIManager; 

public class JListTest { 

    public JListTest() { 
     JFrame frame = new JFrame(); 
     frame.setTitle("JList Test"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     initComponents(frame); 

     frame.pack(); 
     frame.setVisible(true); 
    } 

    private void initComponents(JFrame frame) { 
     String[] strs = {"swing", "home", "basic", "metal"}; 

     final JList checkBoxesJList = new JList(createData(strs)); 
     checkBoxesJList.setCellRenderer(new CheckListRenderer()); 
     checkBoxesJList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 

     checkBoxesJList.addMouseListener(new MouseAdapter() { 
      public void mouseClicked(MouseEvent e) { 
       int index = checkBoxesJList.locationToIndex(e.getPoint()); 
       CheckableItem item = (CheckableItem) checkBoxesJList.getModel().getElementAt(index); 
       item.setSelected(!item.isSelected()); 
       Rectangle rect = checkBoxesJList.getCellBounds(index, index); 
       checkBoxesJList.repaint(rect); 
      } 
     }); 

     JScrollPane scrollPane = new JScrollPane(checkBoxesJList); 
     frame.add(scrollPane, BorderLayout.CENTER); 
    } 

    private CheckableItem[] createData(String[] strs) { 
     int n = strs.length; 
     CheckableItem[] items = new CheckableItem[n]; 
     for (int i = 0; i < n; i++) { 
      items[i] = new CheckableItem(strs[i]); 
     } 
     return items; 
    } 

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

class CheckListRenderer extends JCheckBox implements ListCellRenderer { 

    public CheckListRenderer() { 
     setBackground(UIManager.getColor("List.textBackground")); 
     setForeground(UIManager.getColor("List.textForeground")); 
    } 

    @Override 
    public Component getListCellRendererComponent(JList list, Object value, 
      int index, boolean isSelected, boolean hasFocus) { 
     setEnabled(list.isEnabled()); 
     setSelected(((CheckableItem) value).isSelected()); 
     setFont(list.getFont()); 
     setText(value.toString()); 
     return this; 
    } 
} 

class CheckableItem { 

    private String str; 
    private boolean isSelected; 

    public CheckableItem(String str) { 
     this.str = str; 
     isSelected = false; 
    } 

    public void setSelected(boolean b) { 
     isSelected = b; 
    } 

    public boolean isSelected() { 
     return isSelected; 
    } 

    @Override 
    public String toString() { 
     return str; 
    } 
} 

參考:

+1

a)當鼠標事件發生在checkBox區域(而不是文本)時,您只想更改可檢查的選定狀態b)可檢查應該可觀察,以便模型可以偵聽其更改c)與b)的地方,將不需要手動調用repaint – kleopatra

+1

呵呵,我沒有意識到把JCheckBoxes放入一個ScrollPane那麼介入。但非常感謝你的幫助和提示,我一定會清理我的實際GUI更多一點。還有一個問題,您的CheckListRenderer的getListCellRendererComponent,是基本上使複選框出現? – Keegan

+0

@Keegan我既不,但它是(這僅適用於在JList中顯示擺動組件時)並且非常感謝您的幫助。是的'getListCellRendererComponent'基本上是什麼讓它出現:) –