我在使用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);
}发布于 2012-11-12 20:49:21
如果我删除顶部的controlPanel,它有时显示,有时不显示。
Server.getSongTableModel()中,没有人知道,如果不发布带有从我在JTable的构造函数中使用的代码是在同一个应用程序中提供的,因此不会出现网络错误
SwingWorker启动工作线程(后台任务)或。网络问题)必须包装到invokeLater()中才能获得更好的Runnable#Thread (适用于捕获异常和处理从Runnable到Swing GUI的单独的Runnable发布于 2012-11-12 20:51:04
如果您希望控件位于窗口的顶部,而表格则占据了窗口的大部分,那么我建议您尝试使用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,或者只参阅Visual Guide to Layout Managers的Java教程,以了解您有哪些替代方案以及最适合您的情况。通常,我尽量避免使用FlowLayout,因为我发现在大多数情况下,还有其他更适合的LayoutManager。
https://stackoverflow.com/questions/13343829
复制相似问题