【问题标题】:java Swing best way to place panels within framejava Swing将面板放置在框架内的最佳方法
【发布时间】:2013-08-22 06:51:35
【问题描述】:

我有 3 个面板,panel1 有 3 个组件(添加、删除、编辑)JButtons,panel2(scrollPane)有 jtable 和 panel3 再次作为(5 JTextFields,5JLabels)。当我将所有面板添加到框架中时,panel3 组件仅显示部分显示(4JTextFields)仅在框架内可见。对于面板,我将 BorderLayout 用于 frame.add(panel2,BorderLayout.SOUTH) , frame.add(panel3,BorderLayout.CENTER); panel1, panel2 显示所有组件,但 panel3 仅显示部分。您能否准确地建议我应该使用哪种布局,用于面板,以及如何为我的框架设置大小以容纳所有面板(组件)?清楚吗?

`

          frame.add(topPanel, BorderLayout.NORTH);
        frame.add(updatePanel, BorderLayout.SOUTH);
        frame.add(middlePanel, BorderLayout.CENTER);

        frame.setVisible(true); 
        frame.setSize(850, 500);

`

【问题讨论】:

  • JFrame#pack - 另外,SSCCE 会说一千个字...
  • 如何从阅读一个体面的教程开始,f.i.在 swing tag wiki 中引用的那个?
  • 我使用了 frame 的 setsize 方法,所以它部分隐藏了我的面板。一旦我删除了 frame.set Size 方法并使用了 @MadProgrammer 所说的 pack 方法,感谢天才。

标签: java swing jtable panels


【解决方案1】:

尝试使用Window#pack

调整此窗口的大小以适合首选大小和布局 的子组件。结果窗口的宽度和高度是 如果任一尺寸小于 上一次调用 setMinimumSize 指定的最小尺寸 方法。

如果窗口和/或其所有者还不能显示,两者 在计算首选尺寸之前,它们中的一部分是可显示的。 在计算窗口大小后验证窗口。

更新示例

没有SSCCE(工作示例),就不可能完全诊断您的问题。让我演示一下……

所以,根据您的描述,我可以毫无问题地创建它...

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableModel;

public class TestPack {

    public static void main(String[] args) {
        new TestPack();
    }

    public TestPack() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TopPanel(), BorderLayout.NORTH);
                frame.add(new MiddlePanel(), BorderLayout.CENTER);
                frame.add(new UpdatePanel(), BorderLayout.SOUTH);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TopPanel extends JPanel {

        public TopPanel() {
            setBackground(Color.red);
            add(new JLabel("I'm on top"));
        }

    }

    public class MiddlePanel extends JPanel {

        public MiddlePanel() {
            setLayout(new BorderLayout());
            add(new JScrollPane(new JTable(new DefaultTableModel(new Object[]{"A", "B", "C"}, 5))));
        }

    }

    public class UpdatePanel extends JPanel {

        public UpdatePanel() {
            for (int index = 0; index < 5; index++) {
                add(new JLabel(Integer.toString(index)));
                add(new JTextField(5));
            }
            add(new JButton("Button"));
        }            
    }        
}

但显然,您正在做一些不同的事情。花点时间用一个可行的例子来更新你的问题,否则我们无能为力了

【讨论】:

  • “请为您的答案提供代码” 在您发表评论前 3 小时,@MadProgrammer 建议您发布代码(SSCCE)来解释问题。您忽略了这一点,但期望答案中有代码?!? -1
  • frame.add(topPanel, BorderLayout.NORTH); frame.add(updatePanel, BorderLayout.SOUTH); frame.add(middlePanel, BorderLayout.CENTER);我的 updatePanel 完全看不到极客。
  • 什么是topPanelupdatePanelmiddlePanel?如果没有可运行的示例来演示您的问题,我可能无法诊断您的问题 - 最可能的原因 - null 布局或覆盖 getPreferredSize 的一个或多个组件...
  • 之前我提到过 tat updatePanel 有 5 个 Jtextfields、5 个 Jlabel、1 个 jbutton。 middlePanel 显示我的 jtable。我的两个面板完美地展示了组件。我的最后一个面板,即 updatePanel 是部分可见的。加载框架时按钮不可见。 frame.pack() 也没有帮助。它没有改变任何旧的输出。
  • updatePanel 使用什么布局管理器?如果你能提供一个SSCCE 会更容易,或者我们可以像这样来回走动一段时间......
猜你喜欢
  • 2017-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-23
  • 2015-02-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多