web-dev-qa-db-ja.com

JFrameでJPanelを別のクラスからJPanelに追加する

メインクラスからJFrameを取得して、別のクラスのJPanelを表示できません。すべてがエラーなしでコンパイルされます。

JFrameTest.Java:

package jframetest;

import Java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class JFrameTest extends JFrame {

    public JFrameTest() {

        FlowLayout mainLayout = new FlowLayout();
        setSize(320, 480);
        setResizable(false);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(mainLayout);

        JPanel panelMain = new JPanel(mainLayout);

        JButton testButton = new JButton("Test12");
        panelMain.add(testButton);

        JPanelOne panel = new JPanelOne();
        panelMain.add(panel);
        panel.setVisible(true);
        add(panelMain);



    }

    public static void main(String[] arguments) {

        JFrameTest frame = new JFrameTest();
        frame.setVisible(true);


    }
}

JPanelOne.Java:

package jframetest;

import Java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JPanel;


public class JPanelOne extends JPanel {

    public JPanelOne() {

        FlowLayout layoutPanel = new FlowLayout();
        JPanel panel = new JPanel(layoutPanel);
        JButton button = new JButton("test");
        panel.add(button);
        panel.setVisible(true);

    }

}

異なるJPanelsを独自のクラスに保持することは良い習慣ですか? (例:JFrameにいくつかの同じサイズのJPanelsを含めたい場合--setVisible()をtrue/falseに設定して切り替えます)

