メインクラスから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をナビゲートすることを考えていました。
[〜#〜]編集[〜#〜]
多分私はそれを考えすぎているので、最終的に大きなGUIクラスを持ち、それらを表示するかどうかを設定することで、さまざまなGUI領域の可視性を制御することは問題ありませんか?
[〜#〜]編集[〜#〜]
私はOracleでCardLayoutチュートリアルを調べましたが、それは私のタスクに適しているようです(外部クラスからのJPanelsの作成を除きますが、問題ありません)。私は最初はそれを誤解し、CardLayoutについてはタブ付きペイン(プロジェクトに実装したくなかった)に関してのみ考えていました。
もう少し助けを借りて(他のサイトのユーザー "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
多分誰かがそれが彼らの問題に役立つと思うでしょう。
まず質問に答えるには、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);
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);
}
}
期待どおりに動作するはずです。