0
//GUI.java
public class GUI extends JFrame implements ActionListener {

    private static final long serialVersionUID = 870343916997182570L;
    private JPanel btmPanel;

    public GUI(String arg0) throws HeadlessException {
        super(arg0);
        createGUI();
    }

    private void createGUI() {
        setSize(WIDTH, HEIGHT);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new BorderLayout());

        //ResultPanel rslt = new ResultPanel();
        //this.getContentPane().add(rslt.createPanel(), BorderLayout.CENTER);

        btmPanel = new JPanel();
        btmPanel.setBackground(Color.LIGHT_GRAY);
        btmPanel.setLayout(new FlowLayout());

        JButton blueSearch = new JButton("Search");
        blueSearch.setBackground(Color.WHITE);
        blueSearch.addActionListener(this);
        btmPanel.add(blueSearch);

        JButton blackChart = new JButton("Chart");
        blackChart.setBackground(Color.WHITE);
        blackChart.addActionListener(this);
        btmPanel.add(blackChart);

        this.getContentPane().add(btmPanel, BorderLayout.SOUTH);    
    }   

    @Override
    public void actionPerformed(ActionEvent e) {
        String buttonString = e.getActionCommand();

        if (buttonString.equals("Search")) {
            ResultPanel rslt = new ResultPanel();
            this.getContentPane().add(rslt.createPanel(), BorderLayout.CENTER);
        }
    }

}

//ResultPanel.java
public class ResultPanel extends JPanel implements ActionListener {

    private static final long serialVersionUID = -7851502165390304971L;
    private JPanel textPanel;
    private JTextArea textDisplay;

    public ResultPanel() {
        textPanel = new JPanel(); 
        textDisplay = new JTextArea("Text Area:");
    }

    public JPanel createPanel() {

        textDisplay.setEditable(true);
        textPanel.setBackground(Color.LIGHT_GRAY);
        textPanel.setLayout(new BorderLayout());
        textPanel.add(textDisplay,BorderLayout.CENTER);

        return textPanel;
    }

    @Override
    public void actionPerformed(ActionEvent e) {


    }

}

メインフレームに2つのボタンがあり、ボタンを押したときにパネルを変更したいと思っています。

問題は、「actionPerformed」のコードが機能しないことです。

しかし、それらをcreatGUI()....に入れるとうまく機能します(マークされたセクションを参照)。

それは何か問題がありますか?

4

4 に答える 4

2

実行時にコンポーネントを追加した後、JFrame呼び出して変更を表示する必要がありrevalidate()ますrepaint()

あなたが言ったように、それらを の中に追加している場合はcreateGUI()、そのように表示されますが、その時点では Swing アプリケーションへの静的な追加であるため、最初に追加してから表示に設定します。

あなたのコードには抜け穴が少しありますが、私がすぐに言える最善のことは、 を使用したことはありませんが、 を拡張していることJPanelです。ここで、あなたの例からこの修正されたコードを試してください:ResultPanelResultPanelResultPanel

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class AddComponentExample
{
    private JFrame frame;
    private JPanel btmPanel;
    private ResultPanel resultPanel;

    public AddComponentExample()
    {
        resultPanel = new ResultPanel();
    }

    private void display()
    {
        frame = new JFrame("Adding Component Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        btmPanel = new JPanel();
        btmPanel.setBackground(Color.LIGHT_GRAY);
        btmPanel.setLayout(new FlowLayout());

        JButton blueSearch = new JButton("Search");
        blueSearch.setBackground(Color.WHITE);
        blueSearch.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent ae)
            {
                if (!resultPanel.isShowing())
                {
                    resultPanel = resultPanel.createPanel();
                    frame.getContentPane().add(resultPanel, BorderLayout.CENTER);
                    frame.revalidate();  // For Java 7 and above.
                    // frame.getContentPane().revalidate(); // For Java 1.6 or below.
                    frame.repaint(); // required sometimes
                }
                else
                    System.out.println("Panel is already Visible");
            }
        });
        btmPanel.add(blueSearch);

        JButton blackChart = new JButton("Chart");
        blackChart.setBackground(Color.WHITE);
        //blackChart.addActionListener(this);
        btmPanel.add(blackChart);

        frame.getContentPane().add(btmPanel, BorderLayout.PAGE_END);
        frame.setSize(500, 500);
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new AddComponentExample().display();
            }
        });
    }
}

class ResultPanel extends JPanel implements ActionListener {

    private static final long serialVersionUID = -7851502165390304971L;
    private JPanel textPanel;
    private JTextArea textDisplay;

    public ResultPanel() {
        textPanel = new JPanel(); 
        textDisplay = new JTextArea("Text Area:");
    }

    public ResultPanel createPanel() {

        textDisplay.setEditable(true);
        textPanel.setBackground(Color.LIGHT_GRAY);
        textPanel.setLayout(new BorderLayout());
        textPanel.add(textDisplay,BorderLayout.CENTER);
        add(textPanel);
        return this;
    }

    @Override
    public void actionPerformed(ActionEvent e) {


    }

}
于 2012-05-20T07:14:43.667 に答える
1

pack();パネルを追加した後に呼び出すだけです。これにより、JFrame が更新を表示します。

    if (buttonString.equals("Search")) {
        ResultPanel rslt = new ResultPanel();
        this.getContentPane().add(rslt.createPanel(), BorderLayout.CENTER);
        pack();
    }
于 2012-05-20T07:13:06.013 に答える
0

ActionListenerの匿名クラスを使用する

于 2014-07-10T12:00:33.727 に答える