首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java Swing -未显示JTable

Java Swing -未显示JTable
EN

Stack Overflow用户
提问于 2012-11-12 20:37:33
回答 2查看 1.4K关注 0票数 3

我在使用Java Swing时遇到了一些问题。我正在试着做一个框架,在顶部有一个控制面板,里面有一些按钮。下面我想要一个JTable来显示

我试过了,但是桌子不显示。如果我删除顶部的controlPanel,它有时显示,有时不显示。我在JTable的构造函数中使用的代码是在同一个应用程序中提供的,因此不会出现网络错误

代码语言:javascript
复制
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);
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-12 20:49:21

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

  • 一切都隐藏在Server.getSongTableModel()中,没有人知道,如果不发布带有从
  • 返回的硬编码值的SSCCE,图形用户界面在构建GUi的过程中不断加载数据会出现问题,然后异常会导致所描述的问题

我在JTable的构造函数中使用的代码是在同一个应用程序中提供的,因此不会出现网络错误

  • 不知道你在说什么
  • 必须创建一个空的图形用户界面,见InitialTread
  • 显示图形用户界面,然后开始加载数据到从SwingWorker启动工作线程(后台任务)或。网络问题)必须包装到invokeLater()中才能获得更好的Runnable#Thread (适用于捕获异常和处理从Runnable到Swing GUI的单独的Runnable
票数 5
EN

Stack Overflow用户

发布于 2012-11-12 20:51:04

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

代码语言:javascript
复制
private void addContentPanel()
{
    JPanel p = new JPanel();
    p.setLayout(new BorderLayout());
    p.setSize(new Dimension(800, 600));
    this.setContentPane(p);
}

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

代码语言:javascript
复制
this.getContentPane().add(controlPanel,BorderLayout.NORTH);

桌子应该在中间,填满剩余的窗口空间...

代码语言:javascript
复制
this.getContentPane().add(tablePanel,BorderLayout.CENTER);

在你的例子中,你在底部还有一个按钮...

代码语言:javascript
复制
getContentPane().add(btnMulticastList,BorderLayout.SOUTH);

对于您想要的布局,BorderLayout要合适得多。在这里使用BorderLayout的好处是,组件应该自动调整到窗口的大小,并且您可以显式地声明每个组件所在的位置,因此面板不应该不出现。

我还建议您找到在所有方法中调用getContentPane()的替代方法。也许可以考虑为主面板保留一个全局变量,如下所示……

代码语言:javascript
复制
private mainPanel;

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

然后,当您想要将组件add()到面板时,可以直接引用面板。

最后,我还建议对你的控件使用GridLayout,因为它可以让你把所有的按钮都放在里面,而且为了保持一致,它们的大小是一样的。将其定义为允许5个按钮水平对齐...

代码语言:javascript
复制
JPanel controlPanel = new JPanel(new GridLayout(5,1));

然后,您只需使用controlPanel.add(button)添加按钮,它们将被添加到网格中的下一个位置。

要了解更多信息,请阅读GridLayoutBorderLayout,或者只参阅Visual Guide to Layout Managers的Java教程,以了解您有哪些替代方案以及最适合您的情况。通常,我尽量避免使用FlowLayout,因为我发现在大多数情况下,还有其他更适合的LayoutManager

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13343829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档