我有一个显示按钮,可以在点击时显示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);
}
}
答案 0 :(得分:8)
在pane.setVisible(true);
之后添加以下内容:
getContentPane().validate();
getContentPane().repaint();
答案 1 :(得分:5)
有几点需要注意:
永远不要不必要地扩展JFrame
类,否则你可能需要扩展另一个非常必要的类,但在java中,单个类可能不会扩展多个其他类(没有多重继承)。
始终通过SwingUtilities.invokeLater(Runnable r)
阻止在Event Dispatch Thread上创建Swing组件。
在设置setSize(..)
可见
JFrame#pack()
来电JFrame
无需getContentPane.add(..)
或getContentPane().setLayout(..)
,只需在add(..)
个实例上调用setLayout(..)
或JFrame
,因为这些调用是通过的contentPane
您遇到的问题是,在设置窗格可见后,您不会刷新框架/容器。我不同意@Dan。不要使用validate()
(getContentPane()
也不是必需的)而是:
revalidate();
repaint();
revalidate()
涵盖validate()
。当新的JComponent
被添加到可见组件时也会使用验证,而当从可见组件中删除/添加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();
}
});
}
}
<强>更新强>
另外,对于更可重用的Layout
,为什么不将所有组件添加到JPanel
,并将JPanel
添加到JFrame
,因此如果您需要添加更简单的东西。