2012-10-18 3 views
2

그래서 지금까지 45 분 동안 작업 해 왔는데 왜 그렇게 간단한 것이 작동하지 않는지 알 수 없습니다. 나는 꽤 복잡한 GUI를 가지고 있으며 원하는대로 레이아웃에서 모든 것을 얻었지만, JListJCheckBoxes으로 만들려고했지만 완전히 작동하지 않았습니다.GUI에 JCheckBox를 넣으려고합니다.

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

[렌더러의 개념] : // docs.oracle.com/javase/tutorial/uiswing/components/table.html#ed itrender)는 스윙 구성 요소를 나타내는 모든 컬렉션에 대해 보유합니다 – kleopatra

답변

2
  1. JFrame 클래스를 불필요하게 확장하지 마십시오.
  2. 모든 구성 요소에 이 추가되기 전에 JFrame#setVisible(true)으로 전화하지 마십시오.
  3. 사용 이벤트 디스패치 스레드/UI 구성 요소
  4. 당신이 외부 JPanel을 추가 한 다음 나는 그 당신이하고 싶었던 것을 생각 해달라고 위에 JScrollPane를 추가하기위한 Intial 스레드?

나는 JList에서 JCheckBox을 렌더링하기 위해 사용자 정의 ListCellRenderer을 사용하는 당신을 위해 함께 간단한 예제를 넣을 수 있었다. 또한 JCheckBox의 확인 및 선택 취소를 할 수 있도록 MouseAdapter을 사용

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; 
    } 
} 

참조 : (HTTP

+1

a) checkBox 영역 (텍스트가 아닌)에서 mouseEvent가 발생하는 경우에만 선택 가능한 선택 상태를 변경하려는 경우 b) 모델이 변경 사항을 수신 할 수 있도록 체크 가능한 값을 확인할 수 있어야합니다. c) b)를 사용하여 수동으로 다시 칠할 필요가 없습니다. – kleopatra

+1

어, JCheckBoxes를 ScrollPane에 넣는 것을 인식하지 못했습니다. 그러나 도움과 조언을 해주셔서 너무 감사드립니다. 실제 GUI를 조금 더 정리해야합니다. 그러나 CheckListRenderer의 getListCellRendererComponent는 기본적으로 체크 상자를 표시하는 것입니다. – Keegan

+0

@Keegan 나도 그렇지만 그렇습니다 (이것은 JList에서 스윙 구성 요소를 표시 할 때만 적용됩니다). 그리고 제가 도와 줘서 고마워요. 그리고 예'getListCellRendererComponent'는 기본적으로 어떻게 보이게합니까? –