2012-11-21 59 views
5

我有一个显示按钮在点击时显示JTable,但该表不可见。 注:当我删除JScrollPane代码工作正常,但没有显示表头,所以任何帮助,请使此代码正常工作而不删除JScrollPanejScrollPane setVisible不起作用

 import java.awt.event.ActionEvent; 
     import java.awt.event.ActionListener; 

     import javax.swing.JButton; 
     import javax.swing.JFrame; 
     import javax.swing.JScrollPane; 
     import javax.swing.JTable; 
     import javax.swing.table.DefaultTableModel; 

     public class Training extends JFrame { 

      public Training() { 

       getContentPane().setLayout(new FlowLayout()); 
       JTable table = new JTable(); 
       table.setModel(new DefaultTableModel(new Object[][] { { "joe", "joe" }, 
         { "mickel", "mickel" }, }, new String[] { "LastName", 
         "FirstName" })); 
       final JScrollPane pane = new JScrollPane(table); 
       pane.setVisible(false); 
       getContentPane().add(pane); 

       JButton btn = new JButton("show"); 
       add(btn); 
       btn.addActionListener(new ActionListener() { 

        @Override 
        public void actionPerformed(ActionEvent e) { 
         // TODO Auto-generated method stub 
         pane.setVisible(true); 
        } 
       }); 
      } 

      public static void main(String[] args) { 
       Training app = new Training(); 
       app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       app.setSize(600, 600); 
       app.setVisible(true); 
      } 
     } 

回答

8

pane.setVisible(true);后增加以下内容:

getContentPane().validate(); 
getContentPane().repaint(); 
+1

预期行为?为什么不'pane.setVisible(true);'单独足够? –

5

有几件事情需要注意:

  • 决不延伸JFrame类,否则你可能需要扩展另一个非常必要的类,但是在java中,一个类不能多于一个其他类(不能多重继承)。

  • 总是通过SwingUtilities.invokeLater(Runnable r)块在Event Dispatch Thread上创建Swing组件。

  • 设置JFrame可见

  • 无需getContentPane.add(..)getContentPane().setLayout(..)之前,不要使用电话setSize(..)JFrame#pack(),只需拨打add(..)setLayout(..)JFrame实例作为这些调用fowared到的contentPane

  • 您的问题是您没有刷新设置窗格可见后,您的框架/容器。我不同意@丹。不要使用validate()getContentPane()也不会被necesarry),而:

    revalidate(); 
    repaint(); 
    

revalidate()涵盖validate()。当新的JComponent被添加到可见组件时,也使用验证,而当从可见组件中删除/添加JComponent时使用revalidate()

下面是代码的一个固定的版本与上述实施:按钮按下

enter image description here

后:

enter image description here

import java.awt.FlowLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.SwingUtilities; 
import javax.swing.table.DefaultTableModel; 

public class Training { 

    private JFrame frame; 

    public Training() { 
     frame = new JFrame(); 
     frame.setLayout(new FlowLayout()); 
     JTable table = new JTable(); 
     table.setModel(new DefaultTableModel(new Object[][]{{"joe", "joe"}, 
        {"mickel", "mickel"},}, new String[]{"LastName", 
        "FirstName"})); 
     final JScrollPane pane = new JScrollPane(table); 
     pane.setVisible(false); 
     frame.add(pane); 

     JButton btn = new JButton("show"); 
     frame.add(btn); 

     btn.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       pane.setVisible(true); 

       frame.pack();//this is so the frame will resize after adding pane 
       frame.revalidate(); 
       frame.repaint(); 
      } 
     }); 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new Training(); 
      } 
     }); 
    } 
} 

UPDATE:

也为更可重复使用Layout,为什么不将所有组件添加到JPanel,并将JPanel添加到JFrame,因此,如果您需要添加更多的东西它的简单。

+2

+1对于'很少注意事项:'和图片输出与描述 – exexzian