dum*_*azy 3 java swing jtable jpanel flowlayout
我在使用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);
}
Run Code Online (Sandbox Code Playgroud)
如果我删除顶部的controlPanel,它有时显示,有时不显示.
一切都隐藏在Server.getSongTableModel(),没有人知道没有发布带有硬编码值的SSCCE
GUI 在Swing中与Concurency有问题
XxxModel持续加载数据与构建GUi,然后异常导致描述的问题
我在我的JTable的构造函数中使用的代码在同一个应用程序中提供,因此它没有网络错误
不知道你在说什么
必须创建一个空GUI,请参阅InitialTread
显示GUI,然后开始将数据加载到JTable
然后从(SwingWorker或描述网络问题)更好地启动工作线程(Backgroung任务)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);
}
Run Code Online (Sandbox Code Playgroud)
并通过指定位置来添加组件BorderLayout.在这种情况下,控件应以最小尺寸添加到顶部...
this.getContentPane().add(controlPanel,BorderLayout.NORTH);
Run Code Online (Sandbox Code Playgroud)
桌子应该在中间,填充剩余的窗口空间......
this.getContentPane().add(tablePanel,BorderLayout.CENTER);
Run Code Online (Sandbox Code Playgroud)
在你的情况下,你底部还有一个按钮......
getContentPane().add(btnMulticastList,BorderLayout.SOUTH);
Run Code Online (Sandbox Code Playgroud)
对于你想要的布局,BorderLayout更合适.BorderLayout这里使用的好处是组件应该自动调整大小到窗口的大小,并且您明确说明每个组件所在的位置,因此不应出现面板.
我建议您找到一种替代方法来调用getContentPane()所有方法.也许考虑为主面板保留一个全局变量,就像这样......
private mainPanel;
private void addContentPanel()
{
mainPanel = new JPanel(new BorderLayout());
mainPanel.setSize(new Dimension(800, 600));
this.setContentPane(mainPanel);
}
Run Code Online (Sandbox Code Playgroud)
然后,当您想要add()组件时,可以直接引用该面板.
最后,我还建议GridLayout您使用控件,因为它可以让您将所有按钮放在其中,并且它们的大小相同,以保持一致性.像这样定义它允许5个按钮在水平对齐...
JPanel controlPanel = new JPanel(new GridLayout(5,1));
Run Code Online (Sandbox Code Playgroud)
然后你只需添加正常使用的按钮controlPanel.add(button),它们将被添加到网格的下一个插槽中.
有关更多信息,请阅读GridLayout或BorderLayout,或者只查看布局管理器可视指南的Java教程,了解您拥有的替代方案以及适合您情况的最佳方案.一般来说,我试图避免FlowLayout,因为我发现LayoutManager在大多数情况下还有其他更适合的.
| 归档时间: |
|
| 查看次数: |
1346 次 |
| 最近记录: |