Java GUI,根据 actionListener 更改面板
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/13562372/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Java GUI, Change Panel according to actionListener
提问by vijay
I have two buttons added in two different panels, if first button is clicked then it need to take to next panel with the second button in it. But the button was not replaced when I click first button.
我在两个不同的面板中添加了两个按钮,如果单击第一个按钮,则需要使用第二个按钮进入下一个面板。但是当我点击第一个按钮时按钮没有被替换。
/*Java GUI*/
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class TestFrame extends JFrame{
private JPanel panel1, panel2;
private JButton but,but2;
public TestFrame()
{
createPanel();
addPanel();
}
private void createPanel()
{
panel1 = new JPanel();
but = new JButton("TestButton");
but.addActionListener(new addButtonListener());
panel2 = new JPanel();
but2 = new JButton("TestButton2");
}
private void addPanel()
{
panel1.add(but);
panel2.add(but2);
add(panel1);
}
class addButtonListener implements ActionListener
{
public void actionPerformed(ActionEvent ae)
{
getContentPane().removeAll();
add(panel2);
repaint();
}
}
public static void main(String args[])
{
JFrame frame = new TestFrame();
frame.setTitle("Test Software");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500,500);
frame.setVisible(true);
}
}
采纳答案by Pingwin Tux
After remowing all from contentPane, try add panel to ContentPane. Second thing is repainting. If you will not update panel content, it will be painted after resize. Here you are example solution:
从 contentPane 中删除所有内容后,尝试将面板添加到 ContentPane。第二件事是重新粉刷。如果您不更新面板内容,它会在调整大小后进行绘制。这是示例解决方案:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class Frame extends JFrame{
private JPanel panel1, panel2;
private JButton but,but2;
public Frame()
{
createPanel();
addPanel();
}
private void createPanel()
{
panel1 = new JPanel();
but = new JButton("TestButton");
but.addActionListener(new addButtonListener());
but.setBounds(50, 90, 190, 30);//There are example values but remember about setting size
panel2 = new JPanel();
but2 = new JButton("TestButton2");
but2.setBounds(50, 50, 90, 30);//There are example values but remember about setting size
}
private void addPanel()
{
panel1.add(but);
panel2.add(but2);
add(panel1);
}
class addButtonListener implements ActionListener
{
public void actionPerformed(ActionEvent ae)
{
getContentPane().removeAll();
getContentPane().add(panel2);//Adding to content pane, not to Frame
repaint();
printAll(getGraphics());//Extort print all content
}
}
public static void main(String args[])
{
Frame frame = new Frame();
frame.setTitle("Test Software");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500,500);
frame.setVisible(true);
}
}
Oracle docs explains difference beetwen adding to contentPane or to Frame directly.
http://docs.oracle.com/javase/tutorial/uiswing/components/toplevel.html
Oracle 文档解释了添加到 contentPane 或直接添加到 Frame 的区别。
http://docs.oracle.com/javase/tutorial/uiswing/components/toplevel.html
回答by Dan D.
You need to do validation and then repaint.
您需要进行验证,然后重新绘制。
validate();
repaint();