[英]Java-Swing: A problem using layout managers!
我正在使用JDialog(用手,沒有GUI構建器),並且在布局時遇到問題。
我有這個:
我的問題是,我不知道如何分辨JList(在JScrollPane中)具有最大寬度,我使用了setSize,setMaximumSize,但沒有任何效果! 我需要JList的寬度為圖片大小的一半。
解釋布局:
“基因信息”是一個2x4的GridLayout,由包含BoxLayout的JPanel包含,+ /-JButtons也為BoxLayout,我之前所說的全部都位於BoxLayout中。 現在,“ Genes” JPanel是一個GridBagLayout。
我能做什么?
提前致謝!
PD:其他邊界僅用於識別組件的邊界。
Source Code:
scpGenesList.setViewportView(lstGenesList); pnlGeneInfo.setLayout(new GridLayout(4, 2, 10, 10)); pnlGeneInfo.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createTitledBorder("Gene Information"), BorderFactory.createEmptyBorder(10, 10, 10, 10))); lblGeneSymbol.setText("Symbol:"); lblGeneSymbol.setHorizontalAlignment(SwingConstants.RIGHT); lblGeneChromosome.setText("Chromosome:"); lblGeneChromosome.setHorizontalAlignment(SwingConstants.RIGHT); lblGeneStartPosition.setText("Start Position:"); lblGeneStartPosition.setHorizontalAlignment(SwingConstants.RIGHT); lblGeneStopPosition.setText("Stop Position:"); lblGeneStopPosition.setHorizontalAlignment(SwingConstants.RIGHT); pnlGeneInfo.add(lblGeneSymbol); pnlGeneInfo.add(lblGeneSymbolValue); pnlGeneInfo.add(lblGeneChromosome); pnlGeneInfo.add(lblGeneChromosomeValue); pnlGeneInfo.add(lblGeneStartPosition); pnlGeneInfo.add(lblGeneStartPositionValue); pnlGeneInfo.add(lblGeneStopPosition); pnlGeneInfo.add(lblGeneStopPositionValue); pnlGWASAddRemoveButtons.setLayout(new BoxLayout(pnlGWASAddRemoveButtons, BoxLayout.X_AXIS)); pnlGWASAddRemoveButtons.add(Box.createHorizontalGlue()); pnlGWASAddRemoveButtons.add(cmdGenesAdd); pnlGWASAddRemoveButtons.add(Box.createHorizontalStrut(10)); pnlGWASAddRemoveButtons.add(cmdGenesRemove); pnlGWASAddRemoveButtons.add(Box.createHorizontalGlue()); pnlGeneInfoButtons.setLayout(new BoxLayout(pnlGeneInfoButtons, BoxLayout.Y_AXIS)); pnlGeneInfoButtons.add(pnlGeneInfo); pnlGeneInfoButtons.add(Box.createVerticalStrut(10)); pnlGeneInfoButtons.add(pnlGWASAddRemoveButtons); pnlGenesPanel.setLayout(new GridBagLayout()); pnlGenesPanel.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createTitledBorder("Genes"), BorderFactory.createEmptyBorder(10, 10, 10, 10))); GridBagConstraints ctrGenes = new GridBagConstraints(); ctrGenes.fill = GridBagConstraints.BOTH; ctrGenes.gridx = 0; ctrGenes.gridy = 0; ctrGenes.gridwidth = 1; ctrGenes.gridheight = 1; ctrGenes.weighty = 1.0; ctrGenes.weightx = 1.0; ctrGenes.insets = new Insets(0, 0, 0, 10); pnlGenesPanel.add(scpGenesList, ctrGenes); GridBagConstraints ctrGenesInfoButton = new GridBagConstraints(); ctrGenesInfoButton.fill = GridBagConstraints.BOTH; ctrGenesInfoButton.gridx = 1; ctrGenesInfoButton.gridy = 0; ctrGenesInfoButton.gridwidth = 1; ctrGenesInfoButton.gridheight = 1; ctrGenesInfoButton.weighty = 1.0; ctrGenesInfoButton.weightx = 1.0; pnlGenesPanel.add(pnlGeneInfoButtons, ctrGenesInfoButton); contentPane.add(pnlGenesPanel); pack();
為什么不為“ Genes”面板提供2x1 GridLayout
? 那應該確保雙方的大小相同。
但是實際上,對我來說,給列表提供所有控件未占用的空間是更有意義的,因為那些控件需要固定的空間,而如果條目很寬,則列表可能會從其可以獲得的所有額外空間中受益。
為此,我將為“ Genes”面板提供BorderLayout
,將列表放在CENTER插槽中,將控件放在EAST插槽中。
按照@Michael Borgwardt的建議,讓列表增加,您可以使用setVisibleRowCount()
來生成方便的初始面板尺寸。 如果必要的話,您還可以檢查Dimension
由歸國getPreferredScrollableViewportSize()
其中“計算需要顯示視口的大小visibleRowCount
行。”
如果不查看此處的所有代碼,可能無法告訴您出了什么問題。 如果您有時間,我建議您看一看MigLayout 。 您可以將其與Swing&SWT結合使用,一旦了解,它就是一個功能強大的布局管理器恕我直言。
希望這有幫助,祝你好運。
它沒有回答您的問題-但是我發現JGoodies FormLayout比GridBagLayout更直觀。 該庫以及一些示例可以在這里找到:
我認為較早的解決方案都是有效的,並且就使用哪種布局管理器而言,它更像是一種編碼偏好。 根據您的要求,這里是僅適用於標准布局管理器(網格,網格包和邊框)的工作庫。 玩得開心,-MS。
導入java.awt。 ; 導入javax.swing。 ; 導入javax.swing.border。*;
公共類GeneDialog擴展了JDialog {
private String[] plusMinus = {"+","-"}, tfNames = {
"Symbol", "Chromosome", "Start position", "Stop position"},
listData = {"Gene01", "Gene02", "Gene03", "Gene04", "Gene05", "Gene06",
"Gene07", "Gene08", "Gene09", "Gene10", "Gene11", "Gene12"};
private JTextField[] gtField= new JTextField[tfNames.length];
private JList list = new JList (new DefaultListModel());
public GeneDialog (Frame f, String title) {
super (f, title, true);
Container cp = getContentPane();
cp.setLayout (new GridLayout(1,2));
JScrollPane listScrollPane = new JScrollPane (list);
listScrollPane.setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createTitledBorder("Genes"),
BorderFactory.createEmptyBorder(10, 10, 10, 10)));
DefaultListModel lm = (DefaultListModel) list.getModel();
for (int k = 0 ; k < listData.length ; k++)
lm.addElement (listData[k]);
cp.add (listScrollPane);
cp.add (controlPanel());
pack();
}
private GridBagConstraints makeGBC (int inset) {
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets (inset, inset, inset, inset);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = 0;
gbc.gridy = GridBagConstraints.RELATIVE;
return gbc;
}
private JPanel controlPanel() {
JPanel cp = new JPanel (new BorderLayout()),
bp = new JPanel (new GridBagLayout()),
tp = new JPanel (new GridBagLayout());
GridBagConstraints gbc = makeGBC (10);
for (int i = 0 ; i < tfNames.length ; i++) {
JLabel label = new JLabel (tfNames[i], JLabel.TRAILING);
tp.add (label, gbc);
}
gbc.gridx++; gbc.weightx = 1.0f;
for (int i = 0 ; i < tfNames.length ; i++) {
gtField[i] = new JTextField(12);
tp.add (gtField[i], gbc);
}
gbc = makeGBC (10);
for (int i = 0 ; i < plusMinus.length ; i++) {
JButton b = new JButton (plusMinus[i]);
bp.add (b, gbc);
gbc.gridx++;
}
cp.add (tp, "Center");
cp.add (bp, "South");
return cp;
}
public static void main (String[] args) {
new GeneDialog (null, "Genes").setVisible (true);
}}
嘗試為JScrollPane
和其中的JList
設置最大寬度。
我只想告訴我,我與javamonkey79有相同的看法。 看一下MigLayout,您會喜歡的,從Java 7開始,它將是標准的Java-onboard布局。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.