JavaSwing:使用布局管理器的问题!

JavaSwing:使用布局管理器的问题!,java,swing,layout-manager,Java,Swing,Layout Manager,我正在手工制作一个JDialog,没有GUI构建器,而且我在做布局时遇到了问题。 我有这个: 我的问题是,我不知道如何告诉JScrollPane中的JList有一个最大宽度,我使用了setSize,setMaximumSize,但没有任何效果!我需要这个列表的宽度是图片大小的一半。 解释布局: 基因信息是一个网格布局2x4,它包含在一个带有BoxLayout的JPanel中,+/-JButtons也是一个BoxLayout,我之前所说的都在一个BoxLayout中。 现在,基因JPanel是一个

我正在手工制作一个JDialog,没有GUI构建器,而且我在做布局时遇到了问题。 我有这个: 我的问题是,我不知道如何告诉JScrollPane中的JList有一个最大宽度,我使用了setSize,setMaximumSize,但没有任何效果!我需要这个列表的宽度是图片大小的一半。 解释布局: 基因信息是一个网格布局2x4,它包含在一个带有BoxLayout的JPanel中,+/-JButtons也是一个BoxLayout,我之前所说的都在一个BoxLayout中。 现在,基因JPanel是一个网格布局。 我能做什么? 提前谢谢! PD:其他边界仅用于指定组件的边界

源代码:

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();

如果看不到这里的所有代码,就不可能告诉您出了什么问题。如果你有时间,我建议你看一看。您可以将它与Swing&SWT一起使用,一旦您了解到它是一个非常强大的布局管理器IMHO


希望这有帮助,祝你好运。

如果没有看到这里的所有代码,可能无法告诉你哪里出了问题。如果你有时间,我建议你看一看。您可以将它与Swing&SWT一起使用,一旦您了解到它是一个非常强大的布局管理器IMHO


希望这会有所帮助,祝你好运。

尝试设置JScrollPane和其中的JList的最大宽度。

尝试设置JScrollPane和其中的JList的最大宽度。

我只想告诉你,我与javamonkey79的观点相同。看看MigLayout,你会喜欢它的,从Java 7开始,它将是标准Java板载布局。

我只想告诉你,我和javamonkey79有相同的观点。看看MigLayout,你会喜欢它的,从Java 7开始,它将是标准Java板载布局。

为什么不给Genes面板一个2x1网格布局?这将确保双方的规模相同

但实际上,对我来说,给列表提供控件未占用的所有空间更有意义,因为这些控件需要固定的空间,而列表可能会受益于它可以获得的所有额外空间(如果有广泛的条目)


为此,我会给基因面板一个边界布局,把列表放在中间位置,把控件放在东位置。

为什么不给基因面板一个2x1网格布局?这将确保双方的规模相同

但实际上,对我来说,给列表提供控件未占用的所有空间更有意义,因为这些控件需要固定的空间,而列表可能会受益于它可以获得的所有额外空间(如果有广泛的条目)


为此,我会给Genes面板一个BorderLayout,将列表放在中间位置,将控件放在东部位置。

它没有回答你的问题-但我发现JGoodies FormLayout比GridBagLayout更直观。该库以及一些示例可在此处找到:


它并没有回答你的问题——但我发现JGoodies FormLayout比GridBagLayout更直观。该库以及一些示例可在此处找到:


按照@Michael Borgwardt的建议,让列表增长,您可以使用生成一个方便的初始面板大小。如有必要,您还可以检查返回的维度,该维度计算显示visibleRowCount行所需的视口大小。

根据@Michael Borgwardt的建议,让列表增长,您可以使用生成方便的初始面板大小。如有必要,您还可以检查返回的维度,该维度计算显示visibleRowCount行所需的视口大小。

我认为早期的解决方案都是有效的,它更像是一种编码首选项,用于指定布局管理器。根据您的要求,这里有一个标准的布局管理器,只有网格、网格包和边框。祝你玩得开心

导入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);

}}

我认为早期的解决方案都是有效的,它更多的是一种编码偏好,即使用哪种布局管理器。根据您的要求,这里有一个标准的布局管理器,只有网格、网格包和边框。祝你玩得开心

导入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);

}}

你能把你的GridBagConstraints发布到JList吗?这是完整的代码!谢谢。你能把你的GridBagConstraints发布到JList吗?这是完整的代码!谢谢。维度尺寸=新维度200,Integer.MAX_值;scpGenesList.setSizedim;scpGenesList.setMaximumSizedim;lstGenesList.setSizedim;lstGenesList.setMaximumSizedim@Jaun Diego:也尝试使用setPreferredWidth,并在将JList添加到JScrollPane之前尝试设置其大小。切勿使用大小或首选项
d JList的大小。如果这样做,滚动条将无法正常工作。您可以通过指定滚动窗格的首选大小来提供布局提示。维度dim=新维度200,Integer.MAX_值;scpGenesList.setSizedim;scpGenesList.setMaximumSizedim;lstGenesList.setSizedim;lstGenesList.setMaximumSizedim@Jaun Diego:也尝试使用setPreferredWidth,并在将JList添加到JScrollPane之前尝试设置其大小。切勿使用JList的大小或首选大小。如果这样做,滚动条将无法正常工作。通过指定滚动窗格的首选大小,可以给出布局提示。