Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Swing-JTable未显示_Java_Swing_Jtable_Jpanel_Flowlayout - Fatal编程技术网

Java Swing-JTable未显示

Java Swing-JTable未显示,java,swing,jtable,jpanel,flowlayout,Java,Swing,Jtable,Jpanel,Flowlayout,我在Java Swing方面遇到了一些问题。 我想做一个框架,上面有一个控制面板,里面有一些按钮。 下面我想展示一个JTable 我一直在试,但是桌子没有显示出来。 如果我移除顶部的控制面板,它有时会显示,有时不会显示。 我在JTable的构造函数中使用的代码在同一个应用程序中提供, 所以这不是网络错误 public ServerMainFrame(GuiController gc){ this.gc = gc; initGUI(); } private void initGU

我在Java Swing方面遇到了一些问题。 我想做一个框架,上面有一个控制面板,里面有一些按钮。 下面我想展示一个JTable

我一直在试,但是桌子没有显示出来。 如果我移除顶部的控制面板,它有时会显示,有时不会显示。 我在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);
}
如果我拆下顶部的控制面板,它有时会显示和 有时候不是

  • 所有内容都隐藏在服务器.getSongTableModel()中,如果不发布一个从服务器返回的硬编码值,没有人会知道

  • GUI与

  • XxxModel使用构建GUi连续加载数据,然后异常导致所述问题

中提供了我在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);
}
  • 不知道你在说什么

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

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

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

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


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

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

private void addContentPanel()
{
    mainPanel = new JPanel(new BorderLayout());
    mainPanel.setSize(new Dimension(800, 600));
    this.setContentPane(mainPanel);
}
并通过在
边框布局中指定位置来添加组件。在这种情况下,控件应以其最小大小添加到顶部

this.getContentPane().add(controlPanel,BorderLayout.NORTH);
桌子应该在中间,填满剩余的窗口空间

this.getContentPane().add(tablePanel,BorderLayout.CENTER);
在你的情况下,你也有一个按钮在底部

getContentPane().add(btnMulticastList,BorderLayout.SOUTH);
对于您所追求的布局,
BorderLayout
更合适。在这里使用
BorderLayout
的好处是,组件应自动调整大小以适应窗口的大小,并且您要明确说明每个组件所在的位置,因此面板不应出现

我还建议您在所有方法中找到调用
getContentPane()
的替代方法。也许考虑为主面板保留一个全局变量,比如……/P>
private void addContentPanel()
{
    JPanel p = new JPanel();
    p.setLayout(new BorderLayout());
    p.setSize(new Dimension(800, 600));
    this.setContentPane(p);
}
private mainPanel;

private void addContentPanel()
{
    mainPanel = new JPanel(new BorderLayout());
    mainPanel.setSize(new Dimension(800, 600));
    this.setContentPane(mainPanel);
}
然后,当您想向面板添加组件时,可以直接引用面板

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

JPanel controlPanel = new JPanel(new GridLayout(5,1));
然后您只需使用
controlPanel.add(button)
添加按钮,它们将被添加到网格中的下一个插槽中


有关更多信息,请阅读或,或者只看Java教程,了解您有哪些备选方案,以及最适合您的情况。一般来说,我尽量避免使用
FlowLayout
,因为我发现还有其他
LayoutManager
s更适合大多数情况。

要更快获得更好的帮助,请发布一个。