jScrollPane setVisible不起作用

HAD*_*DEV 6 java swing jtable jscrollpane

我有一个显示按钮的显示按钮,JTable但表格不可见.注意:当我删除JScrollPane代码工作正常但没有显示表的标题,所以任何帮助请使这个代码正常工作而不删除JScrollPane

        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);
            }
        }
Run Code Online (Sandbox Code Playgroud)

Dan*_* D. 8

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

getContentPane().validate();
getContentPane().repaint();
Run Code Online (Sandbox Code Playgroud)


Dav*_*amp 5

有几点需要注意:

  • 永远不要JFrame不必要地扩展类,否则你可能需要扩展另一个非常必要的类,但在java中,单个类可能不会扩展多个其他类(没有多重继承).

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

  • 在设置可见之前不要使用setSize(..) 呼叫JFrame#pack()JFrame

  • 无需getContentPane.add(..)或者getContentPane().setLayout(..),干脆打电话add(..)setLayout(..)JFrame实例作为这些调用fowared到contentPane中.

  • 您遇到的问题是在设置窗格可见后不刷新框架/容器.我不同意@Dan.不要使用validate()(getContentPane()也不是necesarry):

    revalidate();
    repaint();
    
    Run Code Online (Sandbox Code Playgroud)

作为revalidate()封面validate().当将新JComponents添加到可见组件时也使用validate ,而revalidate()JComponent从可见组件中删除/添加时使用.

以下是上述实现的代码的固定版本:

在此输入图像描述

按下按钮后:

在此输入图像描述

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();
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

更新:

另外,为了更加可重用Layout,为什么不将所有组件添加到a JPanel,并将其添加JPanelJFrame,因此如果您需要添加更多的东西,那么简单.

  • +1表示要注意的事项:`和带描述的图像输出 (2认同)