我在Java秋千上遇到了一些麻烦。我正在尝试用其中一些按钮制作一个带有控制面板的框架。在此下,我希望一个可以显示
我一直在尝试,但桌子没有显示。如果我卸下顶部的控制板,则有时会显示,有时不显示。我在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);
}
如果我删除顶部的控制板,则有时会显示和 有时不是。
-
所有内容都隐藏在
Server.getSongTableModel()
中,没有人知道而没有发布带有硬编码值返回的SSCCE, -
gui在Swing
中有同意的问题 xxxmodel用构建GUI不断地加载数据,然后例外引起了描述的问题
我在JTable构造函数中使用的代码提供了 相同的应用程序,因此没有网络错误
-
不知道你在说什么
-
必须创建一个空的GUI,请参阅initialtread
-
显示GUI,然后开始将数据加载到JTable
-
然后从
SwingWorker
或(Descr。Network问题)启动Workers线程(BackGroung Task)更好的Runnable#Thread
(可用于捕获异常和处理单独的线程的融合) -
从
Runnable
输出到秋千GUI必须包裹在invokeLater()
中
如果要在窗口顶部进行控件,并且表填充了大多数窗口的表,那么我建议您尝试使用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)
通常添加按钮,然后将它们添加到网格中的下一个插槽中。
有关更多信息,请阅读有关Gridlayout或Borderlayout的信息,或者只需查看Java教程以获取视觉指南,以进行布局经理,以查看您拥有哪些替代方案和最适合您的情况。通常,我尝试避免FlowLayout
,因为我发现还有其他LayoutManager
S在大多数实例中更适合。