[〜#〜]編集[〜#〜]

たくさんのご回答ありがとうございます。了解しました。今私の質問に戻ります:

他のクラスで作成された単一のGUI要素を追加する方法がわかったので、レイアウトマネージャーを使用して要素のいずれか(おそらくJPanel以外のコンテナー内)で要素を整理できるかどうかを知りたいので、それらをレイアウトで編成されたグループ(そのため、他のクラスでJPanel全体を作成することを求めていました)。写真のように:

この例のJPanel(その2番目のクラス)コードは次のようになります。

package jframetest;

import Java.awt.*;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSeparator;
import net.miginfocom.swing.MigLayout;


public class JPanelOne extends JPanel {

    private JPanel panelSettingsMain;
    private JLabel labelChooseLanguage, labelWordsCollection;
    private JButton buttonSelectLanguage, buttonSelectCollection,
            buttonStatistics, buttonPrintingOptions, buttonAddNewWordCollection,
            buttonInterfaceCustomization;
    private JSeparator separatorSettingsOne, separatorSettingsTwo,
            separatorSettingsThree, separatorSettingsFour,
            separatorSettingsFive;
    private Color greenRegular, separatorGreenLight, separatorGreenDark;

    public JPanelOne() {

        // creating settings main panel

        // setting up layout managers
        MigLayout layoutSettingsMain = new MigLayout(
                "insets 3 0 0 0");

        // setting up colors
        greenRegular = new Color(30, 165, 145);
        separatorGreenLight = new Color(190, 240, 220);
        separatorGreenDark = new Color(130, 205, 180);

        panelSettingsMain = new JPanel(layoutSettingsMain);
        panelSettingsMain.setBackground(Color.WHITE);

            // setting up choose language label
            labelChooseLanguage = new JLabel("Choose language:");
            panelSettingsMain.add(labelChooseLanguage,
                    "gapleft 10, gaptop 15, width 200");

            // setting up select language button
            buttonSelectLanguage = new JButton("language");
            buttonSelectLanguage.setForeground(greenRegular);
            buttonSelectLanguage.setFocusPainted(false);
            buttonSelectLanguage.setBorder(null);
            buttonSelectLanguage.setContentAreaFilled(false);
            buttonSelectLanguage.setCursor(new Java.awt.Cursor(
                    Java.awt.Cursor.HAND_CURSOR));
            panelSettingsMain.add(buttonSelectLanguage, "gapbottom 15px, wrap");

            // setting up light separator
            separatorSettingsOne = new JSeparator();
            separatorSettingsOne.setForeground(separatorGreenLight);
            panelSettingsMain.add(separatorSettingsOne,
                    "span 2, width 320, gapbottom 15, wrap");

            // setting up words collection label
            labelWordsCollection = new JLabel("Words collection:");
            panelSettingsMain.add(labelWordsCollection, "gapleft 10");

            // setting up selectcollection button
            buttonSelectCollection = new JButton("collection");
            buttonSelectCollection.setForeground(greenRegular);
            buttonSelectCollection.setFocusPainted(false);
            buttonSelectCollection.setBorder(null);
            buttonSelectCollection.setContentAreaFilled(false);
            buttonSelectCollection.setCursor(new Java.awt.Cursor(
                    Java.awt.Cursor.HAND_CURSOR));
            panelSettingsMain.add(buttonSelectCollection,
                    "gapbottom 15px, wrap");

            // setting up dark separator
            separatorSettingsTwo = new JSeparator();
            separatorSettingsTwo.setForeground(separatorGreenDark);
            panelSettingsMain.add(separatorSettingsTwo,
                    "span 2, width 320, gapbottom 15px, wrap");

            // setting up show statistics button
            buttonStatistics = new JButton("Show statistics");
            buttonStatistics.setForeground(greenRegular);
            buttonStatistics.setFocusPainted(false);
            buttonStatistics.setBorder(null);
            buttonStatistics.setContentAreaFilled(false);
            buttonStatistics.setCursor(new Java.awt.Cursor(
                    Java.awt.Cursor.HAND_CURSOR));
            panelSettingsMain.add(buttonStatistics,
                    "gapleft 10, gapbottom 15px, , wrap");

            // setting up dark separator
            separatorSettingsThree = new JSeparator();
            separatorSettingsThree.setForeground(separatorGreenDark);
            panelSettingsMain.add(separatorSettingsThree,
                    "span 2, width 320, gapbottom 15px, wrap");

            // setting up printing options button
            buttonPrintingOptions = new JButton("Printing options");
            buttonPrintingOptions.setForeground(greenRegular);
            buttonPrintingOptions.setFocusPainted(false);
            buttonPrintingOptions.setBorder(null);
            buttonPrintingOptions.setContentAreaFilled(false);
            buttonPrintingOptions.setCursor(new Java.awt.Cursor(
                    Java.awt.Cursor.HAND_CURSOR));
            panelSettingsMain.add(buttonPrintingOptions,
                    "gapleft 10, gapbottom 15px, wrap");

            // setting up dark separator
            separatorSettingsFour = new JSeparator();
            separatorSettingsFour.setForeground(separatorGreenDark);
            panelSettingsMain.add(separatorSettingsFour,
                    "span 2, width 320, gapbottom 15px, wrap");

            // setting up add new Word collection button
            buttonAddNewWordCollection = new JButton("Add new Word collection");
            buttonAddNewWordCollection.setForeground(greenRegular);
            buttonAddNewWordCollection.setFocusPainted(false);
            buttonAddNewWordCollection.setBorder(null);
            buttonAddNewWordCollection.setContentAreaFilled(false);
            buttonAddNewWordCollection.setCursor(new Java.awt.Cursor(
                    Java.awt.Cursor.HAND_CURSOR));
            panelSettingsMain.add(buttonAddNewWordCollection,
                    "gapleft 10, gapbottom 15px, , wrap");

            // setting up dark separator
            separatorSettingsFive = new JSeparator();
            separatorSettingsFive.setForeground(separatorGreenDark);
            panelSettingsMain.add(separatorSettingsFive,
                    "span 2, width 320, gapbottom 10px, wrap");

            // setting up interface customization button
            buttonInterfaceCustomization = new JButton(
                    "Interface customization");
            buttonInterfaceCustomization.setForeground(greenRegular);
            buttonInterfaceCustomization.setFocusPainted(false);
            buttonInterfaceCustomization.setBorder(null);
            buttonInterfaceCustomization.setContentAreaFilled(false);
            buttonInterfaceCustomization.setCursor(new Java.awt.Cursor(
                    Java.awt.Cursor.HAND_CURSOR));
            panelSettingsMain.add(buttonInterfaceCustomization,
                    "gapleft 10, gapbottom 15px, wrap");

    }

}

JPanels(例では1つ)を表示または非表示に設定して、プログラムGUIをナビゲートすることを考えていました。

  1. それを行うには良い方法ですか?
  2. GUIをいくつかのクラスに分割する必要がありますか、それともすべてを1つにまとめる必要がありますか?私が質問しているのは、コードにGUIの半分しか残っていないため、約400行になるためです(そして、この時点では単に「見る」以外のことはできません)。前にも言ったように、私は初心者であり、これまでに書いたアプリケーションの中で最も長いものの1つです(とにかく、それほど長くはないはずです!)。

[〜#〜]編集[〜#〜]

多分私はそれを考えすぎているので、最終的に大きなGUIクラスを持ち、それらを表示するかどうかを設定することで、さまざまなGUI領域の可視性を制御することは問題ありませんか?

[〜#〜]編集[〜#〜]

私はOracleでCardLayoutチュートリアルを調べましたが、それは私のタスクに適しているようです(外部クラスからのJPanelsの作成を除きますが、問題ありません)。私は最初はそれを誤解し、CardLayoutについてはタブ付きペイン(プロジェクトに実装したくなかった)に関してのみ考えていました。

9
TV.

もう少し助けを借りて(他のサイトのユーザー "Hilek")、私は別のクラスのJPanelをメインクラスに派遣するように指示しました。これがコードです:

JFrameTest.Java:

import Java.awt.Color;
import Java.awt.Dimension;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class JFrameTest extends JFrame {

        private JButton testButton;
        private JPanel panelMain;
        private JPanelOne panel;

        public JFrameTest() {

                // setting up JFrame
                setLayout(null);
                setPreferredSize(new Dimension(420, 90));
                setResizable(false);
                setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                // creating main JPanel (white)
                panelMain = new JPanel();
                panelMain.setBackground(Color.WHITE);
                panelMain.setBounds(0, 0, 420, 90);
                panelMain.setPreferredSize(new Dimension(200, 40));
                add(panelMain);

                // creating JButton in the main JPanel (white)
                testButton = new JButton("Button from main class");
                panelMain.add(testButton);

                // creating new JPanelOne object from JPanelOne class containing black JPanel
                panel = new JPanelOne();

                // adding black JPanel to main JPanel (white)
                panelMain.add(panel);

                pack();

        }

        public static void main(String[] arguments) {

                // creating JFrame object and setting it visible
                JFrameTest frame = new JFrameTest();
                frame.setVisible(true);

        }

}

JPanelOne.Java:

import Java.awt.Color;
import Java.awt.Dimension;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.SwingConstants;

public class JPanelOne extends JPanel
{

        public JPanelOne()
        {
                // setting up black JPanel
                JPanel panel = new JPanel();
                panel.setPreferredSize(new Dimension(220, 40));
                panel.setBackground(Color.BLACK);

                // creating button on external JPanel
                JButton button = new JButton("Button (+JPanel) from external class");

                // adding button to the black JPanel
                panel.add(button);

                // adding blackJPanel
                add(panel);
        }
}

作業例の画面を印刷します。

http://i.stack.imgur.com/qKeBp.jpg

多分誰かがそれが彼らの問題に役立つと思うでしょう。

5
TV.

まず質問に答えるには、JFrameTestコンストラクターで次のようなものを使用して、パネルのインスタンスをフレームに追加する必要があります。

add(new JPanelOne());

ボタンをJPanelOne自体に直接追加する必要もあります。

public class JPanelOne extends JPanel {   

  public JPanelOne() {   
    JButton button = new JButton("test");   
    add(button);   
  }   
}

次に、次のコード行に問題があると思います。

    FlowLayout mainLayout = new FlowLayout(); 
    // snip...
    setLayout(mainLayout); 

    JPanel panelMain = new JPanel(mainLayout); 

各コンテナーには、レイアウトマネージャーの独自のインスタンスが必要です。そうでなければ、GUIは奇妙なことをします:

setLayout(new FlowLayout());
JPanel panelMain = new JPanel(mainLayout);
6
Code-Apprentice

JFrameでsetSize()を呼び出さないでください。代わりに、レイアウトにコンポーネントとGUIの適切なサイズを設定させます。すべてのコンポーネントをGUIに追加したら、JFrameでpack()を呼び出してから、setVisble(true)を呼び出します。ほとんどのレイアウトでは、コンポーネントのサイズよりもコンポーネントのpreferredSizeが重視されることに注意してください。

また、個々のコンポーネントでsetVisible(true)を呼び出す必要はありません(何らかの理由でGUIが起動して実行された後にコンポーネントの可視性を変更する場合を除きます)。また、レイアウトマネージャーの使用についてさらに詳しく知りたい場合は、それらを学習した後は、おそらくFlowLayoutの使用を少なくするでしょう。

編集
最近の編集について:

多分私はそれを考えすぎているので、結局のところ、大きなGUIクラスを用意し、それらを表示するかどうかを設定することで、異なるGUI領域の可視性を制御することは問題ありませんか?

たとえば、標準の計算機を関数電卓に変更したい場合、setVisible(true)を使用して、事前に作成されたJPanelに事前計算ボタンを表示するだけでよい場合があると、これが役立つこともあります。一方、状態の大幅な変更を反映するためにGUIの「ビュー」を交換する場合、たとえば、ワープロが編集モードから印刷モードに変更する場合は、CardLayoutを使用してJPanelsを簡単に交換できます。

問題はJPanelOneクラスにあります。 JPanelを継承しますが、コンストラクターで新しいJPanelを作成してから、ボタンを追加します。代わりにこれを行う場合:

public class JPanelOne extends JPanel {

   public JPanelOne() {
       JButton button = new JButton("test");
       add(button);
   }
}

期待どおりに動作するはずです。

4
aymeric