2017-08-28 154 views
0

在我的JPanel我有兩個JScrollPane代表JListJScrollPane的大小取決於JList的內容

問題是,當啓動程序時,兩個列表都是空的,它們的大小是相同的。但是當他們中的一個在開始時有一些價值時,其規模正在發生變化。

如何避免它?

我正在使用GridBagLayout,但不管我設置的約束對我的滾動窗格沒有影響。

這是它看起來像空JList的樣子。

而且在JList中

gb.gridx = 1; 
gb.gridy = 0; 
gb.fill = GridBagConstraints.NONE; 
add(scroll, gb); 

gb.gridx ++; 
gb.anchor = GridBagConstraints.CENTER; 
gb.fill = GridBagConstraints.NONE; 
add(scroll2, gb); 

一些值的例子有沒有人任何想法如何正確設置它?

+1

爲了更好地提供幫助,請發佈[MCVE]或[簡短,獨立,正確的示例](http://www.sscce.org/)。 –

+1

您可以使用[JList#getPreferredScrollableViewportSize()](https://docs.oracle.com/javase/7/docs/api/javax/swing/JList.html#getPreferredScrollableViewportSize()) – mKorbel

回答

3

但是當它們中的一個在開始時具有一些值時,其大小正在改變。如何避免它?我

當您創建JList中,你可以使用:

list.setVisibleRowCount(...); 

這將允許JList的計算是一致的首選大小甚至在列表中的數據發生變化。

+0

開始調試問題不幸的是,它不能按預期工作。具有值的JList以不同的方式解釋給定的RowCount數量,而不是空的JList。而且這些列表的寬度也不同。 – up94up

+1

@ up94up,'這些列表的寬度也不同 - 讀取JList API。有兩種方法可以讓你控制單元的寬度/高度。一個將字符串作爲參數並計算單元格的寬度和高度。另一個接受int作爲參數並設置寬度。 – camickr

0

使用 scroll.setHorizo​​ntalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_​​ALWAYS); scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_​​ALWAYS);

scroll2.setHorizo​​ntalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_​​ALWAYS); scroll2.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_​​ALWAYS);

我希望這可以幫助你。

+0

請使用代碼格式設置代碼和代碼片段,結構化文檔(如HTML/XML或輸入/輸出)。爲此,請選擇文本並單擊郵件發佈/編輯表單頂部的「{}」按鈕。問題或答案的擁有者可以隨時編輯它。 –

+0

可悲的是,它不是。我認爲問題出現在Jlist開始的時候是空的。 – up94up

0

的JList#setVisibleRowCount(...)

工作正常,我在Windows 10使用JDK 1.8.0_141。

寬度

也許JList#setPrototypeCellValue(...)方法將起作用。

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

public class ListScrollPaneTest { 
    public JComponent makeUI() { 
    int visibleRowCount = 8; 
    String prototypeCellValue = "mmmmmmmmmmmmmmmmmmmm"; 

    String[] model1 = Collections.nCopies(20, "aaa").toArray(new String[0]); 
    JList<String> list1 = makeJList(visibleRowCount, prototypeCellValue, model1); 
    JScrollPane scroll1 = makeTitledScrollPane("Included Groups", list1); 

    String[] model2 = {"loooooooooooooooooooooooooooooooooooooooooooooong"}; 
    JList<String> list2 = makeJList(visibleRowCount, prototypeCellValue, model2); 
    JScrollPane scroll2 = makeTitledScrollPane("Excluded Groups", list2); 

    JPanel p = new JPanel(new GridBagLayout()); 
    p.setOpaque(true); 
    p.setBackground(Color.GRAY); 

    GridBagConstraints gb = new GridBagConstraints(); 
    gb.insets = new Insets(15, 15, 15, 15); 

    gb.gridx = 1; 
    gb.gridy = 0; 
    gb.fill = GridBagConstraints.NONE; 
    p.add(scroll1, gb); 

    gb.gridx ++; 
    gb.anchor = GridBagConstraints.CENTER; 
    gb.fill = GridBagConstraints.NONE; 
    p.add(scroll2, gb); 

    return p; 
    } 
    private static <E> JList<E> makeJList(int rowCount, E prototypeCellValue, E[] m) { 
    JList<E> list = new JList<>(m); 
    list.setVisibleRowCount(rowCount); 
    list.setPrototypeCellValue(prototypeCellValue); 
    return list; 
    } 
    private static JScrollPane makeTitledScrollPane(String title, JComponent c) { 
    JScrollPane scroll = new JScrollPane(c); 
    scroll.setBorder(BorderFactory.createTitledBorder(
         BorderFactory.createEmptyBorder(), title)); 
    return scroll; 
    } 
    public static void main(String... args) { 
    EventQueue.invokeLater(() -> { 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     f.getContentPane().add(new ListScrollPaneTest().makeUI()); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    }); 
    } 
}