【问题标题】:Java Swing - JTable not showingJava Swing - JTable 未显示
【发布时间】:2012-10-31 21:12:16
【问题描述】:

我在使用 Java Swing 时遇到了一些问题。 我正在尝试制作一个顶部带有控制面板的框架,其中包含一些按钮。 在此之下,我希望显示一个 JTable

我一直在尝试,但表格没有显示。 如果我删除顶部的 controlPanel,它有时会显示,有时不会。 我在 JTable 的构造函数中使用的代码在同一个应用程序中提供, 所以不是网络错误

public ServerMainFrame(GuiController gc){
    this.gc = gc;
    initGUI();
}

private void initGUI() {
    System.out.println("initiating GUI");
    createFrame();
    addContentPanel();
    addControls();
    //openPopUpServerSettings();
    addSongTable();
}

private void createFrame()
{
    this.setTitle("AudioBuddy 0.1");
    this.setVisible(true);
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    this.setSize(800, 600);
    this.setResizable(false);
    this.setLocationRelativeTo(null);
}

private void addContentPanel()
{
    JPanel p = new JPanel();
    p.setLayout(new FlowLayout());
    p.setSize(new Dimension(800, 600));
    this.setContentPane(p);
}

private void addControls()
{
    JPanel controlPanel = new JPanel();
    controlPanel.setLayout(new FlowLayout());
    controlPanel.setBorder(BorderFactory.createLineBorder(Color.black));
    controlPanel.setSize(700,100);

    // Buttons
    JButton play = new JButton("Play");
    JButton pause = new JButton("Pause");
    JButton stop = new JButton ("Stop");
    JButton next = new JButton("Next");
    JButton prev = new JButton("Previous");     
    controlPanel.add(play);
    controlPanel.add(pause);
    controlPanel.add(stop);
    controlPanel.add(next);
    controlPanel.add(prev);

    // Currently playing
    JLabel playing = new JLabel("Currently playing:");
    controlPanel.add(playing);

    JLabel current = new JLabel("Johnny Cash - Mean as Hell");
    controlPanel.add(current);

    this.getContentPane().add(controlPanel);
}

private void addSongTable()
{
    JTable songTable = new JTable(Server.getSongTableModel());
    songTable.setVisible(true);
    JPanel tablePanel = new JPanel();
    tablePanel.setVisible(true);
    tablePanel.add(songTable);
    songTable.repaint();
    this.getContentPane().add(tablePanel);

    JButton btnMulticastList = new JButton("send list to clients");
    btnMulticastList.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            Server.MulticastPlaylist();
        }
    });

    getContentPane().add(btnMulticastList);
}

【问题讨论】:

  • 如需尽快获得更好的帮助,请发帖SSCCE

标签: java swing jtable jpanel flowlayout


【解决方案1】:

如果我删除顶部的控制面板,它有时会显示和 有时不会。

  • 一切都隐藏在Server.getSongTableModel() 中,如果不发布带有硬编码值返回的SSCCE,没人知道

  • GUI 与 Concurency in Swing 存在问题

  • XxxModel 在构建 GUI 时不断加载数据,然后异常导致描述的问题

我在 JTable 的构造函数中使用的代码在 相同的应用程序,所以它没有网络错误

  • 不知道你在说什么

  • 必须创建一个空的 GUI,参见 InitialTread

  • 显示 GUI,然后开始将数据加载到 JTable

  • 然后从SwingWorker 或(描述网络问题)更好的Runnable#Thread 启动Worker 线程(背景任务)(便于捕获异常和处理单独的线程)

  • Runnable 到 Swing GUI 的输出必须包装到 invokeLater()

【讨论】:

    【解决方案2】:

    如果您希望控件位于窗口顶部,并且表格占据了窗口的大部分,那么我建议您尝试使用BorderLayout 而不是FlowLayout。像这样创建它...

    private void addContentPanel()
    {
        JPanel p = new JPanel();
        p.setLayout(new BorderLayout());
        p.setSize(new Dimension(800, 600));
        this.setContentPane(p);
    }
    

    并通过在BorderLayout 中指定位置来添加组件。在这种情况下,控件应以其最小尺寸添加到顶部...

    this.getContentPane().add(controlPanel,BorderLayout.NORTH);
    

    并且表格应该在中心,填满剩余的窗口空间...

    this.getContentPane().add(tablePanel,BorderLayout.CENTER);
    

    在您的情况下,底部还有一个按钮...

    getContentPane().add(btnMulticastList,BorderLayout.SOUTH);
    

    对于您所追求的布局,BorderLayout 更合适。在此处使用BorderLayout 的好处是组件应自动调整为窗口大小,并且您明确说明每个组件所在的位置,因此面板不应不出现

    我还建议您在所有方法中找到调用getContentPane() 的替代方法。也许考虑为主面板保留一个全局变量,像这样......

    private mainPanel;
    
    private void addContentPanel()
    {
        mainPanel = new JPanel(new BorderLayout());
        mainPanel.setSize(new Dimension(800, 600));
        this.setContentPane(mainPanel);
    }
    

    然后你可以在你想add()组件的时候直接引用面板。

    最后,我还建议您使用GridLayout 作为您的控件,因为它允许您将所有按钮放在其中,并且它们的大小将保持一致。像这样定义它以允许水平对齐的 5 个按钮...

    JPanel controlPanel = new JPanel(new GridLayout(5,1));
    

    然后您只需使用controlPanel.add(button) 正常添加按钮,它们就会被添加到网格中的下一个槽中。

    如需更多信息,请阅读GridLayoutBorderLayout,或查看Visual Guide to Layout Managers 的Java 教程,了解您有哪些替代方案以及最适合您情况的替代方案。一般来说,我尽量避免使用FlowLayout,因为我发现还有其他LayoutManagers 更适合大多数情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-08
      • 1970-01-01
      • 2022-07-12
      • 1970-01-01
      • 2017-07-20
      相关资源
      最近更新 更多