2012-10-18 48 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'基本上是什么让它出现:) –