2011-10-24 9 views

答えて

8

のための主な問題は、ラベルが、デフォルトでは非不透明であるということですので、あなたが塗られるバックグラウンドためにラベルを不透明にする必要があります。

ただし、カスタムレンダラーを作成する必要はありません。デフォルトのレンダラーは不透明です。あなたがする必要があるのは、リストの選択の背景プロパティを設定されています

list.setSelectionBackground(Color.RED); 

あなたは右のあなただけのデフォルトのレンダリングのプロパティを設定することができますし、テキストを整列するレンダラを作成しようとしている場合:

DefaultListCellRenderer renderer = (DefaultListCellRenderer)list.getCellRenderer(); 
renderer.setHorizontalAlignment(SwingConstants.RIGHT); 
6

enter image description here

import java.awt.*; 
import java.io.File; 
import javax.swing.*; 
import javax.swing.filechooser.FileSystemView; 

public class FilesInTheJList { 

    private static final int COLUMNS = 5; 
    private Dimension size; 

    public FilesInTheJList() { 
     final JList list = new JList(new File("C:\\").listFiles()) { 

      private static final long serialVersionUID = 1L; 

      @Override 
      public Dimension getPreferredScrollableViewportSize() { 
       if (size != null) { 
        return new Dimension(size); 
       } 
       return super.getPreferredScrollableViewportSize(); 
      } 
     }; 
     list.setFixedCellHeight(50); 
     list.setFixedCellWidth(150); 
     size = list.getPreferredScrollableViewportSize(); 
     size.width *= COLUMNS; 
     list.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); 
     list.setCellRenderer(new MyCellRenderer()); 
     list.setVisibleRowCount(0); 
     list.setLayoutOrientation(JList.HORIZONTAL_WRAP); 

     JFrame f = new JFrame("Files In the JList"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(new JScrollPane(list)); 
     f.pack(); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       FilesInTheJList fITJL = new FilesInTheJList(); 
      } 
     }); 
    } 

    private static class MyCellRenderer extends JLabel implements ListCellRenderer { 

     private static final long serialVersionUID = 1L; 

     @Override 
     public Component getListCellRendererComponent(JList list, Object value, 
       int index, boolean isSelected, boolean cellHasFocus) { 
      if (value instanceof File) { 
       File file = (File) value; 
       setText(file.getName()); 
       setIcon(FileSystemView.getFileSystemView().getSystemIcon(file)); 
       if (isSelected) { 
        setBackground(Color.red); 
        setForeground(Color.blue); 
       } else { 
        setBackground(list.getBackground()); 
        setForeground(list.getForeground()); 
       } 
       //setPreferredSize(new Dimension(250, 25)); 
       //setEnabled(list.isEnabled()); 
       setFont(list.getFont()); 
       setOpaque(true); 
      } 
      return this; 
     } 
    } 
} 
+3

だけ注意を:それは 'setOpaque(true)を持つことが重要です;'そこに、私はOPのレンダラが正しく動作しなかった理由それはだと思います。 – Jeffrey

+1

レンダラーでsetPreferredSize()またはsetEnabledを呼び出す必要はありません。また、setOpaque()メソッドはコンストラクタで呼び出される必要があります。レンダラーが呼び出されるたびに実行する必要はありません。また、JListには選択背景と前景を設定するプロパティがあります。これらの色をレンダラーでハードコーディングするべきではありません。 – camickr

+0

@camickr - 実際には、リストを無効にする必要がある場合はsetEnabled _is_が必要です。背景画像を表示する場合は、不透明度を設定します(無条件ではなくリストの値に設定する必要があります)。 – kleopatra

1

デフォルトではJLabelは透過です。あなたは、それがバックグラウンドを表示したい場合は、以下のものが必要です。

label.setOpaque(true); 

また、あなたは多くの場合、リスト自体のUIのテーマやカスタマイズに収まる親リストのデフォルトの背景色を、使用したい:

if (isSelected) { 
    label.setForeground(list.getSelectionForeground()); 
    label.setBackground(list.getSelectionBackground()); 
} else { 
    label.setForeground(list.getForeground()); 
    label.setBackground(list.getBackground()); 
} 

はすべて一緒にそれを置く:

import javax.swing.*; 
import java.awt.*; 

public class CustomListCellRenderer implements ListCellRenderer<MyObject> 
{ 
    @Override 
    public Component getListCellRendererComponent(JList<? extends MyObject> list, 
                MyObject value, 
                int index, 
                boolean isSelected, 
                boolean cellHasFocus) 
    { 
     JLabel label = new JLabel(); 
     label.setOpaque(true); 
     label.setText(value.getName()); 
     if (isSelected) { 
      label.setForeground(list.getSelectionForeground()); 
      label.setBackground(list.getSelectionBackground()); 
     } else { 
      label.setForeground(list.getForeground()); 
      label.setBackground(list.getBackground()); 
     } 
     return label; 
    } 
} 
関連する問題