2014-09-24 3 views
0

나는 JList를 사용하는 방법을 알아 내려고 노력해 왔으며 객체를 내 GUI에 표시하는 것처럼 느껴진다.JList에 개체가 표시되지 않습니까?

나는 JList에 추가하기 위해 노력하고있어 및 그냥 보여줄 것 나던 것을 그리기라는 클래스가있다 .. 크게 여기

을 감상 할 수있다 어떤 도움 내 코드입니다 :

public class DrawingDisplayer extends JPanel implements ActionListener, ListSelectionListener { 
JLabel title; 
JButton draw,pause,clear, 
     open,close, 
     lines,background; 
JSlider speedSlider; 
JProgressBar progress; 
Drawing drawing; 
JFileChooser chooser; 
JList fileList; 
DefaultListModel listModel; 
JPanel drawPanel; 
JScrollPane scrollPane; 

public DrawingDisplayer(){ 

    title = new JLabel("The Drawing Displayer"); 
    title.setHorizontalAlignment(JLabel.CENTER); 
    title.setFont(new Font("Serif", Font.BOLD, 24)); 

    draw = new JButton("Draw"); 
    pause = new JButton("Pause"); 
    clear = new JButton("Clear"); 
    speedSlider = new JSlider(); 
    progress = new JProgressBar(); 

    open = new JButton("Open Drawing"); 
    close = new JButton("Close Drawing");  

    listModel = new DefaultListModel();  
    fileList = new JList(listModel); 
    fileList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
    fileList.addListSelectionListener(this); 
    fileList.setVisibleRowCount(10); 
    scrollPane = new JScrollPane(fileList); 
    scrollPane.setPreferredSize(new Dimension(200,250)); 

    lines = new JButton("Lines"); 
    background = new JButton("Background"); 

    setLayout(new BorderLayout());  

    //Draw Panel 
    drawPanel = new JPanel(); 
    drawPanel.setBorder(BorderFactory.createTitledBorder("Drawing Area")); 


    //Drawing Speed 
    JPanel drawSpeed = new JPanel();   
     drawSpeed.setPreferredSize(new Dimension(300,200)); 
     drawSpeed.setBorder(BorderFactory.createTitledBorder("Drawing Speed")); 
     drawSpeed.add(draw); 
     drawSpeed.add(pause); 
     drawSpeed.add(clear); 
     drawSpeed.add(speedSlider); 
     drawSpeed.add(progress); 

    //File Options 
    JPanel fileOptions = new JPanel(); 
     fileOptions.setPreferredSize(new Dimension(300,350)); 
     fileOptions.setBorder(BorderFactory.createTitledBorder("File Options")); 

     open.addActionListener(this); 
     close.addActionListener(this); 

     fileOptions.add(open); 
     fileOptions.add(close); 
     fileOptions.add(fileList); 
     fileOptions.add(scrollPane); 
    //Colour Options. 
    JPanel colourOptions = new JPanel();   
     colourOptions.setPreferredSize(new Dimension(300,200)); 
     colourOptions.setBorder(BorderFactory.createTitledBorder("Colour Options")); 
     colourOptions.add(lines); 
     colourOptions.add(background); 

    //Control Panel 
    JPanel controlPanel = new JPanel(); 
     controlPanel.setPreferredSize(new Dimension(325,200)); 

     controlPanel.add(drawSpeed); 
     controlPanel.add(fileOptions); 
     controlPanel.add(colourOptions); 
     chooser = new JFileChooser("."); 

    add(title, BorderLayout.NORTH); 
    add(controlPanel,BorderLayout.WEST); 
    add(drawPanel,BorderLayout.CENTER); 

} 

    public void actionPerformed(ActionEvent e) { 
      if(e.getSource() == open){ 
       chooser = new JFileChooser("."); 
       if(chooser.showOpenDialog(null) == chooser.APPROVE_OPTION){ 
         drawing = new Drawing(chooser.getSelectedFile()); 
         fileList.add(drawing); 
         listModel.addElement("test"); 

       } 
      } 
      else if (e.getSource() == close){ 

      } 
     } 

    public void valueChanged(ListSelectionEvent e) { 


    } 

public static void main(String[] args){ 

    DrawingDisplayer panel = new DrawingDisplayer(); 
    JFrame frame = new JFrame("drawing"); 
    frame.getContentPane().add(panel);  
    frame.pack(); 
    frame.setVisible(true); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
} 



} 

enter image description here

답변

3

구성 요소가 단일 컨테이너에만있을 수 있다는 점을 이해해야 문제를 이해할 수 있습니다. 단 하나의 상위 컨테이너 만 가질 수 있습니다.

다른 컨테이너에 구성 요소를 추가하려고하면 해당 구성 요소가 다른 컨테이너에 추가되기 전에 제거되고 두 번째 컨테이너에 추가됩니다.

그래서, 코드에서 당신이 ...

fileList = new JList(listModel); 
//... 
// Add fileList as the view for the scrollpane... 
scrollPane = new JScrollPane(fileList); 
scrollPane.setPreferredSize(new Dimension(200, 250)); 

//... 
// Remove fileList from the scrollpane and add it to fileOptions... 
fileOptions.add(fileList); 
fileOptions.add(scrollPane); 

는 ... 그래서, 기본적으로, 당신은 잘 시작하지만, scrollPane에서 fileList를 제거하고 fileOptions에 추가 결국했습니다 대신에, 당신은 그것을 예상대로

당신도 할 수 있습니다 ... (현재 비어 있음)뿐만 아니라 fileOptions-scrollPane ...

fileOptions.add(fileList);를 제거하고 작동합니다 추가 Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?을보십시오. 당신은 천재 야 OMG

당신은 ... setVisibleRowCount 적절한 셀 렌더링 같은 것들을 사용하여

+0

JScrollPane의 크기를 제어 할 수 있습니다! 이걸 알아 내려고 벽에 머리를 대고 있었어 ... 고마워 !!! – Pixelidiot

+1

실제로''Test "'가 표시되었고, 어디에 있어야하는지는 알지 못했습니다 ... JList와 JScrollPane이 어떻게 사용되었는지 살펴 보도록하겠습니다. 그렇습니다. 이 일을 직접 해보았습니다 : P – MadProgrammer

+0

이봐, 그리기 개체를 추가하려고하면 표시되지 않습니다. "테스트"만 제대로 표시되는 것 같습니다. 오, 나는 "fileList.add (drawing);"를 변경했습니다. ~ "listModel.add (그림);" – Pixelidiot

0

ListModel에 추가 된 개체의 기본 렌더링은 개체의 toString()을 간단히 표시하는 것입니다.

사용자 지정 개체를 추가하는 경우 사용자 지정 렌더러를 제공해야합니다. 이 개념에 대한 자세한 내용은 How to Use Lists에있는 스윙 튜토리얼의 섹션, 특히 Writing a Custom Cell Renderer에 대한 섹션을 읽어보십시오.

관련 문제