9

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);

    }

}

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

編集

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

他のクラスで作成された単一の GUI 要素を追加する方法がわかったので、クラスの 1 つ (おそらく 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(例のようなもの)を表示または非表示に設定して、プログラムGUIをナビゲートすることを考えていました。

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

編集

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

編集

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

4

4 に答える 4

6

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

public class JPanelOne extends JPanel {

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

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

于 2012-08-18T18:43:16.430 に答える
6

最初に質問に答えるために、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);
于 2012-08-18T18:50:17.227 に答える
5

さらに助けを借りて(他のサイトのユーザー「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

たぶん、誰かが自分の問題に役立つと思うでしょう。

于 2012-08-19T10:37:26.333 に答える
4

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

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

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

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

たとえば、標準の電卓を関数電卓に変更したい場合など、setVisible(true) を使用して、事前に計算するボタンで満たされた作成済みの JPanel を単純に表示するとよい場合があると答えます。一方、GUI の「ビュー」を交換して、その状態の大幅な変更 (たとえば、ワード プロセッサが編集モードから印刷モードに変わるなど) を反映させたい場合は、JPanels を簡単に交換して、CardLayout を使用してこれを行うことができます。

于 2012-08-18T18:40:37.747 に答える