2015-05-02 13 views
0

在我一直在研究的項目中,我注意到,在JScrollPane/JList被點擊之前,我的JScrollPane中的所有JList項目都是隱藏的。怪異的部分是它沒有完全覆蓋。這個白色盒子有一個透明的邊框,覆蓋整個東西,覆蓋所有邊緣上的所有像素。JList中的組件被白方隱藏直到點擊

圖片:

正如你所看到的,在中間這個白色塊狀 - 請注意粉色「邊界」:

before click

現在,當我點擊白色框,它消失:

after click

我知道紅色看起來可怕,但我使用它的對比度。

這引起我對我的問題:我如何擺脫那個討厭的白盒子?

這裏是我的代碼:

public static void listJars(File f) 
{ 
    JCheckBox firstBox = null; 
    DefaultListModel<JCheckBox> model = new DefaultListModel<>(); 
    if(mainGUI.checkList != null) 
    { 
     //System.out.println("Already exists lol: " + mainGUI.checkList.getName()); 
     mainGUI.pluginList.remove(mainGUI.checkList); 
    } 
    //mainGUI.pluginList.repaint(); 

    File[] files = new File(f.getPath()).listFiles(); 
    if (files != null) 
    { 
     for (File file : files) 
     { 
      if (file.getName().endsWith(".jar") || file.getName().endsWith("._jar")) 
      { 
       JCheckBox cb = new JCheckBox(file.getName()); 

       if(firstBox == null) 
       { 
        firstBox = cb; 
       } 

       cb.setSelected(file.getName().endsWith(".jar")); 
       cb.setVisible(true); 
       cb.setText(file.getName()); 
       model.addElement(cb); 
       cb.repaint(); 
      } 
     } 
    } 

    JCheckBoxList jCheckBoxList = new JCheckBoxList(model, mainGUI.textField1.getText()); 
    jCheckBoxList.setName("pluginCheckboxList"); 
    jCheckBoxList.setSize(mainGUI.pluginList.getSize()); 
    mainGUI.pluginList.add(jCheckBoxList); 
    mainGUI.checkList = jCheckBoxList; 
    jCheckBoxList.setVisible(true); 
    jCheckBoxList.setVisibleRowCount(10); 
} 

而在十有我的JCheckBoxList類。

package Components; 

import javax.swing.*; 
import javax.swing.border.Border; 
import javax.swing.border.EmptyBorder; 
import java.awt.*; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.io.File; 

@SuppressWarnings("serial") 
public class JCheckBoxList extends JList<JCheckBox> 
{ 
    protected static Border noFocusBorder = new EmptyBorder(1, 1, 1, 1); 
    protected String lastPath; 

    public JCheckBoxList(final String lastPath) 
    { 
     this.lastPath = lastPath; 
     setCellRenderer(new CellRenderer()); 
     setBackground(Color.magenta); 
     addMouseListener(new MouseAdapter() 
     { 
      public void mousePressed(MouseEvent e) 
      { 
       int index = locationToIndex(e.getPoint()); 
       if (index != -1) 
       { 
        JCheckBox checkBox = getModel().getElementAt(index); 
        checkBox.setSelected(!checkBox.isSelected()); 
        repaint(); 

        final String oldname = checkBox.getText(); 
        if (!checkBox.isSelected()) 
        { 
         checkBox.setName(checkBox.getText().substring(0, checkBox.getText().length() - 4) + "._jar"); 
        } 
        else 
        { 
         checkBox.setName(checkBox.getText().substring(0, checkBox.getText().length() - 5) + ".jar"); 
        } 
        System.out.println("Changed! Sel: " + checkBox.isSelected() + ", Name: " + checkBox.getName()); 
        checkBox.setText(checkBox.getName()); 
        String base = new File(lastPath).getParent() + "/plugins/"; 
        boolean rename = new File(base + oldname).renameTo(new File(base + checkBox.getText())); 
       } 
      } 
     }); 
     setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
    } 

