Java Swing - JTable没有显示

时间:2012-11-12 12:37:33

标签: java swing jtable jpanel flowlayout

我在使用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);
}

2 个答案:

答案 0 :(得分:5)

  

如果我删除顶部的controlPanel,它有时会显示和   有时不会。

  • 所有内容都隐藏在Server.getSongTableModel()中,没有人知道没有发布带有来自

  • 的硬编码值的SSCCE
  • GUI存在Concurency in Swing

  • 的问题
  • XxxModel持续加载数据并构建GUi,然后异常导致描述问题

  

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

  • 不知道你在谈论什么

  • 必须创建一个空GUI,请参阅InitialTread

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

  • 然后从SwingWorker或(descr。网络问题)开始工作线程(Backgroung任务)更好Runnable#Thread(用于捕获异常并处理单独的线程很容易)

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

答案 1 :(得分:5)

如果您希望控件位于窗口顶部,并且表格填满了大部分窗口,那么我建议您尝试使用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,因为我发现其他LayoutManager更适合大多数情况。