2010-07-21 79 views
2

如何在运行时在Swing程序(Java)中添加和删除组件(JButons,JTextField等),而无需使用NetBeans?我应该使用哪种布局? 我希望用户输入用户名&密码,当他点击提交按钮时,会出现带有新组件(JButtons,JTextField等)的新屏幕,我无法在运行时实现转换。在运行时在Java(Swings)程序中添加并删除JTextField

+1

我碰到的这个问题之前,所有的答案为止似乎对我好;我已经在不同的场景中使用过它们。 – Feanor 2010-07-23 15:15:24

+0

考虑到他特别创建了用户名/密码面板,我不会选择任何涉及将此面板用于其他目的的解决方案。这只是糟糕的设计练习。我可以想到其他情况下可以重复使用一个面板,但不是这个。 – 2010-07-23 15:52:22

回答

3

你想使用两个不同的面板来实现这个结果。使用同一个面板并删除所有第一个组件并添加所有第二个组件并不是一个好主意。

制作一个LoginPanel类,它列出用户名和密码字段,标签和提交按钮。然后,当按下提交按钮时,在登录通过身份验证后,隐藏登录面板并显示一个新的面板,其中包含您希望为下一个屏幕设置的布局。

这种方法使维护两个面板变得更加容易,并且清楚地将它们的布局和功能彼此分开。

您可以使用此代码在现有的面板中心这个新框架:

 
public static void centerFrameOverComponent(JFrame frame, JComponent component) { 
    Window parent = SwingUtilities.getWindowAncestor(component); 

    Rectangle frameRect = frame.getBounds(); 
    Rectangle parentRect = parent.getBounds(); 

    int x = (int) (parentRect.getCenterX() - frameRect.getWidth()/2); 
    int y = (int) (parentRect.getCenterY() - frameRect.getHeight()/2); 

    frame.setLocation(x, y); 
} 
+0

登录后,如果我将一个JFrame的可见性设置为false,然后将另一个JFrame的可见性设置为true,则新的JFrame不会与最后一帧在屏幕上的位置对齐(假定用户通过拖动更改了先前的JFrame的对齐方式您可以给我一个解决方案吗?我应该在JFrame中使用JPanel吗? – Gaurav 2010-07-23 19:10:57

+0

您可以在同一个框架中使用两个面板并将它们交换出来,或者可以打开一个新框架并使用一些附加代码居中: – 2010-07-23 19:30:18

2

,你可以创建thath延伸的JFrame exsample MyFrame一个新的类,以这种方式rapresetns新的窗口,在这个类,你必须在你的ContentPanel所有contolr添加的构造函数....

你可以添加一个jbutton到你的JFrame。

class MyFrame extends JFrame{ 

    private JButton jb= new JButton("hello"); 

    public MyFrame(){ 
     setSize(new Dimension(300,180)); //set the MyFrame size 
     getContentPane().add(jb); //add your Component at ContentPane 
    } 

} 

登录后,你能告诉这样你的新框架:

new MyFrame().setVisible(true); 
+0

如果我将一个JFrame的可见性设置为false,然后设置另一个JFrame的可见性(登录后),则新的JFrame不会与最后一帧在屏幕上的位置对齐(假定用户通过拖动更改了以前的JFrame的对齐方式窗户。你能给我一个解决办法吗? – Gaurav 2010-07-23 18:55:39

3

一种方法是使用CardLayout。您的登录按钮处理程序将检查凭据并使用show()来显示第二个窗格。

附录:为安全起见,请考虑使用JPasswordField作为密码;为方便起见,用于定位框架的参数为setLocationRelativeTo()

+1

我认为show()不推荐使用,应该使用setVisible(true) – 2010-07-23 19:33:16

+0

@Phobia:'CardLayout#show()'不会被弃用。也许你正在考虑'Window#show()':http://download.oracle.com/docs/cd/E17409_01/javase/6/docs/api/java/awt/Window.html – trashgod 2010-07-23 20:32:18

+0

setLocationRelativeTO(null)是非常好的API中心对齐框架,感谢trashgod。 – Gaurav 2010-07-24 06:46:10

3

另一种方法是在您希望隐藏它时在特定组件上调用setVisible(false)

在我一直想添加/删除整个子板的情况下,我使用了以下内容:

panel.remove(subPanel); 
panel.revalidate(); 
panel.repaint(); 

你想打电话,只要你添加/删除组件后两种方法。