0

メインの JFrame にパネルを追加してすぐに非表示にするのに問題があり、ボタンが押されたときにのみ表示されます。これが私のコードです。問題が何であるかについての洞察を探しています。また、パネルに追加しようとしているラベルも表示されません。

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package cis2430_a4;


import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JMenuBar;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.GridLayout;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
 *
 * @author Tristan
 */
public class MainWindow extends JFrame implements ActionListener{
    public static final int WIDTH = 600;
    public static final int HEIGHT = 700;

    private JPanel addPanel;

public MainWindow()
{
    super("Day Planner");
    setSize(WIDTH, HEIGHT);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLayout(new BorderLayout());


    JLabel intro1 = new JLabel("Welcome to your Day Planner", JLabel.CENTER);
    add(intro1, BorderLayout.NORTH);

    JLabel intro2 = new JLabel("Please choose an option from the menu bar above.", JLabel.CENTER);
    add(intro2, BorderLayout.CENTER);

    JMenu commands = new JMenu("Commands");

    JMenuItem addOption = new JMenuItem("Add");
    addOption.addActionListener(this);
    commands.add(addOption);

    JMenuItem searchOption = new JMenuItem("Search");
    searchOption.addActionListener(this);
    commands.add(searchOption);

    JMenuBar menuBar = new JMenuBar();
    menuBar.add(commands);
    setJMenuBar(menuBar);

    JButton button = new JButton("Add");
    button.addActionListener(this);
    add(button, BorderLayout.SOUTH);

    //add panel
    addPanel = new JPanel();
    addPanel.setLayout(new BorderLayout());
    addPanel.setSize(600,400);
    addPanel.setBackground(Color.CYAN);
    addPanel.add(new JLabel("add panel"), BorderLayout.CENTER);
    add(addPanel, BorderLayout.CENTER);
    addPanel.setVisible(false);


}

 @Override
 public void actionPerformed(ActionEvent ae)
 {
     /*String menuChoice = ae.getActionCommand();

     if (menuChoice.equals("Add")){
         addPanel.setVisible(true);
     }*/
     add(addPanel);
     //addPanel.setVisible(true);
 }
}
4

3 に答える 3

2

私はあなたの例に問題はありません。

あなたがしたいかもしれません...

1-イベントディスパッチスレッドのコンテキストでUIを起動したことを確認します

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            try {
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
            }

            MainWindow frame = new MainWindow();
            frame.setVisible(true);
        }
    });
}

2-後で電話repaintしてaddPanel.setVisible(true)
みてください3-それがうまくいかない場合は、invalidate後で電話してみてください。addPanel.setVisible(true)repaint

はるかに優れた解決策は、この種の作業にカードレイアウトを使用することです

更新しました

コードを読んでしばらく過ごした後、あなたが心配しているように思われるのは、あなたが「イントロ」ラベルが表示されていないという事実です...

これは簡単に説明できます。内の任意の位置に存在できるコンポーネントは1つだけなBorderLayoutので、追加するとaddPanel、表示されていなくても、ラベルが破壊されますintro2(事実上、コンテナーから削除されます)。

以下は使用例ですCardLayout

public class CardWindow extends JFrame implements ActionListener {

    public static final int WIDTH = 600;
    public static final int HEIGHT = 700;
    private JPanel addPanel;

    private JPanel cardPane;
    private CardLayout cardLayout;
    private final JLabel intro2;

    public CardWindow() {
        super("Day Planner");
        setSize(WIDTH, HEIGHT);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new BorderLayout());

        cardPane = new JPanel((cardLayout = new CardLayout()));
        add(cardPane, BorderLayout.CENTER);


        JLabel intro1 = new JLabel("Welcome to your Day Planner", JLabel.CENTER);
        add(intro1, BorderLayout.NORTH);

        intro2 = new JLabel("Please choose an option from the menu bar above.", JLabel.CENTER);
        cardPane.add(intro2, "intro");

        JMenu commands = new JMenu("Commands");

        JMenuItem addOption = new JMenuItem("Add");
        addOption.addActionListener(this);
        commands.add(addOption);

        JMenuItem searchOption = new JMenuItem("Search");
        searchOption.addActionListener(this);
        commands.add(searchOption);

        JMenuBar menuBar = new JMenuBar();
        menuBar.add(commands);
        setJMenuBar(menuBar);

        JButton button = new JButton("Add");
        button.addActionListener(this);
        add(button, BorderLayout.SOUTH);

        //add panel
        addPanel = new JPanel();
        addPanel.setLayout(new BorderLayout());
        addPanel.setSize(600, 400);
        addPanel.setBackground(Color.CYAN);
        addPanel.add(new JLabel("add panel"), BorderLayout.CENTER);
        addPanel.setVisible(false);
        cardPane.add(addPanel, "Add");

        cardLayout.show(cardPane, "intro");

    }

    @Override
    public void actionPerformed(ActionEvent ae) {
        String menuChoice = ae.getActionCommand();
        System.out.println(menuChoice);
        if (menuChoice.equals("Add")) {
            cardLayout.show(cardPane, "Add");
        }
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                CardWindow frame = new CardWindow();
                frame.setVisible(true);
            }
        });
    }
}
于 2012-12-03T00:09:40.370 に答える
1

フレームにラベルを追加した後にパネルを追加したため、ラベルが表示されています。基本的に、パネルはラベルと重なっています。また、使用できるさまざまなパネルを表示するために

 panel.setVisible(true); //For the panel you want to show and false for others

または、パネルをカードとして作成し、一度に1つずつ表示するCardLayoutを使用できます。

于 2012-12-03T00:00:39.933 に答える
1

コードを少し編集しただけですが、うまくいくようです-

ここに画像の説明を入力

public class MainWindow extends JFrame implements ActionListener{
    public static final int WIDTH = 600;
    public static final int HEIGHT = 700;

    private JPanel addPanel;

    public static void main(String[] args) {
        MainWindow mainWindow = new MainWindow();
        mainWindow.setVisible(true);
    }
public MainWindow()
{
    super("Day Planner");
    setSize(WIDTH, HEIGHT);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLayout(new BorderLayout());


    JLabel intro1 = new JLabel("Welcome to your Day Planner", JLabel.CENTER);
    add(intro1, BorderLayout.NORTH);

    JLabel intro2 = new JLabel("Please choose an option from the menu bar above.", JLabel.CENTER);
    add(intro2, BorderLayout.CENTER);

    JMenu commands = new JMenu("Commands");

    JMenuItem addOption = new JMenuItem("Add");
    addOption.addActionListener(this);
    commands.add(addOption);

    JMenuItem searchOption = new JMenuItem("Search");
    searchOption.addActionListener(this);
    commands.add(searchOption);

    JMenuBar menuBar = new JMenuBar();
    menuBar.add(commands);
    setJMenuBar(menuBar);

    JButton button = new JButton("Add");
    button.addActionListener(this);
    add(button, BorderLayout.SOUTH);

    //add panel
    addPanel = new JPanel();
    addPanel.setLayout(new BorderLayout());
    addPanel.setSize(600,400);
    addPanel.setBackground(Color.CYAN);
    addPanel.add(new JLabel("add panel"), BorderLayout.CENTER);
    add(addPanel, BorderLayout.CENTER);
    addPanel.setVisible(false);


}

 @Override
 public void actionPerformed(ActionEvent ae)
 {
     String menuChoice = ae.getActionCommand();

     if (menuChoice.equals("Add")){
         addPanel.setVisible(true);
     }
     add(addPanel);
     //addPanel.setVisible(true);
 }
}
于 2012-12-03T00:08:31.687 に答える