    public JCheckBoxList(ListModel<JCheckBox> model, String lastPath) 
    { 
     this(lastPath); 
     setModel(model); 
    } 

    protected class CellRenderer implements ListCellRenderer<JCheckBox> 
    { 
     public Component getListCellRendererComponent(
       JList<? extends JCheckBox> list, JCheckBox value, int index, 
       boolean isSelected, boolean cellHasFocus) 
     { 
      //Drawing checkbox, change the appearance here 
      value.setBackground(isSelected ? getSelectionBackground() 
        : getBackground()); 
      value.setForeground(isSelected ? getSelectionForeground() 
        : getForeground()); 
      value.setEnabled(isEnabled()); 
      value.setFont(getFont()); 
      value.setFocusPainted(false); 
      value.setBorderPainted(true); 
      value.setBorder(BorderFactory.createEmptyBorder(0, 10, 5, 0)); 
      return value; 
     } 
    } 
} 

再有就是我的滾動面板,它具有這些設置(使用Intelliji IDEA UI設計師):

pluginList - JScrollPane

任何想法?

+1

爲了更快得到更好的幫助,請發佈[MCVE](http://stackoverflow.com/help/mcve)(最小完整可驗證示例)或[SSCCE](http://www.sscce.org/)(Short ,獨立,正確的例子)。 –

回答

2
mainGUI.pluginList.add(jCheckBoxList); 
mainGUI.checkList = jCheckBoxList; 
jCheckBoxList.setVisible(true); 
jCheckBoxList.setVisibleRowCount(10); 

在我看來,你是動態地將組件添加到可見的GUI。

當你這樣做的基本代碼是:

panel.add(...); 
panel.revalidate(); 
panel.repaint(); 

應設置visibleRowCount的()上面的代碼之前執行。

另外:

  1. Swing組件是可見的默認,所以你不需要setVisible(true)
  2. 您可能想考慮使用一列JTable,因爲它已經支持複選框渲染器和編輯器。

編輯:

我給你上面的解決方案是通用的解決方案。滾動窗格是不同的,你應該只添加一個組件到視口。根據您的不正確的解決方案

,你應該使用:

//mainGUI.pluginList.add(jCheckBoxList); 
mainGUI.pluginList.setViewportView(jCheckBoxList); 

只張貼代碼的一些隨機行的問題是,我們不知道代碼的完整的上下文。我沒有意識到「pluginList」實際上是一個滾動窗格。通常變量名稱將具有名稱中的滾動或滾動窗格。

+0

我會試試這個。我使用JCheckboxList的原因是因爲我最終可能需要使用其他的東西。 – ColonelHedgehog

+0

'我使用JCheckboxList的原因是因爲我最終可能需要使用其他東西 - - 這使得更不合理。爲什麼你會花時間創建一個你甚至不會使用的自定義組件。保持代碼簡單。 – camickr

+0

對不起,我的意思是一個JCheckboxList是因爲它提供了我將來可能需要的靈活性。措辭失敗。 – ColonelHedgehog

0
mainGUI.pluginList.setViewportView(mainGUI.checkList); // pluginList is the JScrollPane. 

這樣做,它修復了一切!把它放在我的listJars方法中。

+0

因此,爲什麼我編輯了我自己的...我意識到我犯的錯誤,並在之後不久更新。 – ColonelHedgehog

+1

由於刪除了不正確的解決方案,因此刪除了投票反對。然而看着你的代碼,我仍然不喜歡你使用「mainGUI.checkList」來訪問組件。你的代碼只是創建JList,所以爲什麼不使用JList變量。另外,你不應該直接訪問組件。你應該有像mainGUI.getList()或mainGUI.getScrollPane()這樣的方法。你也不需要創建一個新的JList。您可以使用JList.setModel(...)方法更新JList。最後,您不應該使用remove(...)方法從滾動窗格中刪除列表。 – camickr

+0

謝謝,聽起來不錯。我對JSwing的風格以及其中的最佳實踐很陌生。 – ColonelHedgehog