Java Swing-JTable未显示
我在Java Swing方面遇到了一些问题。 我想做一个框架,上面有一个控制面板,里面有一些按钮。 下面我想展示一个JTable 我一直在试,但是桌子没有显示出来。 如果我移除顶部的控制面板,它有时会显示,有时不会显示。 我在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
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连续加载数据,然后异常导致所述问题
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,然后开始将数据加载到
- 然后从
或(描述网络问题)启动Workers线程(后台任务),更好地SwingWorker
(便于捕获异常和处理单独的线程)Runnable#Thread
- 从
到Swing GUI的输出必须包装到Runnable
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更适合大多数情况。要更快获得更好的帮助,请发布一个。